两个程序的运行时间分别运行,然后一起运行

时间:2011-04-04 19:51:41

标签: 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都在做一个共同的任务,其中两个同时运行可以比单独运行的任务更快地完成所述任务 - 例如垃圾收集器。但我能想到的最好的结果是,它们可能会从硬盘上的同一扇区中加载出来,这有助于它们一起快速运行。

我正在寻找一些我可能错过的东西的一些聪明人的意见。这个位置是针对平台/系统的位置,需要很好地理解硬件/软件和操作系统,以及它们之间的相互作用,这就是为什么[我假设]问的问题。

我还试图想一些可以应用于每个部分的例子,以帮助展示我对现实生活应用问题的了解,但当场我的篇幅很短。

3 个答案:

答案 0 :(得分:20)

他们需要2分钟才能完成

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

如果两个程序都能够并且愿意使除CPU之外的其他资源(例如某些I / O设备)饱和,那么这也可能是观察到的行为。但是,由于在实践中,通常 I / O设备的性能不会随着它们过饱和而应用于它们的负载线性降低,我认为这种情况不太可能并且受CPU限制作为第一个猜测。

他们需要1分钟才能完成

这两个程序不会对相同的资源提出异议,或者系统中有足够的资源来满足两者的需求。因此,他们最终不会互相干扰。

他们需要半分钟才能完成

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

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

因此,在这种情况下的第一个猜测是每个程序都受CPU限制并写入,使得它最多消耗系统中一半的CPU资源。

答案 1 :(得分:13)

对于A,他们是竞争互斥资源的计划。

对于B,他们是独立的程序,并没有真正的互动。

对于你正在努力奋斗的C来说,似乎他们都有相同的工作可供挑选。例如,有一系列任务要做,两个程序都能够完成任务,并且知道已完成的任务。因此,如果它们同时运行(假设多核机器,但即使那时不一定,重要的是它们没有资源瓶颈),它们可以在一半的时间内完成工作。

答案 2 :(得分:0)

请参阅Performance in multithreaded Java application了解当您有多个进程时,进程可以更快运行的另一个可能原因。

虽然我承认可以同时执行的任务队列是一个更简单的理由来解释这种缩短的运行时间。