linux进程调度

1.Linux 进程是抢占式的。被抢占的进程仍然处于 TASK_RUNNING 状态,只是暂时没有被 CPU 运行。
2.进程的抢占发生在进程处于用户态执行阶段,在内核态执行时是不能被抢占的。
3.在 Linux 0.11 中采用了基于优先级排队的调度策略。
4.调度程序schedule() 函数首先扫描任务数组。通过比较每个就绪态( TASK_RUNNING )任务的运行时间递减滴答计数 counter 的值来确定当前哪个进程运行的时间最少。哪一个的值大,就表示运行时间还不长,于是就选中该进程,并使用任务切换宏函数切换到该进程运行。
5.如果此时所有处于 TASK_RUNNING 状态进程的时间片都已经用完,系统就会根据每个进程的优先权值 priority ,对系统中所有进程(包括正在睡眠的进程)重新计算每个任务需要运行的时间片值 counter 。计算的公式是:counter =counter/2 + priority
6.然后 schdeule() 函数重新扫描任务数组中所有处于 TASK_RUNNING 状态,重复上述过程,直到选择出一个进程为止。最后调用 switch_to() 执行实际的进程切换操作。
7.如果此时没有其它进程可运行,系统就会选择进程 0 运行。对于 Linux 0.11 来说,进程 0 会调用 pause()把自己置为可中断的睡眠状态并再次调用 schedule() 。
8.不过在调度进程运行时, schedule() 并不在意进程 0处于什么状态。只要系统空闲就调度进程 0 运行。