首页 > 代码库 > 【UNIX】内核对进程的调度机制
【UNIX】内核对进程的调度机制
(调度器)
对于一般进程,CPU的使用时间都是系统平均分配给每一个进程的,因此这种公平分享都从进程的角度出发的。
1) 调度时机:什么情况下,什么时候进行调度
2) 调度的策略:根据什么准则选取下一个进程
3) 调度方式:是“可剥夺”还是“不可剥夺”,当正在运行的进程并不自愿放弃对从CPU 的使用权时,是否强制性的暂时剥夺其使用权,停止其运行而给其他进程一个机会,若 果是可剥夺,是否在任何情况下都可剥夺?
调度时机:
首先,自愿的调度(主动调度)随时都可以进行,在内核里,一个进程可以通过schedule启动一次调度,也就是由当前进程自愿调用schedule暂时放弃运行的情景
除此之外,调度可以是非自愿的,及强制的发生在每次系统调用的前夕,以及每次从中断或者异常处理返回到用户空间的前夕(进程状态切换才会引起的调度)
CPU在内核空间运行时无需考虑前置调度的可能性,但是在内核空间发生中断和异常当然是可能的,但这种中断或者异常不会引起调度。
不管一个CPU是否在内核中发生调度还是多处理器,为所有多进程访问的变量和数据结构,保护起来这是必须的。(使用自旋锁和信号量的机制保护)
“从系统空间返回到用户空间”只是发生调度的必要条件,而非充分条件。也就是说这个条件发生了,也不一定调度,具体是否发生调度还有判断当前进程的task_struct结构体制中need_resched是否为非零,非零才会调用schedule()函数,发生调度
Need_resched成员是内核设置的,因为用户进程访问不到进程的task_strcut。所以除了当前进程通过系统调用自愿让出运行以及在系统调用因某种原因受阻以外,主要是当前唤醒一个进程,以及时钟中断发生,内核会对need_resched成员进行设置(非零),从而发生调度
调度方式
调度发生在回到用户空间的前夕
调度策略
【UNIX】内核对进程的调度机制