【问题标题】:Two processes on two CPUs -- is it possible that they complete at exactly the same moment?两个 CPU 上的两个进程——它们有可能同时完成吗?
【发布时间】:2011-07-29 13:47:13
【问题描述】:

这是一个奇怪的问题,最近一直困扰着我。在我们现代的多核 CPU 和多线程操作系统世界中,我们可以以真正的硬件并发运行许多进程。假设我同时在两个单独的进程中生成了两个 Program A 实例。忽略可能会改变一个或两个进程的执行时间的操作系统级干扰,这两个进程是否有可能恰好在同一时间完成?是否有任何特定的硬件/操作系统机制可以防止这种情况发生?

现在,在学究们对此进行质问之前,我想澄清一下我对“完全相同的时刻”的定义。我不是在谈论宇宙意义上的时间,只是因为它与计算机的操作有关。所以如果两个进程同时完成,那就意味着他们完成了 时差如此之小,计算机无法分辨。

编辑:“操作系统级干扰”是指中断、解决操作系统可能使用的资源争用的各种技术等。

【问题讨论】:

  • 当您说“这两个进程是否有可能完成”时,您是指进程退出(在操作系统意义上),还是我们在谈论这些进程完成任务?有很大的不同。 (如果是前者,我可能会撤回我的答案)

标签: multithreading operating-system process cpu


【解决方案1】:

实际上,在“cosmic sense”中思考时间是思考time in a distributed system(包括多核系统)的好方法。并非所有系统(或内核)都以完全相同的速率推进其时钟,因此很难真正判断哪些事件首先发生(通过wall clock time)。由于无法达成一致,系统倾向于通过logical clocks 测量时间。如果两个事件不是通过相互共享数据或以其他方式协调它们的执行来排序的,那么它们会同时发生(即“恰好同时”)。

此外,您需要定义进程“退出”的确切时间。在 Linux 中思考,是它在屏幕上打印“退出”消息的时候吗?当它从main() 返回时?当它执行exit() 系统调用时?当它的进程状态在内核中运行设置为“退出”时?进程的父进程何时收到 SIGCHLD?

所以回到你的问题(对“完全同时”有一个精确的定义),这两个过程可以在完全相同的时间结束(或执行任何其他事件)只要没有任何东西协调它们退出(或其他事件)。什么是协调取决于您的架构及其memory model,因此上面列出的一些“退出”条件可能总是在低级别排序或通过操作系统中的同步来排序。

您甚至不需要同时“完全”。有时你可以足够接近似乎并发。即使在没有真正并发的单核上,如果两个子进程在下一次调度其父进程之前退出,则两个进程可能会同时退出。哪个真正先退出并不重要。父母会在它没有运行的瞬间看到,两个孩子都死了。

【讨论】:

    【解决方案2】:

    好吧,我会选择我怀疑

    • 在内部,任何明智的操作系统都会维护一个正在运行的进程列表。
    • 因此,我们将流程完成的时刻定义为从该列表中删除的时刻似乎是明智的。
    • 让我印象深刻的是,典型的操作系统不太可能(但并非不可能)努力构建这个列表,使得两个线程可以独立地从这个列表中删除一个项目完全 em> 同一时间(进程不会那么频繁地终止,从列表中删除一个项目相对便宜 - 我看不出他们不只是锁定整个列表的任何真正原因)。
    • 因此,对于任意两个终止进程 A 和 B(其中 A 在 B 之前终止),总会有相当长的时间段(在宇宙意义上)A 已经终止而 B 没有。

    也就是说当然可以生成这样的列表,因此实际上它取决于操作系统。

    我也不太明白这个问题的意义,特别是你的意思是什么

    计算机无法区分

    为了让 计算机 能够分辨出差异,它必须能够在 A 已终止而 B 未终止的点检查正在运行的进程表 - 如果操作系统计划从中删除进程 B进程表 立即 在进程 A 之后,那么很可能没有这样的代码有机会执行,因此根据某些定义,计算机不可能分辨出差异 - 这种说法成立即使在单核/CPU 处理器上也是如此。

    【讨论】:

    • "为了让计算机能够分辨出差异,它必须能够检查正在运行的进程表" -- 不,这是为了让 操作系统 能够分辨区别。如果您真的关心进程何时完成任务(完成并不意味着进程结束),您需要某种方式来计时完成的瞬间,这几乎可以肯定依赖于时钟 + 时钟同步。一旦你这样做了,每个处理器都可以为自己的完成计时。
    • @Jason 我将“进程”解释为进程的操作系统概念,而不是进程完成的一些任意“处理”。
    【解决方案3】:

    是的,如果它们没有任何资源争用(共享内存、外部 io、系统调用),则它们可以在没有任何操作系统调度干扰的情况下同时完成。当它们中的任何一个锁定资源时,它们将迫使另一个停止等待资源释放。

    【讨论】:

      【解决方案4】:

      因此,如果两个进程同时完成,这意味着它们完成时的时间差非常小,计算机无法分辨。

      当然,为什么不呢?除了共享内存(和其他资源,见下文)外,它们都是独立运行的。

      是否有任何特定的硬件/操作系统机制可以防止这种情况发生?

      任何资源争用:

      • 内存访问
      • 磁盘访问
      • 网络访问
      • 通过锁/信号量/互斥体/等显式并发管理。

      更具体地说:这些是独立的 CPU 内核。这意味着它们具有在单独的逻辑电路中实现的计算电路。来自wikipedia page

      每个核心都可以拥有自己的内存缓存这一事实意味着大多数计算很可能发生在每个核心与其自己的缓存的交互中。一旦你有了它,这只是一个概率问题。这并不是说算法花费的时间不确定,但它们的输入可能来自概率分布,并且运行所需的时间不太可能完全独立于输入数据,除非算法经过精心设计以采用相同的时间。

      【讨论】:

      • 哈哈这是我的问题:为什么不呢?我的假设是这是可能的。对于您的第二部分:当我提到“操作系统级干扰”时,这些就是我的意思。我会在我的 OP 中澄清
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2013-03-04
      相关资源
      最近更新 更多