Linux 系统是一个分时系统,内核给每个进程分一个时间片,该进程的时间片用完就会调度另一个进程执行。LINUX 系统上的调度程序属于多级反馈循环调度。该调度方法是,给一个进程分一个时间片,抢先一个运行超过时间片的进程,并把进程反馈到若干优先级队列中的一个队列。进程在执行完之前,要经过这样多次反馈循环。
进程调度分成两个部分,一个是调度的时机,即什么时候调度;一个是调度的算法,即如何调度和调度哪个进程。我们先来看看调度的算法,假设目前内核要求进行调度,调度程序从“在内存中就绪”和“被抢先”状态的进程中选择一个优先权最高的进程,如果有若干优先权一样高的进程,则在其中选择等待时间最长的进程。切换进程上下文,继续执行该进程。如果没有选择到进程,则不做操作,等待下一次调度时机的到来。
每一个进程都有一个用于调度的优先权域。进程的优先权由低到高粗略地分为用户优先权和内核优先权。每种优先权有若干优先权值(优先数)与其对应。每个优先权都有一个逻辑上与其相连的进程队列。进程从内核状态返回用户状态时被抢先,从而得到用户优先权。进程在内核算法sleep 中得到内核优先权。内核优先权高于用户优先权,即内核优先权和用户优先权之间存在一个阀值,所有用户优先权低于该阀值,而内核优先权高于该阀值。内核优先权中又划分为可中断和不可中断,即进程在收到一个软中断信号时,低内核优先权的进程可被唤醒,而有高内核优先权的进程继续睡眠。
计算一个进程优先权的时机是:内核将一个优先权值赋给一个将进入睡眠的进程,这个优先权值是固定的,且与睡眠原因相联系;另一个时机是,时钟处理程序每隔一定时间(如每隔1 秒)调整用户状态下的所有进程的优先权,并使内核运行调度算法。时钟处理程序还根据一个衰减函数,每秒一次的调整每个进程的最近CPU 使用时间。例如可按如下公式调整:
decay(CPU) = CPU/2;
再根据公式重新计算在“就绪”和“被抢先”状态下的每个进程的优先权值。
Priority = (“recent CPU usage”/constant) + (base priority) + (nice value);
其中constant 是个系统常量(一般取值为“2”)。base priority 值也是系统的一个常量,一般base priority取值为60。最后,nice 的值是由进程发出nice 调用时给出的值,这样就可以使得用户通过降低优先权而让出一些执行时间。只有超级用户才能指定提高优先权的nice 值。
circletiger 于 2012-04-15 19:17:32发表:
慢慢看,细细思。