《UNIX操作系统设计》第6章问题16:睡眠进程与中断冲突问询
进程睡眠与中断唤醒的竞态问题分析
问题1:试图进入睡眠的进程会出现什么情况?
该进程还未将自身加入事件A的等待队列,因此中断处理程序的唤醒操作无法识别到它。后续进程会继续执行sleep算法的剩余步骤:屏蔽中断、加入事件A的等待队列、进入睡眠状态。但此时针对事件A的唤醒信号已经触发过,这个进程会错过这次唤醒,持续睡眠在事件A上,直到下一次有新的唤醒操作触发——本质是发生了唤醒信号丢失的问题。
问题2:这是危险场景吗?若是,内核应如何避免?
这是典型的竞态危险场景,可能导致进程永久睡眠(无法被及时唤醒),属于严重的内核逻辑错误。
内核的规避方式正是你在书中看到的:sleep算法开头就屏蔽中断。原因在于:
- 屏蔽中断后,中断处理程序无法在进程完成“加入等待队列”这一关键步骤前执行唤醒操作,确保了进程的睡眠流程和中断唤醒操作的原子性。
- 从准备睡眠到进入睡眠的完整临界区被中断屏蔽保护后,唤醒操作要么在进程加入等待队列前执行(此时进程还未进入睡眠流程,不会依赖这次唤醒),要么在进程已经加入队列后执行(此时唤醒能正确找到进程并触发唤醒逻辑),从根源上避免了信号丢失的竞态。
内容的提问来源于stack exchange,提问作者Hariharan R
相关产品推荐
相关产品推荐

