linux环境下几种内存linux进程调度算法法模拟

首先来看下集中常见的进程linux进程調度算法法:

1.先来先服务linux进程调度算法法

2.短作业优先linux进程调度算法法

4.高响应比优先linux进程调度算法法

一、先来先服务和短作业(进程)优先linux進程调度算法法

先来先服务(FCFS)linux进程调度算法法是一种最简单的linux进程调度算法法该算法既可用于作业调度,也可用于进程调度FCFS算法比較有利于长作业(进

程),而不利于短作业(进程)由此可知,本算法适合于CPU繁忙型作业而不利于I/O繁忙型的作业(进程)。

短作业(進程)优先linux进程调度算法法(SJ/PF)是指对短作业或短进程优先调度的算法该算法既可用于作业调度,也可用于进程调度但其对

作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

为了照顾紧迫型作业使之在进入系统后便获得优先处理,引入了最高优先权优先(FPF)linux进程调度算法法此算法常被用于批处理系统中,作为作业linux进程调度算法法也作为多种

的进程linux进程调度算法法,还可用于实时系统中当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存当用于进程调度时,该算法是把处理机

分配给就绪队列中优先权最高的进程这时,又可进一步把该算法分成如下两种

1) 非抢占式优先权算法

在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时系统方可再将处理

机重新分配给另一优先权最高的进程。这种linux进程调度算法法主要用于批处理系统中;也可用于某些对实时性要求不严嘚实时系统中

2) 抢占式优先权linux进程调度算法法

在这种方式下,系统同样是把处理机分配给优先权最高的进程使之执行。但在其执行期间只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进

(优先权最高的进程)的执行重新将处理机分配给新到的優先权最高的进程。因此在采用这种linux进程调度算法法时,是每当系统中出现一个新的就绪进程时就将其优先权Pi与正

在执行的进程的优先权Pj进行比较。如果Pi≤Pj原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行做进程切换,使进程投入执行显然,这种抢占式的优先权調

度算法能更好地满足紧迫作业的要求故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中

三、高响應比优先linux进程调度算法法

在批处理系统中,短作业优先算法是一种比较好的算法其主要的不足之处是长作业的运行得不到保证。如果我們能为每个作业引入前面所述的动态优先权并使作业的优

先级随着等待时间的增加而以速率提高,则长作业在等待一定的时间后必然囿机会分配到处理机。该优先权的变化规律可描述为:

由于等待时间与服务时间之和就是系统对该作业的响应时间故该优先权又相当于響应比RP。据此又可表示为:

(1) 如果作业的等待时间相同,则要求服务的时间愈短其优先权愈高,因而该算法有利于短作业

(2) 当要求服务嘚时间相同时,作业的优先权决定于其等待时间等待时间愈长,其优先权愈高因而它实现的是先来先服务。

(3) 对于长作业作业的优先級可以随等待时间的增加而提高,当其等待时间足够长时其优先级便可升到很高,从而也可获得处理机简言之,该算法既照顾了短作業

又考虑了作业到达的先后次序,不会使长作业长期得不到服务因此,该算法实现了一种较好的折衷当然,在利用该算法时每要進行调度之前,都须先做响应比的计算这

时间片轮转(Round RobinRR)法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例茬时间片轮转法中,需要将CPU的处理时间分成固定大小

的时间片例如,几十毫秒至几百毫秒如果一个进程在被调度选中之后用完了系统規定的时间片,但又未完成要求的任务则它自行释放自己所占有的CPU而排到就绪队列

的末尾,等待下一次调度同时,进程调度程序又去調度当前就绪队列中的第一个进程

显然,轮转法只能用来调度分配一些可以抢占的资源这些可以抢占的资源可以随时被剥夺,而且可鉯将它们再分配给别的进程CPU是可抢占资源的一种。但打印机等

资源是不可抢占的由于作业调度是对除了CPU之外的所有系统硬件资源的分配,其中包含有不可抢占资源所以作业调度不使用轮转法。在轮转法中时间片长度的选取非

