分享

进程调度

 guitarhua 2012-01-07

您现在的位置是:主页 > 系统专题 > Linux系统专题 >

4.7.5 进程调度

时间:2010-11-08 20:30   来源:51CTO   收藏  复制分享 共有评论(0)条

点击: 321次

   4.7.5  进程调度

   内核中的调度程序用于选择系统中下一个要运行的进程。这种选择运行机制是多任务操作系统的基础。可以将调度程序看做在所有处于运行状态的进程之间分 配CPU运行时间的管理代码。由前面描述可知,Linux进程是抢占式的,但被抢占的进程仍然处于TASK_RUNNING状态,只是暂时没有被CPU运 行。进程的抢占发生在进程处于用户态执行阶段,在内核态执行时是不能被抢占的。

   为了能让进程有效地使用系统资源,又能使进程有较快的响应时间,就需要对进程的切换调度采用一定的调度策略。在Linux 0.12中采用了基于优先级排队的调度策略。

     1.调度程序

   schedule()函数首先扫描任务数组。通过比较每个就绪态(TASK_RUNNING)任务的运行时间递减滴答计数counter的值来确定 当前哪个进程运行的时间最少。哪一个的值大,就表示运行时间还不长,于是就选中该进程,并使用任务切换宏函数切换到该进程运行。

   如果此时所有处于TASK_RUNNING状态进程的时间片都已经用完,系统就会根据每个进程的优先权值priority,对系统中所有进程(包括正在睡眠的进程)重新计算每个任务需要运行的时间片值counter。计算的公式是:

    这样,正在睡眠的进程被唤醒时就具有较高的时间片counter值。然后schedule()函数重新扫描任务数组中所有处于TASK_RUNNING状态的进程,并重复上述过程,直到选择出一个进程为止。最后调用switch_to()执行实际的进程切换操作。

    如果此时没有其他进程可运行,系统就会选择进程0运行。对于Linux 0.12来说,进程0会调用pause()把自己置为可中断的睡眠状态并再次调用schedule()。不过在调度进程运行时,schedule()并不 在意进程0处于什么状态。只要系统空闲就调度进程0运行。

   2.进程切换

    每当选择出一个新的可运行进程时,schedule()函数就会调用定义在include/asm/system.h中的switch_to()宏 执行实际进程切换操作。该宏会把CPU的当前进程状态(上下文)替换成新进程的状态。在进行切换之前,switch_to()首先检查要切换到的进程是否 就是当前进程,如果是则什么也不做,直接退出;否则,就首先把内核全局变量current置为新任务的指针,然后长跳转到新任务的任务状态段TSS组成的 地址处,造成CPU执行任务切换操作。此时CPU会把其所有寄存器的状态保存到当前任务寄存器TR中TSS段选择符所指向的当前进程任务数据结构的tss 结构中,然后把新任务状态段选择符所指向的新任务数据结构中tss结构中的寄存器信息恢复到CPU中,系统就正式开始运行新切换的任务了。这个过程可参见 图4-37。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多