为什么在单个CPU上需要信号灯?

时间:2019-05-09 00:22:00

标签: semaphore

我已经阅读到我们在linux kerenl内部使用了信号灯,并且我已经阅读到即使在一个CPU中信号灯也具有优势(我们只能运行一个进程/线程)。谁能给我一个信号量解决的问题的示例(在内核内部)?

在我看来,仅当我们有多个cpu时,才会出现问题,因为两个进程可能会调用使用相同数据结构的系统调用,并且很可能会引起问题。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您实际上并不需要多个CPU。多个CPU实际上是“实现细节”,您可以从中提取一些硬件上的古怪之处。并发是程序的逻辑属性。您可以在没有多个CPU的情况下具有并发性,并且可以在没有“真正的并发性”的情况下使用多个CPU。

考虑Web服务器。从某种意义上说,它必须是“并发的”,它必须同时服务多个客户端,一次保存多个连接的信息,并一次处理多个请求。您可以通过让多个CPU都同时工作来做到这一点。但是,该程序只需出现即可一次执行多项操作。它也可以在一个CPU上运行,并进行上下文切换以公平地处理所有工作。网络服务器一次执行多项操作的事实是其界面的一部分:连接的I / O是交错的,如果一个请求专门锁定了一个资源,则另一个请求将不会开始尝试操纵同一资源,等。编写没有并发的Web服务器会生成错误的程序。

信号量通过让您控制进程访问资源的方式来帮助您进行并发。您问,如果有一个进程正在运行,那么只有一个内核如何才能同时运行另一个进程。嗯,正如我所说的,并发不需要 多核。可以暂停第一个过程,然后在第一个过程尚未完成的情况下开始第二个过程。这只是实现细节;从逻辑上讲,对于程序编写者而言,无论是否有多个内核,两个进程都同时运行。如果程序编写时没有信号量(或以其他某种方式破坏了并发性),那么即使在单个内核上也将是错误的。从物理上讲,这是因为上下文切换可以突然暂停一个计算并随时启动另一个计算,并且在没有信号的情况下,新上线的线程将不知道它可以和不能访问哪些资源。从逻辑上讲,这是因为一旦您使自己脱离实现,进程 就会同时运行,并且通常,如果运行不正确,则同时运行的进程可能会彼此遍历。

对于适用于OS内核的示例,请考虑到每个进程在逻辑上都与其他进程同时运行。内核提供了使该并发工作的实现。两个进程可能同时需要的资源是硬盘。内核中可以使用信号量来跟踪给定驱动器当前是否正在忙于读取或写入。尝试读取或写入同一磁盘的进程将要求内核这样做,并且内核可以检查信号量以查看磁盘是否仍在忙,并迫使有问题的进程等待。现在,操作系统 算作低级代码,因此在某些地方,是的,您可能希望在单个CPU上运行时省略一些其他至关重要的并发保护措施,因为您的 job < / em>用于处理此类实现细节,但更高级别的部分可能仍会使用它们。

相反,考虑一个数字运算程序。假设它正在将庞大数据数组的每个元素处理为大小相等的已修改数据数组(功能性map操作)。它可以使用多个CPU来更快地执行此操作,但是它也可以工作一个CPU。程序的可观察行为是相同的,并且您永远不会从程序的行为中得知它正在同时执行多项操作。数字进来,数字出来,谁在乎中间发生了什么?编写无法同时执行多项操作的程序不会产生逻辑上不正确的程序,只是一个缓慢的程序。这样的程序在单个CPU上运行时可能不需要信号量,因为它首先不需要并发。