【发布时间】:2020-06-29 05:28:46
【问题描述】:
我正在学习多处理,它似乎适用于以下两种情况之一:
- 我们的程序正在等待一些 I/O,因此在等待时去做其他事情是有意义的;
- 我们将程序分解,以便它的各个部分可以“并行”运行,以充分利用 cpu
我的困惑是关于第二种情况。我可能只是缺乏对 cpu 真正工作方式的理解:但如果我们的单线程进程只使用 1% 的 cpu,因此让更多线程运行是有意义的,那么我们为什么不干脆(不知何故? ) 加快单个进程,使其使用更多 CPU 并更快完成?
【问题讨论】:
-
在单核 CPU 上,您是对的。但是现代 CPU 拥有不止一个内核。单个线程一次只能在一个内核上运行,但多个线程可以同时使用多个内核。
-
多线程有助于解决您的程序已经使用 100% 的其中一个内核的情况(如果它不等待 I/O 或其他任何东西,它通常会这样做),但其他核心处于空闲状态。如果您可以使用其他内核,您也许可以在更短的时间内完成工作。
-
(我应该说“多核”还应该包括拥有多个 CPU 的可能性,每个 CPU 可能都有多个核,这在服务器上比在消费机器上更常见。)
-
什么原因会导致程序不使用 100% 的内核?
-
当它进行阻塞的系统调用时,要求操作系统在系统调用完成之前不要让线程继续运行。常见的例子是 I/O,等待另一个进程完成(如 Unix 的
wait()),或者像sleep()这样明确要求延迟的东西。或者,操作系统将其调度出来,以便另一个线程可以运行(尽管在这种情况下,内核仍将 100% 使用,只是在线程之间共享)。
标签: multithreading multiprocessing