常重要。首先时间片长度的选择会直接影响到系统的开销和响应时间。如果时间片长度过短则调度程序抢占处理机的次数增多。这将使进程上下文切换次数也大大增加从

而加重系统开销。反过来如果时间片长度选择过长,例如一个时间片能保证就绪队列中所需执行时间最长的进程能执行完毕,则轮转法變成了先来先服务法时间片长度的

选择是根据系统对响应时间的要求和就绪队列中所允许最大的进程数来确定的。

  在轮转法中加入到僦绪队列的进程有3种情况,一种是分给它的时间片用完但进程还未完成,回到就绪队列的末尾等待下次调度去继续执行另一种情况是汾给该进程

时间片并未用完,只是因为请求I/O或由于进程的互斥与同步关系而被阻塞当阻塞解除之后再回到就绪队列。第三种情况就是噺创建进程进入就绪队列如果对这些进程区

对待,给予不同的优先级和时间片从直观上看,可以进一步改善系统服务质量和效率唎如,我们可把就绪队列按照进程到达就绪队列的类型和进程被阻塞时的阻塞原因分

不同的就绪队列每个队列按FCFS原则排列,各队列之間的进程享有不同的优先级但同一队列内优先级相同。这样当一个进程在执行完它的时间片之后,或从睡眠中被

醒以及被创建之后将进入不同的就绪队列。

前面介绍的各种用作进程调度的算法都有一定的局限性如短进程优先的linux进程调度算法法,仅照顾了短进程而忽略了长进程而且如果并未指明进程的长度,则短进程优先和基于

进程长度的抢占式linux进程调度算法法都将无法使用而多级反馈队列linux进程调度算法法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要因而它是目前被公认的一

种较好的进程linux进程调度算法法。在采用多级反馈队列linux进程调度算法法的系统中linux进程调度算法法的实施过程如下所述。

(1) 应设置多个就绪队列并为各个队列赋予不同的优先级。第一个队列的优先级最高第二个队列次之,其余各队列的优先权逐个降低该算法赋予各个队列中进程执行

时间爿的大小也各不相同,在优先权愈高的队列中为每个进程所规定的执行时间片就愈小。例如第二个队列的时间片要比第一个队列的时間片长一倍,……i+1个队列

的时间片要比第i个队列的时间片长一倍。

(2) 当一个新进程进入内存后首先将它放入第一队列的末尾,按FCFS原则排队等待调度当轮到该进程执行时,如它能在该时间片内完成便可准备撤离系统;如果它在

一个时间片结束时尚未完成,调度程序便將该进程转入第二队列的末尾再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放

入第三队列……,如此下去当一个长作业(进程)从第一队列依次降到第n队列后,在第队列便采取按时间片轮转的方式运行

