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