为什么禁用中断可以在单处理器系统中实现互斥?
Why disabling interrupts achieves mutual exclusion in uni-processor systems?
OSTEP一书the Locks Chapter第28.5节表明,禁用中断实现了单处理器系统中线程间的互斥。我不明白:如果持有锁的线程在临界区调用一些系统调用怎么办?在这种情况下,它在释放锁之前放弃 CPU,因此另一个等待锁的线程也可能进入临界区。我浏览了该部分但找不到答案。
根据另一个 lecture notes、Internal events are thread does something to relinquish the CPU
和 Preventing internal events is easy
的幻灯片 2。然后幻灯片 3 通过禁用中断解释了与 OSTEP 书中相同的锁定实现。
虽然我有点确认确实有必要考虑持有锁的线程自己放弃CPU的情况,但我还有两个问题:
- 为什么上述两个参考文献中的实现都只考虑禁用中断而忽略内部事件处理?
- 为什么内部事件容易预防?如何实现?我想出的唯一解决方案是防止线程在临界区调用任何系统调用,我认为这限制太多。
谁能与我分享智慧?
在单处理器系统上不需要显式锁(如互斥锁或自旋锁)即可在短时间内实现对某些内容的独占访问。通过暂时禁用中断,您可以停止线程调度程序(因为它是中断驱动的),因此没有其他线程能够抢占 运行 禁用中断的代码。就这么简单。
但是,系统可能会提供通过中断以外的方式触发线程调度的机制。比如说,有一个 yield 操作就是这样做的,阻塞当前线程并解除阻塞另一个可以 运行 的线程。因此,禁用中断以实现 exclusive/atomic 访问的代码不得使用任何此类操作,因为它们会破坏独占访问甚至死锁系统(在 yield 之后,另一个线程可能会 运行 禁用中断无限期地除非在线程切换期间以某种方式再次重新启用中断。
why are internal events easy to prevent?
您引用了演讲幻灯片:
According to the Slide 2 of another lecture notes, Internal events are thread does something to relinquish the CPU
"Thread does something to relinquish the CPU." 例如,Thread 进行阻塞系统调用。您可以通过 不编写代码 来防止这种情况发生,该代码会在临界区内放弃 CPU。
OSTEP一书the Locks Chapter第28.5节表明,禁用中断实现了单处理器系统中线程间的互斥。我不明白:如果持有锁的线程在临界区调用一些系统调用怎么办?在这种情况下,它在释放锁之前放弃 CPU,因此另一个等待锁的线程也可能进入临界区。我浏览了该部分但找不到答案。
根据另一个 lecture notes、Internal events are thread does something to relinquish the CPU
和 Preventing internal events is easy
的幻灯片 2。然后幻灯片 3 通过禁用中断解释了与 OSTEP 书中相同的锁定实现。
虽然我有点确认确实有必要考虑持有锁的线程自己放弃CPU的情况,但我还有两个问题:
- 为什么上述两个参考文献中的实现都只考虑禁用中断而忽略内部事件处理?
- 为什么内部事件容易预防?如何实现?我想出的唯一解决方案是防止线程在临界区调用任何系统调用,我认为这限制太多。
谁能与我分享智慧?
在单处理器系统上不需要显式锁(如互斥锁或自旋锁)即可在短时间内实现对某些内容的独占访问。通过暂时禁用中断,您可以停止线程调度程序(因为它是中断驱动的),因此没有其他线程能够抢占 运行 禁用中断的代码。就这么简单。
但是,系统可能会提供通过中断以外的方式触发线程调度的机制。比如说,有一个 yield 操作就是这样做的,阻塞当前线程并解除阻塞另一个可以 运行 的线程。因此,禁用中断以实现 exclusive/atomic 访问的代码不得使用任何此类操作,因为它们会破坏独占访问甚至死锁系统(在 yield 之后,另一个线程可能会 运行 禁用中断无限期地除非在线程切换期间以某种方式再次重新启用中断。
why are internal events easy to prevent?
您引用了演讲幻灯片:
According to the Slide 2 of another lecture notes, Internal events are thread does something to relinquish the CPU
"Thread does something to relinquish the CPU." 例如,Thread 进行阻塞系统调用。您可以通过 不编写代码 来防止这种情况发生,该代码会在临界区内放弃 CPU。