什么是自愿先发制人?我只知道这是一个安排的概念。
答案 0 :(得分:3)
这取决于操作系统。
在某些RTOS中,自愿抢占意味着正在运行的进程声明可以被抢占的点(否则它将一直运行直到完成)。另一种思考这种变体的方法是 coroutine 中的 yield 。这与内核确定抢占的大多数桌面操作系统形成对比。请记住,某些RTOS没有“用户模式”的概念。
在Linux(至少)中,“自愿抢占”是一个用词不当的位:
传统上(没有强制抢占),当用户进程正在进行系统调用时(在内核模式下),它将阻塞直到完成。只有用户模式代码才能被抢占。
抢占式内核使得内核代码本身可以被抢占。这听起来多余,但值得注意的是,我们的意思是内核是可抢占的,而不是“内核支持抢占”。强制/非自愿抢占意味着即使在为系统调用提供服务时,高优先级用户进程的中断也可以“强制”内核进行上下文切换,以便它现在可以运行(从技术上讲,它不是真正的上下文切换,但它具有相同的影响)。这减少了用户进程“看到”硬件状态变化的延迟。
自愿抢占是内核定期检查它是否应该“在执行内核事务时”重新安排进程的地方。也就是说,它不是仅在抢占点上调度/重新安排用户进程,而是在处理诸如I / O之类的事情时定期执行。因此,通常高优先级用户进程可能仍然需要等待低优先级进程才能完成其切片,高优先级进程现在可能会“提前”运行,因为内核正在更频繁地检查它是否要运行。这减少了用户进程从挂起状态转换到运行状态的延迟(以整个系统吞吐量为代价)。