进程调度

在Intel i386 CPU中,提供了TSS与TR用于任务切换,但是Linux出于效率的考虑自己实现了任务切换。但Linux内核还是使用了TSS,用于完成系统堆栈空间的自动切换(从用户空间进入系统空间时的堆栈切换)。

进程调度与切换

三种不同应用的需求:交互式,批处理,实时

调度政策:内核为系统中的每个进程计算出一个反映其运行“资格”的权值,然后挑选权值最高的进程投入运行。在运行过程中,当前进程的资格随时间而递减,从而在一次调度的时候原来资格较低的进程可能更有资格运行了。到所有进程的资格都变成了0时,就重新计算一次所有进程的资格。资格的计算主要是以优先级为基础的,所以说是以优先级为基础的调度。

TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE的区别是:前一个能被信号唤醒,后一个不能。

对于普通进程的权值计算(goodness函数),取决于nice值与剩下的时间配额。

如果当前就绪队列中的所有进程的权值都为0,则要重新计算所有进程的时间配额。注意是所有进程的时间配额,这样对于不在就绪队列中的进程,提升了其时间配额,进一步提升了其综合权值。

强制性调度

  • 在时钟中断的服务程序中,发现当前进程运行的时间过长。
  • 当唤醒一个睡眠中的进程时,发现被唤醒的进程比当前进程更有资格运行。
  • 一个进程通过系统调用改变调度政策或礼让。这种情况实际上应该被视为主动的、自愿的调度,因此这样的系统调用会引起立即调度。
posted @ 2020-04-30 16:43  r1ng0  阅读(142)  评论(0编辑  收藏  举报