2012-05-03 63 views
3

我阅读有关“操作系统概念”信号灯(对于那些你们谁知道),我想我完全了解信号灯,直到我读到这样一段话:了解信号灯

信号灯的重要方面它们是以原子方式执行 。我们必须保证没有两个进程可以同时执行等待 和对同一信号量的信号操作。

而且也:

如果硬件不提供任何特殊的原子操作,我们 可以使用任何的软件解决方案的关键部分 问题,其中的关键部分包括等待和信号 程序。

这段话是指面对SignalWait的操作必须是原子的。 我认为信号量的全部目的是让任何时候只有一个进程在关键部分 - 如果我必须使用另一种算法(如面包店算法),为什么我还需要信号量?

我意识到我的问题可能会让人困惑。如果是这样,那只是因为这个话题对我来说依然模糊,所以即使提出一个问题也有点困难。

很想读任何澄清...

回答

4

我认为你遇到了信号量和互斥量之间的区别。二进制信号量可以像互斥体一样实现,但它们实际上是为了不同的目的。信号量保护资源,而互斥量严格保护一段代码。区别通常是微妙的。

随着信号量的进入,像计算信号量这样的变化,所以只有一个进程可以访问资源的想法并非总是如此。您可能想要阻止对一个进程或线程的写入,但允许从多个(读取器/写入器锁定)读取。

我建议你看看关于这个主题的维基百科文章。其实相当不错。
http://en.wikipedia.org/wiki/Semaphore_(programming)

1

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

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

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

3

原子性是你如何实现互斥。假设您一次只需要一个线程进入代码的关键部分。你是怎样做的?那么,你有一个“锁定/解锁”指标。并且你强制一个线程在它进入代码的关键部分之前将指示器从“解锁”改变为“锁定”。

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

+1

看看有什么困惑我的是,你建立一个锁,然后您“锁上的锁” ... – yotamoo

-3

我在课堂上向同学提出了同样的问题,他的回答是“把信号量当作锤子,一旦你有了锤子,就可以用它做很多事情,而用原子支持彼此排斥的硬件或软件解决方案(如Peterson或Bakery)受到限制“。

0

信号灯壮汉想想在夜总会。俱乐部一次允许有一定数量的专用人员。如果俱乐部已满,则不允许任何人进场,但一旦有人离开另一人可能进场。

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

Source: