【问题标题】:CMU: SemaphoresCMU:信号量
【发布时间】:2011-04-08 15:28:41
【问题描述】:

请检查我对信号量的理解!

我理解计数信号量和二进制信号量背后的想法。然而,用 signal() 和 wait() 实现的自旋锁和信号量之间的区别对我来说是混合在一起的。

例如,自旋锁基本上有两个值(锁定或解锁的二进制真/假)。因此自旋锁基本上是一个二进制信号量,对吗?

当另一个进程在里面时,任何试图进入临界区的进程在它被锁定时将无法进入,并且会旋转并不断检查锁定状态,直到它被解锁,然后能够进入并锁定它。

使用 signal() 和 wait() 函数的信号量本质上是从某种变量中添加或减去值。关于临界区有一个约束。只有当变量具有某种值时才会打开它。消费者进程的一个示例实现是等待(满),然后当它满时执行,最后它发出信号(空)。而生产者进程可能会等待(空)并在空为真时执行,然后在完成时发出信号(满)。

wait() 和本质上在循环中“等待”的自旋锁有什么区别?

【问题讨论】:

  • +1 因为我自己也经常对这些概念感到困惑。
  • 谢谢,这真是一个复杂的话题。我读了很多,感觉读得越多我就越困惑!

标签: semaphore spinlock


【解决方案1】:

与信号量不同,自旋锁可用于无法休眠的代码,例如中断处理程序。

http://www.makelinux.net/ldd3/chp-5-sect-5.shtml

http://www.linuxjournal.com/article/5833

【讨论】:

  • 据我所知,除非它支持抢占式内核,否则不应在单个 CPU 系统中使用自旋锁,如果它没有抢占式内核,则使用自旋锁不是一个好主意。在读取/写入关键部分时,自旋锁应该禁用中断,对吗? // 已编辑
  • @Google 抱歉,我对非抢占式内核了解不多
猜你喜欢
  • 2017-08-24
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多