You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《UNIX操作系统设计》第6章问题16:睡眠进程与中断冲突问询

进程睡眠与中断唤醒的竞态问题分析

问题1:试图进入睡眠的进程会出现什么情况?

该进程还未将自身加入事件A的等待队列,因此中断处理程序的唤醒操作无法识别到它。后续进程会继续执行sleep算法的剩余步骤:屏蔽中断、加入事件A的等待队列、进入睡眠状态。但此时针对事件A的唤醒信号已经触发过,这个进程会错过这次唤醒,持续睡眠在事件A上,直到下一次有新的唤醒操作触发——本质是发生了唤醒信号丢失的问题。

问题2:这是危险场景吗?若是,内核应如何避免?

这是典型的竞态危险场景,可能导致进程永久睡眠(无法被及时唤醒),属于严重的内核逻辑错误。

内核的规避方式正是你在书中看到的:sleep算法开头就屏蔽中断。原因在于:

  • 屏蔽中断后,中断处理程序无法在进程完成“加入等待队列”这一关键步骤前执行唤醒操作,确保了进程的睡眠流程和中断唤醒操作的原子性。
  • 从准备睡眠到进入睡眠的完整临界区被中断屏蔽保护后,唤醒操作要么在进程加入等待队列前执行(此时进程还未进入睡眠流程,不会依赖这次唤醒),要么在进程已经加入队列后执行(此时唤醒能正确找到进程并触发唤醒逻辑),从根源上避免了信号丢失的竞态。

内容的提问来源于stack exchange,提问作者Hariharan R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:37:02