我正在阅读“操作系统概念”中关于信号量的内容(对于那些知道信号量的人来说),我以为我完全理解信号量,直到我读到这篇文章:
信号量的关键方面是它们是原子执行的。我们必须保证没有任何两个进程可以同时在同一个信号量上执行等待和信号操作。
还包括:
如果硬件不提供任何特殊的原子指令,我们可以使用任何软件解决关键部分问题,其中关键部分由等待和信号过程组成。
本文所指的面向Signal和Wait的操作必须是原子的。我认为信号量的全部目的是在任何给定的时间只允许关键部分中的一个进程--如果我必须使用另一种算法(比如烘焙算法),为什么我也需要信号量呢?
我意识到我的问题可能会让人困惑。如果是的话,那只是因为这个话题对我来说还很模糊,所以即使问一个问题也有点难。
会很乐意阅读任何澄清..。
发布于 2012-05-03 18:47:05
我想你在信号量和互斥之间的区别上有困难。二进制信号量可以以与互斥对象相同的方式实现,但它们实际上是出于不同的目的。信号量保护资源,而互斥量严格保护代码块。这种区别往往是微妙的。
有了信号量,您就进入了诸如计数信号量之类的变体,因此,只有一个进程可以访问资源的想法并不总是正确的。您可能希望阻止对一个进程或线程的写入,但允许从多个进程或线程(读取器/写入器锁)读取。
我建议你看看维基百科关于这个主题的文章。其实挺不错的。
http://en.wikipedia.org/wiki/Semaphore_(programming)
发布于 2012-05-03 19:14:30
原子性是实现互斥的方式。假设您一次只想要一个线程进入代码的关键部分。你怎么做到的?你有一个“锁定/解锁”指示器。在线程进入关键的代码部分之前,您强迫线程将指示器从“解锁”更改为“锁定”。
但是,是什么阻止两个线程同时看到指示符是“未锁定的”,同时将其切换到“锁定”,然后同时执行代码的关键部分?答案是,从“未锁定”切换到“锁定”的操作必须是原子操作。也就是说,它必须同时进行,因此两个线程都不可能都成功地将指示符更改为“锁定”。
发布于 2012-05-03 18:46:45
这是在讨论信号量的实现,而不是它们的使用。如果硬件支持像信号量这样的原子操作,则在用户调用Signal/Wait时将使用它们。如果硬件不支持它,信号量实现本身就会找到其他方法来确保相同的功能。
这对用户来说是透明的,只不过在调用Signal和Wait时,没有这种支持的系统将花费更长的时间。(此外,大多数(如果不是所有的话)现代硬件平台都支持信号量的原子操作。)
如果你想要互斥,你用来得到它的机制必须是原子的。
https://stackoverflow.com/questions/10437428
复制相似问题