(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1(i-1)队列均空时才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务

時又有新进程进入优先权较高的队列(1(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机即由调度程序把正在运行的進程放回到第i队列的末尾,把

处理机分配给新到的高优先权进程

    首先我们来看看什么是进程调喥。

高级调度:(High-Level Scheduling)又称为作业调度它决定把后备作业调入内存运行;
低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;
中级調度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入在内、外存对换区进行进程对换。
接下来我们看一看常见的进程linux进程调度算法法。


先来先服务(First Come First ServiceFCFS)linux进程调度算法法按照进程进入就绪队列的先后顺序选择可以占用处理器的进程。这是一种不可抢占方式的linux进程调度算法法优点是实现简单,缺点是后来的进程等待CPU的时间较长它现今主要用作辅助调度法;例如结合在优先级linux进程调度算法法中使用,当有两个最高优先级的进程时则谁先来,谁就先被调度
短执行进程优先算法(Shortest Process First,SPF)就是从就绪队列中选择一个CPU执行时间预期最短的进程将处理器分配给它。虽然較公平但实现难度较大,因为要准确预定下一个进程的CPU执行周期是很困难的
First,HPF)linux进程调度算法法的核心是确定进程的优先级首先,系統或用户按某种原则为进程指定一个优先级来表示该进程所享有的调度优先权确定优先级的方法较多,一般可分为两类即静态法和动態法。静态法根据进程的静态特性在进程开始执行之前就确定它们的优先级,一旦开始执行之后就不能改变动态法则不然,它把进程嘚静态特性和动态特性结合起来确定进程的优先级随着进程的执行过程,其优先级不断变化 ?进程的静态优先级确定最基本的方法是按照进程的类型给予不同的优先级。例如在有些系统中,进程被划分为系统进程和用户进程系统进程享有比用户进程高的优先级;对於用户进程来说,则可以分为:I/O繁忙的进程、CPU繁忙的进程、I/O与CPU均衡的进程和其他进程等
?对系统进程,也可以根据其所要完成的功能划汾为不同的类型例如,调度进程、I/O进程、中断处理进程、存储管理进程等这些进程还可进一步划分为不同类型并赋予不同的优先级。唎如在操作系统中,对于键盘中断的处理优先级和对于电源掉电中断的处理优先级是不相同的
?基于静态优先级的linux进程调度算法法实現简单,系统开销小但由于静态优先级一旦确定之后,直到执行结束为止始终保持不变从而系统效率较低,调度性能不高现在的操莋系统中,如果使用优先级调度的话则大多采用动态优先级的调度策略。
?进程的动态优先级一般可以根据以下两个方面来确定:
? (1)根據进程占有CPU时间的长短来决定一个进程占有处理机的时间愈长,则在被阻塞之后再次获得调度的优先级就越低反之,其获得调度的可能性就会越大
? (2)根据就绪进程等待CPU的时间长短来决定。一个就绪进程在就绪队列中等待的时间越长则它获得调度选中的优先级就越高。
?由于动态优先级随时间的推移而变化系统要经常计算各个进程的优先级,因此系统要为此付出一定的开销。
?最高优先级优先linux进程调度算法法用于多道批处理系统中较好但它使得优先级较低的进程等待时间较长,这对于分时系统中要想获得较好的响应时间是不允許的所以在分时系统中多采用时间片轮转法来进行进程调度。

接下来我们在说一说Linux中的进程调度。

调度程序运行时要在所有可运行狀态的进程中选择最值得运行的进程投入运行。选择进程的依据是什么呢在每个进程的task_struct结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程嘚依据其中,policy是进程的调度策略用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级;counter是进程剩余的时间片它的起始值就是priority的值;由于counter在后面计算一个处于可运行状态的进程值得运行的程度goodness时起重要作用,因此counter也可以看作是进程的动态优先级。rt_priority是实时进程特有的用于实时进程间的选择。


2SCHED_FIFO实时调度策略,先到先服务
3SCHED_RR实时调度策略,时间片轮转

RR和FIFO都呮用于实时任务
创建时优先级大于0(1-99)。
按照可抢占优先级linux进程调度算法法进行
就绪态的实时任务立即抢占非实时任务。
所有任务都采用linux汾时调度策略时
1,创建任务指定采用分时调度策略并指定优先级nice值(-20~19)。
2将根据每个任务的nice值确定在cpu上的执行时间(counter)。
3如果没有等待资源,则将该任务加入到就绪队列中
4,调度程序遍历就绪队列中的任务通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一個去运行当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中
5,此时調度程序重复上面计算过程转到第4步。
6当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步
所有任务都采用FIFO时,
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。
系统Φ既有分时调度又有时间片轮转调度和先进先出调度
1,RR调度和FIFO调度的进程属于实时进程以分时调度的进程是非实时进程。
2当实时进程准备就绪后,如果当前cpu正在运行非实时进程则实时进程立即抢占非实时进程。
3RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR昰FIFO的一个延伸FIFO时,如果两个进程的优先级一样则这两个优先级一样的进程具体执行哪一个是由其在队列中的未知决定的,这样导致一些不公正性(优先级是一样的为什么要让你一直运行?)如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环執行保证了公平。

本文仅对进程调度进行了简单的介绍和理解如有错误,望留言批评

我要回帖

更多关于 linux进程调度算法 的文章

 

随机推荐