【问题标题】:Multiprocessing: why doesn't a single thread just use more cpu?多处理:为什么单个线程不只使用更多的 cpu?
【发布时间】: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


【解决方案1】:

但是如果我们的单线程进程只使用 1% 的 cpu,因此让更多线程运行是有意义的,那么我们为什么不只是(以某种方式?)加速该单进程,以便它使用更多的 cpu并且完成得更快?

我们不知道该怎么做。我们能以多快的速度完成我们尚未完全弄清楚如何解决的事情似乎存在根本的限制。因此,我们一次做不止一件事。

一个女人需要 9 个月才能生一个孩子。所以如果你想要很多孩子,你就会得到很多女人。你不要试图让一个女人走得更快。

假设你想将 7 提高到 2000 万次方,同时将 11 提高到 2000 万次方。这两个操作中的每一个都可以减少步骤数,但您会达到一个限制。假设每个操作需要 N 个连续步骤(每个步骤都需要上一步的输出作为其输入),我们可以做的最快的一步是 Q 纳秒。对于一个线程,执行所有操作至少需要 2NQ 纳秒。使用两个线程,可以同时从两个操作中的每一个执行一步,将时间最小减少到 N*Q 纳秒。

这是一个巨大的胜利。

【讨论】:

  • 哇,这很好地解释了瓶颈!这个例子是纯金的,太好了,应该在课本上。
【解决方案2】:

我可能错了,但是当我们将事物拆分为线程时,我们希望利用 CPU 的多核架构。

我们大多认为 CPU 是一个单元,但您一定听说过 i5 是一个四核处理器,也就是说它有 4 个核心——或者说 4 个核心组成一个 CPU,i3 是一个双核处理器——也就是说,它只有两个核心。

因此,四核的总 CPU 利用率将 100% 分成 4x25。黑白并发和并行性是有区别的。并行意味着每个线程都运行在一个单独的核心上,充分利用它。现在你有 4 个人在做一项工作——或者更好的类比是办公室里有 4 台打印机,4 个人可以继续获取他们想要的副本。这就是并行。

使用相同的类比,让我们将其扩展到只有一台复印机/打印机,并且有 4 个人想要制作副本,我们所做的是使用并发,我们打印每个请求的副本但只打印其中的 25%,然后我们切换到下一个人,然后是下一个,然后是下一个,这将需要 4 次迭代才能打印所有副本。即使我们使用了 100% 的复印机能力,我们的人仍然必须等待——这个等待时间还取决于他们要打印的文档的长度——所以我们使用了类似抢先的东西,你只能在我们开始为下一个人打印之前,执行/打印一段时间。

加速单个进程——为它分配 100% 的 CPU 不是问题[虽然我们想运行一些其他的东西,比如 GUI、播放音乐、系统服务等,但 85% 是可行的],执行当它分布在 CPU 上时,时间变成了 1/4。想象一下,你必须用 4 台复印机打印一本书,这本书有 400 页长——你用 4 台复印机每台打印 100 页。会更快吧?

我希望我有点意思,去睡觉。

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多