什么是调度?当想要访问资源的进程的数量大于资源的数量时,就需要通过某种算法决定进程访问资源的顺序这种就称为调度。而在操作系统中调度有三个层次分别为作业调度,内存调度,进程调度。作业调度是指当用户打开多个应用程序时操作系统需要通过调度算法决定先为那个应用程序创建进程。内存调度是指当内存不足时操作系统会把一部分进程挂起到外存中,当内存资源足够时需要通过调度算法决定先把那些进程从外存中调回到内存。进程调度是指在操作系统通过调度算法决定处于就绪队列中的那些进程先上cpu运行。
这三种调度的发生频率由高到低排列为进程调度,内存调度,作业调度。
进程调度分为抢占式和非抢占式两种,抢占式是指操作系统可以剥夺进程的cpu使用权限,非抢占式是指进程获得cpu使用权后该cpu只能由进程主动释放操作系统无法抢夺。根据类型不同调度发生的时机也不同,非抢占式发生在进程主动放弃cpu的使用权的时候(如进程正常终止,运行过程中发生异常而终止,进程主动请求阻塞(如等待/O)),抢占式发生在进程主动放弃cpu和进程加入就绪队列时。但是有些时候是不能发生调度的如在处理中断的过程中,进程在操怍系统内核程序临界区中,原子操作过程中(原语)。
调度器也叫调度程序属于内核程序的一种里面包括了调度算法,根据使用的调度算法的类型产生两种策略抢占式调度策略和非抢占式调度策略。非抢占式调度策略,只有运行进程阻塞或退出才触发调度程序工作。抢占式调度策略,每个时钟中断或k个时钟中断会触发调度程序工作,触发后会检测就绪队列有无新增进程如果有则执行调度算法,无则不执行。
闲逛进程:调度程序永远的备胎,没有其他就绪进程时,运行闲逛进程。
调度算法共有六种分别为先到先服务,短作业优先,高响应比优先,时间片轮转,优先级调度,多级反馈队列,多级队列。
先到先服务调度算法(FCFS):按照进程到达就绪队列的事件顺序进行调度,先进入的先被分配cpu的使用权,属于非抢占式,不会造成饥饿。优点:实现简单,公平。缺点:对短作业不利。
短作业优先算法(SJF):按照进程执行时间的长短进行调度,执行时间短的优先上cpu运行。拥有抢占式和非抢占式两个版本,抢占式:当有新的进程加入就绪队列或者有进程执行完毕让出cpu资源时执行该算法,如果是让出cpu资源的情况选择就绪队列中执行时间最短的上cpu运行,如果是有新进程加入的情况把该进程的执行时间和当前正在运行的进程的剩余执行时间进行对比,如果小于则操作系统会强制剥夺该进程的cpu使用权并分配给刚加入的进程。非抢占式:只有在进程执行完毕让出cpu资源时执行该算法。该算法会造成饥饿因为如果有源源不断的短进程进入就绪队列会导致长进程一直得不到资源导致饥饿。优点:最短的平均等待时间,平均周转时间。缺点:不公平对短作业有利,长作业无利,会导致饥饿。
高响应比优先调度算法(HRRN):每次执行调度算法时都会计算各个进程的响应比,选择响应比最大的进程上cpu运行。属于非抢占式,不会造成饥饿。综合了FCFS和SJF两种算法的优点。
时间片轮转调度算法:操作系统会决定时间片的大小,之后根据进程进入就绪队列的顺序(跟先到先服务算法一样)依次分配cpu资源。当进程的时间片用完后时钟部件会产生一个外部中断,告诉操作系统到时间了,操作系统会剥夺当前进程的cpu使用权并按照就绪队列的顺序把权限交给下一个进程并计时,而上一个进程会被添加到就绪队列的队尾等待下一次分配。操作系统在设置时间片大小时不能设置太大也不能设置太小,太大会导致大部分进程在一个时间片内就执行完毕了这样该算法跟先到先服务算法几乎相同,而太小会导致进程切换过于频繁浪费资源。该算法属于抢占式,不会造成饥饿。优点:公平;响应快,适用于分时操作系统:缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
优先级调度算法(RR):操作系统根据各个进程的优先级的高低决定那个进程获得cpu资源,优先级由优先数决定,优先数和优先级的对应关系取决于操作系统的设置。如果进程的优先级相同则先进入就绪队列的进程先获得cpu资源。优先级调度算法分为静态优先级调度算法和动态优先级调度算法,区别在于优先级是否可以改变。优先级调度算法具有抢占式和非抢占式两个版本,会造成饥饿因为如果有源源不断的高优先级的进程进来会导致低优先级的进程发生饥饿。优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。缺 点:若源源不断地有高优先级进程到来,则可能导致饥饿。
多级反馈队列调度算法:操作系统创建了多个就绪队列并为每个就绪队列划分了从高到低的优先级和从低到高时间片大小。当一个进程加入就绪队列时它会先去到一级就绪队列,此就绪队列优先级最高但被划分的时间片最少。每个就绪队列按照时间片轮转的方式分配cpu资源,当属于该进程的时间片用完后还没有执行完,那么该进程就会被分配到下一级就绪队列的队尾。下级就绪队列只有等到上级就绪队列没有进程时才能获得cpu资源。该算法属于抢占式算法,当有进程加入就绪队列时会判断该进程的优先级和当前执行进程的优先级谁高(其实就是比较队列优先级,如果当前执行的进程是第一级队列则不会发生抢占否则发生抢占),如果刚加入的进程高则会剥夺当前执行进程的cpu使用权并把权限交给新进程,同时把当前进程添加到原队列的末尾不会添加到下一级队列。
多级队列调度算法:操作系统按照进程的类型创建多个就绪队列,如系统进程,交互式进程,批处理进程。当一个进程被创建时根据进程的类型添加到相应的队列,队列之间可以按照队列的优先级分配cpu资源也可以按照时间片的方式在一个时间片内50%给第一队列,30%给第二队列,20%给第三队列。把cpu资源分配给队列后,在根据队列内部决定的调度算法(可以是上面那些算法)把cpu资源分配给相应的进程。