了解信号量

时间:2012-05-03 18:40:21

标签: semaphore critical-section

我正在阅读“操作系统概念”中的信号量(对于那些知道它的人),我认为我完全理解信号量,直到我读到这段话:

  

信号量的关键方面是它们被执行   原子。我们必须保证没有两个进程可以执行等待   并且同时在同一个信号量上发出信号操作。

还有:

  

如果硬件没有提供任何特殊的原子指令,我们   可以为关键部分使用任何软件解决方案   问题,关键部分包括等待和信号   程序

这段经文指的是SignalWait操作的面必须是原子的。 我认为信号量的全部目的是在任何给定时间只让一个过程进入临界区 - 如果我必须使用另一种算法(如面包店算法),为什么我还需要信号量?

我意识到我的问题可能令人困惑。如果是的话,那只是因为主题对我来说仍然含糊不清,所以即使提问也有点难。

愿意阅读任何澄清......

5 个答案:

答案 0 :(得分:5)

我认为你在信号量和互斥量之间的区别方面遇到了麻烦。二进制信号量可以与互斥量相同的方式实现,但实际上它们用于不同的目的。信号量保护资源,而互斥锁严格保护代码块。区别往往是微妙的。

使用信号量可以进入计算信号量等变量,因此只有一个进程可以访问资源的想法并不总是正确的。您可能希望阻止对一个进程或线程的写入,但允许从多个(读取器/写入器锁定)读取。

我建议你看一下关于这个主题的维基百科文章。这实际上非常好 http://en.wikipedia.org/wiki/Semaphore_(programming)

答案 1 :(得分:3)

Atomicity是您实现互斥的方式。假设您一次只想要一个线程进入关键的代码段。你是怎样做的?好吧,你有一个“锁定/解锁”指标。并且在进入代码的关键部分之前强制线程将指示符从“未锁定”更改为“已锁定”。

但是什么阻止两个线程看到指示器“解锁”,同时将其切换为“锁定”,然后同时执行代码的关键部分?答案是从“解锁”切换到“锁定”的操作必须是原子的。也就是说,它必须一次全部发生,因此两个线程都无法成功将指标更改为“锁定”。

答案 2 :(得分:1)

这是关于信号量的实现,而不是它们的使用。如果硬件支持信号量等原子操作,则在用户调用Signal / Wait时将使用它们。如果硬件不支持它,信号量实现本身将找到其他方法来确保相同的功能。

这对用户是透明的,但在调用SignalWait时,没有此类支持的系统需要更长的时间。 (此外,大多数(如果不是所有)现代硬件平台都支持信号量的原子操作。)

如果你想要互斥,你用来获得它的机制必须是原子的。

答案 3 :(得分:0)

信号量视为夜总会中的保镖。俱乐部一次允许有一定数量的人。如果俱乐部已经满员,则不允许任何人进入,但只要一个人离开另一个人就可以进入。

这只是限制特定资源的消费者数量的一种方法。例如,限制对应用程序中数据库的同时调用次数。

Source:

答案 4 :(得分:-3)

我在课堂上向同学问了同样的问题,他的回答是“把信号量想成一把锤子,一旦你拿到锤子,就可以用它做很多事情,而对硬件的原子支持或互相排斥的软件解决方案,如彼得森或面包店是有限的“。