进程调度机制主要涉及到调度方式、调度策略和调度时机。 1 调度方式 Linux内核的调度方式基本上采用“抢占式优先级”方式,即当进程在用户模式下运行时,不管是否自愿,在一定条件(如时间片用完或等待I/O)下,核心就可以暂时剥夺其运行而调度其他进程进入运行。但是,一旦进程切换到内核模式下运行,就不受以上限制而一直运行下去,直至又回到用户模式之前才会发生进程调度。 Linux系统中进程分为实时进程和非实时进程,它们的优先级由不同方式确定:实时进程的优先级采用静态优先级,即由用户预先指定,以后不会改变;非实时进程的优先级采用动态优先级,它由调度程序计算出来。实时进程的静态优先级通常比非实时进程的动态优先级要高。 2 调度策略 Linux系统提供了三种进程调度策略:SCHED_FIFO、SCHED_RR以及SCHED_OTHER。 SCHED_FIFO适合于实时进程,它们对时间性要求比较强,而每次运行所需要的时间比较短。一旦这种进程被调度开始运行后,就要一直运行直到自愿让出CPU或者被优先权更高的进程抢占其执行权为止,没有时间片概念。 SCHED_RR对应“时间片轮转法”,适合于每次运行需要较长时间的实时进程。 SCHED_OTHER适合于交互式的分时进程。这类非实时进程的优先权取决于两个因素:进程剩余时间配额和进程的优先数nice(优先数越小,其优先级越高)。nice的取值范围是19~-20。 对于实时进程,其优先权的值(1000+设定的正值)至少是1000。实时进程的优先权高于其他类型进程的优先权,另外,时间配额以及nice值与实时进程的优先权无关。如果系统中有实时进程处于就绪状态,则非实时进程就不能被调度运行,直至所有实时进程都完成了,非实时进程才有机会占用CPU。 后台命令(在命令行最后有&符号)对应后台进程(又称后台作业)。后台进程的优先级低于任何交互(前台)进程的优先级。所以,只有当系统中当前不存在可运行的交互进程时,才调度后台进程运行。后台进程往往按批处理方式调度运行。 3 调度时机 核心进行进程调度的时机有以下5种情况: (1)当前进程调用sleep()或者pause(),使自己进入睡眠状态,主动让出一段时间CPU的使用权。 (2)进程终止,永久地放弃对CPU的使用。 (3)在时钟中断处理程序执行过程中,发现当前进程连续运行的时间过长。 (4)当唤醒一个睡眠进程时,发现被唤醒的进程比当前进程更有资格运行。 (5)一个进程通过执行系统调用来改变调度策略或者降低自身的优先权,从而引起立即调度。 调度算法 Linux执行进程调度时,首先查找就绪队列中的所有进程,从中选出优先级最高且在内存的一个进程。如果队列中有实时进程,那么实时进程将优先运行。如果最需要运行的进程不是当前进程,那么当前进程就被挂起,并且保存它的现场,然后为选中的进程恢复运行现场。 (studyarea) |