3

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

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

并且:

如果硬件不提供任何特殊的原子指令,我们可以使用任何软件解决临界区问题,其中临界区由等待和信号过程组成。

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

我意识到我的问题可能令人困惑。如果是,那只是因为主题对我来说还很模糊,所以即使问一个问题也有点困难。

很想阅读任何澄清...

4

5 回答 5

5

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

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

我建议您查看有关该主题的维基百科文章。它实际上非常好。
http://en.wikipedia.org/wiki/Semaphore_(编程)

于 2012-05-03T18:47:05.207 回答
5

原子性是实现互斥的方式。假设您一次只希望一个线程进入代码的关键部分。你是怎样做的?好吧,您有一个“锁定/解锁”指示器。并且您强制线程在进入代码的关键部分之前将指示器从“解锁”更改为“锁定”。

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

于 2012-05-03T19:14:30.373 回答
1

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

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

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

于 2012-05-03T18:46:45.240 回答
0

将信号量想象成夜总会保镖。俱乐部允许有特定数量的人同时进入。如果俱乐部已满,则不允许任何人进入,但一旦一个人离开,另一个人可能会进入。

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

来源:

于 2014-02-15T07:54:35.940 回答
-3

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

于 2013-04-18T18:03:12.463 回答