为什么禁用中断会在单处理器系统中实现互斥?

时间:2019-03-29 04:10:45

标签: multithreading concurrency operating-system locking

OSTEP的the Locks Chapter的第28.5节表明,禁用中断可实现单处理器系统中线程之间的互斥。我不明白:如果持有锁的线程在关键部分调用了一些系统调用,该怎么办?在这种情况下,它会在释放锁定之前放弃CPU,因此,另一个等待锁定的线程也可能进入临界区。我浏览了本节,但找不到答案。

根据另一个lecture notesInternal events are thread does something to relinquish the CPUPreventing internal events is easy的幻灯片2。然后,幻灯片3通过禁用与​​OSTEP书中的中断相同的方法,说明了相同的锁定实现。

尽管我已经确认确实确实有必要考虑持有锁的线程自行放弃CPU的情况,但我仍然有两个问题:

  1. 为什么以上两个参考文献中的实现都只在忽略内部事件处理时才考虑禁用中断?
  2. 为什么内部事件容易预防?如何实现呢?我想到的唯一解决方案是防止线程在关键部分调用任何系统调用,我认为这太严格了。

有人可以和我分享智慧吗?

2 个答案:

答案 0 :(得分:1)

在单处理器系统上不需要显式锁(例如在互斥锁或自旋锁中)即可在短时间内实现对某事物的独占访问。通过临时禁用中断,您可以停止线程调度程序(因为它是由中断驱动的),因此其他任何线程都无法抢占通过禁用的中断运行的代码。就这么简单。

但是,系统可以提供通过中断以外的方式触发线程调度的机制。说,有一个yield操作就是这样做,它阻止当前线程并取消阻止另一个可以运行的线程。因此,禁用中断以实现互斥/原子访问的代码不得使用任何此类操作,因为它们将破坏互斥访问,甚至使系统死锁(跟随收益,另一个线程可能会无限期禁用中断运行,除非以某种方式重新启用了中断再次在线程切换期间。)

答案 1 :(得分:0)

  

为什么内部事件易于预防?

您引用了一张演讲幻灯片:

  

根据另一个讲义的幻灯片2,内部事件是线程执行某些操作以放弃CPU

“线程放弃了CPU。”例如,线程进行了阻塞的系统调用。您可以通过不编写代码来防止这种情况的发生,而该代码会在关键区域内放弃CPU。