操作系统的常用的进程调度算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统的常用的进程调度算法相关的知识,希望对你有一定的参考价值。
一、调度与调度算法
操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是调度。
目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。
在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法。对于不同的的系统和系统目标,通常采用不同的调度算法。
调度算法要求:高资源利用率、高吞吐量、用户满意等原则。
进程调度所采用的算法是与整个系统的设计目标相一致的:
1.批处理系统:增加系统吞吐量和提高系统资源的利用率。(吞吐量是指单位时间内CPU完成的作业数量)
2.分时系统:保证每个分时用户能容忍的响应时间。
3.实时系统:保证对随机发生的外部事件做出实时响应。
二、调度算法的分类
1)先来先服务(FCFS)
先来先服务是最简单的算法,按照先后顺序进行调度。
1. FCFS算法
按照作业提交或进程变为就绪状态的先后次序,分派CPU; 当前作业或进程占用CPU,直到执行完或阻塞,才出让CPU(非抢占方式)。 在作业或进程唤醒后(如I/O完成),并不立即恢复执行,通常等到当前作业或进程出让CPU。
2. FCFS的特点
比较有利于长作业,而不利于短作业。 有利于CPU繁忙的作业,而不利于I/O繁忙的作业。
2)轮转法(Round Robin)
轮转法是让每个进程在就绪队列中的等待时间与享受服务的时间成正比例。
1.轮转法
将系统中所有的就绪进程按照FCFS原则,排成一个队列。每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。在一个时间片结束时,发生时钟中断。调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。? 进程可以未使用完一个时间片,就出让CPU(如阻塞)。
2.特点
将每个进程的时间片分配果断将导致进程的切换时间占用大量的CPU使用时间,降低CPU使用效率; 如果进程时间片分配过长,将导致进程等待相应的时间过长。
3)优先级调度
常用的优先级调度算法:
1.为了阻止高优先级的进程的无限运行,在每个时钟中断的时刻,降低正在运行的进程的优先级别,当这个进程的优先级降低到次高优先级进程以下时,就会发生进程的切换。
2.每个进程都有一个时间片,当当前的最高优先级的进程的时间片用完了的时候,将CPU的使用权交给具有次高优先级的进程。
3.系统动态的为每个进程分配优先级[为了某个系统目标]: 比如有一个I/O敏感的进程,每个进程被分配一个优先级1/f,其中f是该进程已经运行时间和时间片的比例。比如时间片大小是100,该进程处理I/O时间是100,这样f = 1,priority = 1,那么这个进程获得了最高优先级,获得CPU的使用权。这样就避免了这样的I/O敏感进程因为得不到CPU的使用权而大量占用内存。
4)最短工作优先算法
最短工作优先算法的核心思想是让最短执行时间的任务尽量早的运行。现在假设我们有4个进程,进程I的执行时间为a,进程II的执行时间是b,进程III的执行时间是c,进程IV的执行时间是d。假设这四个进程依次执行,那么进程I执行结束的时刻是a,进程II执行结束的时刻是a+b,进程III执行结束的时刻是a+b+c,进程IV执行结束的时间是a+b+c+d,最终四个进程的平均执行时间是:(4a+3b+2c+d)/ 4 = (a + 0.75b + 0.5c + 0.25d); 显然a对平均执行时间的贡献最大,b次之,c再次之,e最小。为了使平均执行时间最小,应该将执行时间少的任务放在前面执行。
缺点:当各个任务到达系统的时刻是相同的,并且操作系统可以估计到进程的执行时间时,最短工作优先算法才能达到应有的效果。
5)有保证的调度算法
在一个单用户操作系统中,有n个进程在运行,那么每个进程只能获得CPU处理能力的1/n; 为了进行这个保证,系统必须记录每个进程创建开始到现在使用CPU的时间数量Th,每个进程被保证的占用CPU的时间总数T。那么Th/T就是当前进程占用其保证时间的比例,选取当前比例最小的进程执行。
6)乐透调度
原理是为系统中的进程发放彩票,中奖后的奖励就是某种系统资源,比如CPU时间,当调度程序运行的时候,某张彩票被随机选择为中奖,持有该彩票的用户占用该种资源。某些更加重要的进程会被给予更多的彩票以增加其获得调度的概率。形式化的说法是: 当一个进程占用彩票总数的f(0<=f<=1)时,那么进程久获得相应比例的CPU执行时间。
乐透调度的一个有趣的原理是: 协作进程之间可以互相赠与彩票。
7)实时调度
在许多场合下,得到一个延迟的答案和得到一个错误的答案的效果是一样的,因为在这些场合中时间处于一个相当重要的位置。
实时调度系统又分为硬实时和软实时,硬实时系统表示每个进程都必须在截止时间之前执行完毕。
软实时指的是超过这个截止时间也是被容许的,这个截止时间只是一个标准,一个进程最好在这个截止时间之前完成,但没有完成也不会出现什么问题。
周期性实时调度系统:
假设系统中有m个周期性的时间,那么就有m个周期性的进程来处理这m个事件,假设每个事件i的周期是Pi,CPU的处理时间是Ci,那么只有满足下面的条件时这个事件流才会被处理:Ci / Pi 总和 < 1
三、linux进程调度算法
1、linux内核的三种调度方法:
1. SCHED_OTHER 分时调度策略。
实时进程将得到优先调用,实时进程根据实时优先级决定调度权值。
分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。
2. SCHED_FIFO实时调度策略,先到先服务
3. SCHED_RR实时调度策略,时间片轮转
SHCED_RR和SCHED_FIFO的不同:
当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。
SHCED_RR和SCHED_FIFO的相同点:
SHCED_RR和SHCED_FIFO都只用于实时任务。
2、三种算法的执行
所有任务都采用linux分时调度策略时:
1. 创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。
2. 将根据每个任务的nice值确定在cpu上的执行时间(counter)。
3. 如果没有等待资源,则将该任务加入到就绪队列中。
4. 调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择
计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。
5. 此时调度程序重复上面计算过程,转到第4步。
6. 当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。
所有任务都采用FIFO时:
1. 创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。
2. 如果没有等待资源,则将该任务加入到就绪队列中。
3. 调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。
4. 调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务 堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。
5. 如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。
所有任务都采用RR调度策略时:
1. 创建任务时指定调度参数为RR,并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。
2. 如果没有等待资源,则将该任务加入到就绪队列中。
3. 调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu。
4. 如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步骤3。
5. 当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3。
本文出自 “LOVEMERIGHT” 博客,请务必保留此出处http://lovemeright.blog.51cto.com/10808587/1787581
以上是关于操作系统的常用的进程调度算法的主要内容,如果未能解决你的问题,请参考以下文章