前言
吐嘈抱怨的话不多说了,总之很多笔试题目上都有讲到进程调度,我也只能深入学习一下了
概述
Linux与任何分时系统一样,通过一个进程到另一个进程的快速切换,达到表面上看来多个进程同时执行的神奇效果。我们假定系统采用统一内存访问模型(uniform memory access),而且系统时钟设定为1ms
调度策略
Linux的调度基于分时技术(time-sharing):多个进程以“时间多路复用”方式运行,因为CPU的时间被分为“片”,给每个可运行进程分配一片。当然,单处理器在任何给定的时刻只能运行一个进程。如果当前进程的时间片到期时,该进程还没有运行完毕,进程切换就可以发生。分时依赖于定时中断,因此,对进程是透明的,不需要在程序中插入额外的代码来保证CPU分时。
调度策略也是根据进程的优先级对它们进行分类。有时用复杂的算法求出进程当前的优先级,但最后的结果是相同的:每个进程都与一个值相关联,这个值表示进程如何适当的分配给CPU。
在linux中,进程的优先级是动态的。调度程序跟踪进程正在做什么,并周期性地调整它们的优先级。在这种方式下,在较长的时间间隔内没有使用cpu的进程,通过动态地增加它们的优先级来提升它们。相应的,对于已经在CPU上运行了较长时间的进程,通过减少它们的优先级来处罚它们。
当谈及有关调度问题时,传统上把进程分类为“I/O受限”或“CPU受限”。前者频繁的使用I/O设备,并花费很多时间等待I/O操作完成。而后者需要大量CPU时间的数值计算应用程序。
进程的抢占
Linux的进程是抢占式的。如果进程进入TASK_RUNNING状态,内核检查它的动态优先级是否大于当前正在运行进程的优先级。如果是,current的执行被中断,并调用调度程序选择另一个进程运行(通常是刚刚变为可运行的进程)。当然,进程在它的时间片到期时也可以被抢占。
一个时间片必须持续多长
时间片的长短对系统性能是很关键的:它既不能太长,也不能太短。
如果平均时间片太短,由进程切换引起的系统额外开销就变得非常高。例如,假定进程切换需要5ms,如果时间片也是5ms,那么,CPU至少把50%的时间花费在进程切换上。
如果平时时间片太长,进程看起来就不再是并发执行。例如,让我们假定把时间片设置为5s,那么,每个可运行的进程大约5s,但是暂停的时间更长
调度算法
每个linux进程总是按照下面的调度类型被调度:
SCHED_FIFO
先进先出的实时进程。当调度程序把cpu分配给进程的时候,它就把该进程描述符保留在运行队列链表的当前位置。如果没有其他可运行的高优先权实时进程,进程就继续使用cpu,想用多久就用多久,即使还有其他具有相同优先权的实时进程处于可运行状态
SCHED_RR
时间片轮转的实时进程。当调度程序把cpu分配给进程的时候,把该进程的描述符放在运行队列链表的末尾。这种策略保证对所有具有相同优先权的SCHED_RR实时进程公平地分配CPU时间
SCHED_NORMAL
普通的分时进程