了解信号量

yot*_*moo 3 semaphore critical-section

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

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

并且:

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

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

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

很想阅读任何澄清......

Luc*_*olt 5

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

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

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


Dav*_*rtz 5

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

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