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的情况,但我仍然有两个问题:
有人可以和我分享智慧吗?
答案 0 :(得分:1)
在单处理器系统上不需要显式锁(例如在互斥锁或自旋锁中)即可在短时间内实现对某事物的独占访问。通过临时禁用中断,您可以停止线程调度程序(因为它是由中断驱动的),因此其他任何线程都无法抢占通过禁用的中断运行的代码。就这么简单。
但是,系统可以提供通过中断以外的方式触发线程调度的机制。说,有一个yield操作就是这样做,它阻止当前线程并取消阻止另一个可以运行的线程。因此,禁用中断以实现互斥/原子访问的代码不得使用任何此类操作,因为它们将破坏互斥访问,甚至使系统死锁(跟随收益,另一个线程可能会无限期禁用中断运行,除非以某种方式重新启用了中断再次在线程切换期间。)
答案 1 :(得分:0)
为什么内部事件易于预防?
您引用了一张演讲幻灯片:
根据另一个讲义的幻灯片2,内部事件是线程执行某些操作以放弃CPU
“线程做放弃了CPU。”例如,线程进行了阻塞的系统调用。您可以通过不编写代码来防止这种情况的发生,而该代码会在关键区域内放弃CPU。