首页 文章

了解信号量

提问于
浏览
3

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

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

并且:

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

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

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

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

5 回答

  • 0

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

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

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

  • -3

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

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

  • 5

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

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

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

  • 3

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

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

    Source:

  • 1

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

相关问题