c++ - 两个程序的运行时间分别运行然后一起运行

标签 c++ linux architecture parallel-processing

我最近在一次采访中被问到这个问题,虽然我在前两部分做得很好[我假设]我在第三部分有点挣扎。问题来了:

您有两个 Linux 程序,A 和 B。当单独运行时,A 和 B 在刚刚重新启动的系统上分别需要一分钟才能完成。 [即:新系统:您重新启动它,登录,得到一个 shell 提示符,运行程序。]

如果:

a) 一起跑时,他们需要 2 分钟 b) 一起跑时,他们需要 1 分钟 c) 一起运行时,它们需要 30 秒

我说 a) 如果它们一起运行的时间正好是两倍,它们不共享互斥并且争夺所有相同的资源,可能不共享任何类型的缓存数据或指令 [因此不共享'从缓存的角度来看不能互相帮助]并且每个程序都需要充分利用所述资源才能完成,这样操作系统就无法并行化它们。

对于 b),我说如果他们可以一起跑得一样快,他们可能会共享一些空间/时间局部性,并且可能有助于以这样的方式进行适当的流水线化,即当程序 A 等待时某事,程序 B 可以在这些阶段之间运行,反之亦然 - 有效地在 1 分钟内运行它们。

对于 c),我有点卡住了。回想起来,我可能应该说,也许程序 A 和 B 都在做一个共同的任务,其中两个同时运行可以比一个单独运行更快地完成所述任务 - 例如垃圾收集器。但我能想到的最好的办法是,也许它们从硬盘上的同一个扇区加载,这有助于它们一起快速运行。

我只是想从这里的一些聪明人那里寻找一些关于我可能错过的事情的意见。该职位是一个平台/系统职位,需要对硬件/软件和操作系统有很好的了解,即它们之间的交互,这就是为什么[我假设]这个问题被问到的原因。

我还试图想出可以应用于每个部分的示例,以帮助展示我对实际应用中的问题的了解,但当场我做不到。

最佳答案

他们一起需要 2 分钟才能完成

在这种情况下,我认为每个程序都完全受 CPU 限制,并且可以使机器上 100% 的可用 CPU 饱和。因此,当程序一起运行时,每个程序都以一半的速度运行。

如果两个程序都能够并且愿意使除 CPU 之外的某些其他资源(例如某些 I/O 设备)饱和,这也可能是观察到的行为。但是,由于实际上,通常如果 I/O 设备过饱和,其性能不会随着施加到它们的负载而线性下降,因此我认为这种情况不太可能发生并使用 CPU-bound作为第一个猜测。

他们一起需要 1 分钟才能完成

这两个程序不会争夺相同的资源,或者系统中有足够的资源来满足两者的需求。因此,它们最终不会相互干扰。

他们一起需要半分钟才能完成

这些程序在相同的输入上运行,并且两者都可以判断所有输入何时用完,因此每个程序最终完成的工作是在运行时间的一半时单独启动时完成的工作的一半。此外,该系统显然有能力提供双倍数量的这些程序所限制的资源。

由于在这种情况下,运行时间会随着进程数量(完美缩放)线性减少,因此限制程序的资源似乎更有可能是 CPU,原因与“2 分钟”场景中解释的原因相同。这也很符合“共同输入”假设,因为如果存在例如输入将不太可能来自一个来源。提供它的不同 I/O 设备。

因此,在这种情况下,第一个猜测是每个程序都受 CPU 限制,并且其编写方式最多占用系统中 CPU 资源的一半。

关于c++ - 两个程序的运行时间分别运行然后一起运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5543578/

相关文章:

linux - Bash:想要将一定数量的包含空格的文件移动到不同的目录

architecture - 怎么电路又闭合了?

c++ - 指针在 OpenMP 并行部分中是私有(private)的吗?

c++ - OpenGL:从许多帧缓冲区纹理中读取稀疏像素数据的有效方法?

linux - “三通”设备 : Can i pipe to a FIFO and sample the data when i wish

linux - 如何使用 awk 解析和打印文件中的多行版本号作为一行中的点分隔值

architecture - 为什么没有更多的应用程序用多种语言编写?

php - 数据访问层,最佳实践

c++ - 访问特定类的特定私有(private)成员

c++ - 在 C++ 中运行经过训练的 tensorflow 模型