当进程多于内核时会发生什么?
What happens when there are more processes than cores?
我正在研究处理器,印象中可以启动的进程数与计算机的内核数有关,CPU 到 运行 任务分配给每个处理器(然后可以启动 1 个或多个线程,这些线程可以共享此处理能力以实现并发)。您还可以通过 运行 在多个进程上执行多个任务来实现并行性,因为它们有自己的 CPU 它们可以 运行 并行。
这是我的假设,但在查看任务管理器时:
Task Manager CPU
在这种情况下,存在 200 多个进程!
如果我们回到我之前对流程的理解,这意味着什么?我们还能在这里实现并行吗?产生这么多进程的开销与我们从中获得的收益相比是多少?
机器上的进程数 运行ning 可以大于核心数或处理器数。两者之间没有直接的link
进程可以有一个或多个 软件 线程,由操作系统 (OS) 在处理单元上调度。此类处理单元称为 硬件 线程。 1个硬件线程一次只能执行1个线程。 OS 使用抢占所以在同一个硬件线程上执行多个软件线程。更具体地说,每个软件线程都被安排在给定的时间(例如,称为量子,在 Windows 上持续几毫秒)。 OS 在量子时间结束时执行上下文切换,或者如果软件线程执行阻塞操作(例如等待另一个软件线程,读取文件等),或者如果线程具有更高的优先级准备就绪(例如,阻塞操作已准备就绪,如@MartinJames 所述)。确切的算法可以从一个平台改变到另一个平台。对于 Windows,您可以在 Microsoft documentation.
中获得一些相关信息
在大多数处理器内核上有 2 个硬件线程(在 Intel 处理器上,这称为 Hyper-Threading)。这意味着每个内核可以真正并行地执行两个软件线程(尽管它们共享一些硬件资源)。真正可以运行并行的线程数是由硬件线程数定义的。任务管理器将其报告为“逻辑处理器”。 16 个线程可以 运行 在您的机器上并行,但由于抢占,更多线程可以 运行 并发。
请注意,大多数软件线程通常都在等待,因此它们不会被硬件线程上的 OS 调度。 OS 只会在需要时唤醒它们。因此,拥有 200 个进程不是问题,只要它们不主动 运行ning(更准确地说,它们的软件线程)。
请注意,进程未绑定到给定的处理器。一个进程可以有多个线程在多个处理器上执行。
产生一个进程非常昂贵(与软件线程相反)。它通常需要 100 us 到 10 ms(关于 OS、目标机器和附加程序到 运行)。生成软件线程要快得多。它通常不会超过 1 毫秒(但这同样非常依赖于平台)。需要生成多个软件线程才能使用所有可用的 cores/hardware-threads.
我正在研究处理器,印象中可以启动的进程数与计算机的内核数有关,CPU 到 运行 任务分配给每个处理器(然后可以启动 1 个或多个线程,这些线程可以共享此处理能力以实现并发)。您还可以通过 运行 在多个进程上执行多个任务来实现并行性,因为它们有自己的 CPU 它们可以 运行 并行。
这是我的假设,但在查看任务管理器时: Task Manager CPU
在这种情况下,存在 200 多个进程!
如果我们回到我之前对流程的理解,这意味着什么?我们还能在这里实现并行吗?产生这么多进程的开销与我们从中获得的收益相比是多少?
机器上的进程数 运行ning 可以大于核心数或处理器数。两者之间没有直接的link
进程可以有一个或多个 软件 线程,由操作系统 (OS) 在处理单元上调度。此类处理单元称为 硬件 线程。 1个硬件线程一次只能执行1个线程。 OS 使用抢占所以在同一个硬件线程上执行多个软件线程。更具体地说,每个软件线程都被安排在给定的时间(例如,称为量子,在 Windows 上持续几毫秒)。 OS 在量子时间结束时执行上下文切换,或者如果软件线程执行阻塞操作(例如等待另一个软件线程,读取文件等),或者如果线程具有更高的优先级准备就绪(例如,阻塞操作已准备就绪,如@MartinJames 所述)。确切的算法可以从一个平台改变到另一个平台。对于 Windows,您可以在 Microsoft documentation.
中获得一些相关信息在大多数处理器内核上有 2 个硬件线程(在 Intel 处理器上,这称为 Hyper-Threading)。这意味着每个内核可以真正并行地执行两个软件线程(尽管它们共享一些硬件资源)。真正可以运行并行的线程数是由硬件线程数定义的。任务管理器将其报告为“逻辑处理器”。 16 个线程可以 运行 在您的机器上并行,但由于抢占,更多线程可以 运行 并发。
请注意,大多数软件线程通常都在等待,因此它们不会被硬件线程上的 OS 调度。 OS 只会在需要时唤醒它们。因此,拥有 200 个进程不是问题,只要它们不主动 运行ning(更准确地说,它们的软件线程)。
请注意,进程未绑定到给定的处理器。一个进程可以有多个线程在多个处理器上执行。
产生一个进程非常昂贵(与软件线程相反)。它通常需要 100 us 到 10 ms(关于 OS、目标机器和附加程序到 运行)。生成软件线程要快得多。它通常不会超过 1 毫秒(但这同样非常依赖于平台)。需要生成多个软件线程才能使用所有可用的 cores/hardware-threads.