我正在阅读高尔文的操作系统概念。在信号量部分,它表示在修改信号量值时必须禁用处理器的所有中断。 为什么需要它?
答案 0 :(得分:1)
信号量值的修改必须以原子方式完成。在单核系统上,这可以通过禁用中断来完成,这样就不会中断更改信号量的读/修改/写操作。
在多核系统上禁用中断是不够的,因此具有多核能力的处理器通常具有原子指令来进行修改。例如,在Intel / AMD处理器上有一个锁定前缀,用于使指令以原子方式执行。
所以高尔文并不完全正确。
答案 1 :(得分:0)
如果在修改信号量值期间允许发生处理器中断,则该值可能最终处于不一致状态。在中断期间,将执行某组指令。原则上,这些指令可以执行与任何执行代码相同的操作。具体来说,中断可能会在其逻辑中使用信号量的值,或者将该值复制到其他位置。如果值处于不一致状态,则可能会破坏代码逻辑。
答案 2 :(得分:0)
禁止中断以防止调度程序取消调度"线程" (执行信号量操作时)执行信号量操作。
答案 3 :(得分:0)
在许多操作系统上,将单元发布到信号量是中断状态支持的少数内核同步操作之一。这意味着来自用户代码的信号量发布或等待调用可能会被中断,然后由来自中断驱动程序的帖子重新输入。必须非常小心信号量状态(等待线程的计数和队列),以确保它保持内部一致并正常运行。这可能涉及短暂地禁用所有中断,以便以安全的方式更新计数,索引和指针。
它不仅仅是原子指令的问题 - 信号量帖子可以使等待线程准备好运行或运行,这意味着将线程控制块从信号量等待队列移动到就绪队列,(可能与优先级提升),抢占运行在另一个核心上的线程而不是处理驱动程序中断的线程,并将先前等待的线程分派到该核心上。
如果允许中断并从中断处理程序重新进入后置/等待操作,这样复杂的操作必须仍能正常工作,因此OS开发人员试图通过禁用所有中断来缓解问题并不奇怪同步处理的关键部分。
答案 4 :(得分:0)
某些系统具有用于此类目的的不间断指令。中断并没有被真正阻止,而是中断在此过程中永远不会发生。
某些系统可以禁用中断组,同时允许其他人继续。
其他系统在修改如上所述的结构时需要阻塞中断。
我还澄清了LOCK前缀(及其在其他系统上的等价物)阻止了另一个处理器执行指令时的修改。