两个CPU上的两个进程 - 它们可能在完全相同的时刻完成吗?

时间:2011-04-04 23:51:10

标签: multithreading operating-system process cpu

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

现在,在小贩们对此进行烧烤之前,我想澄清一下我对“完全相同的时刻”的定义。我不是在谈论宇宙意义上的时间,只是因为它与计算机的操作有关。因此,如果两个进程同时完成,则表示它们已完成 由于时间差太小,计算机无法区分。

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

4 个答案:

答案 0 :(得分:3)

  

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

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

  

是否有任何特定的硬件/操作系统机制可能会阻止这种情况?

任何资源争用:

  • 内存访问
  • 磁盘访问
  • 网络访问
  • 通过lock / semaphores / mutexes / etc进行显式并发管理。

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

enter image description here

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

好吧,我会选择我怀疑

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

那说 当然可以产生这样的列表,所以实际上它取决于操作系统。

此外,我并不真正理解这个问题的重点,尤其是你的意思

  

计算机无法区分

为了让计算机能够分辨出它必须能够在A终止并且B没有终止的情况下检查正在运行的进程表 - 如果操作系统安排从中删除进程B在进程A之后,进程表立即然后很容易就是没有这样的代码有机会执行,因此通过某些定义,计算机无法区分这种情况 - 这种情况持有即使在单核/ CPU处理器上也是如此。

答案 3 :(得分:0)

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