进程的调度算法

在操作系统,进程是很重要的概念!!!!

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

引入进程的目的,在多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

进程的特性:

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。

并发性:任何进程都可以同其他进程一起并发执行

独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;

异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进

今天主要是学习进程的调度算法:

(1)先进先出算法(FIFO

算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。

例如,有三个进程P1、P2和P3先后进入就绪队列,它们的执行期分别是21、6和3个单位时间,

执行情况如下图:

对于P1、P2、P3的周转时间为21、27、30,平均周转时间为26。

可见,FIFO算法服务质量不佳,容易引起作业用户不满,常作为一种辅助调度算法

(2)短进程优先

最短CPU运行期优先调度算法(SCBF--Shortest CPU Burst First)

该算法从就绪队列中选出下一个“CPU执行期最短”的进程,为之分配处理机

例如,在就绪队列中有四个进程P1、P2、P3和P4,它们的下一个执行 期分别是16、12、4和3个单位时间,执行情况如下图:

P1、P2、P3和P4的周转时间分别为35、19、7、3,平均周转时间为16。

该算法虽可获得较好的调度性能,但难以准确地知道下一个CPU执行期,而只能根据每一个进程的执行历史来预测。

(3)轮转法

前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。

简单轮转法:系统将所有就绪进程按FIFO规则排队,按一定的时间间隔把处理机分配给队列中的进程。这样,就绪队列中所有进程均可获得一个时间片的处理机而运行。

多级队列方法:将系统中所有进程分成若干类,每类为一级。

(4)多级反馈队列

多级反馈队列方式是在系统中设置多个就绪队列,并赋予各队列以不同的优先权。

下面主要谈到Linux中的进程调度方法

Linux 下的调度方法类似于上述算法:

1,SCHED_OTHER 分时调度策略,

2,SCHED_FIFO实时调度策略,先到先服务

3,SCHED_RR实时调度策略,时间片轮转

SHCED_RR和SCHED_FIFO的不同:

当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。

SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。

如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。

  相同点:

RR和FIFO都只用于实时任务。

创建时优先级大于0(1-99)。

按照可抢占优先级调度算法进行。

就绪态的实时任务立即抢占非实时任务。

  所有任务都采用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。

  系统中既有分时调度,又有时间片轮转调度和先进先出调度

1,RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。

2,当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。

3,RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的未知决定的,这样导致一些不公正性(优先级是一样的,不知道那个先运行),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。

时间: 2024-10-16 00:11:30

进程的调度算法的相关文章

常见进程的调度算法

调度算法是指:根据系统的资源分配策略所规定的资源分配算法,如任务A在执行完后,选择哪个任务来执行,使得某个因素(如进程总执行时间,或者磁盘寻道时间等)最小.对于不同的系统目标,通常采用不同的调度算法. 几个常用的操作系统进程调度算法. 1 先来先服务(队列) 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就

常见的进程优先调度算法

什么是进程调度以及为什么有进程调度算法 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数.这将导致它们互相争夺处理机.另外,系统进程也同样需要使用处理机.这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行. 常见的进程调度算法   先进先出算法 算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机. 例如,有三个进程P1.P2和P3先后进入就绪队列,它们的执行期分别是21

复习-进程的调度算法

1.先来先服务(FCFS):非抢占 2.轮转(RR):时间片用完后抢占 3.最短进程优先(SPN):非抢占,下一次选择预计处理时间最短的进程 4.最短剩余时间(SRT):SPN的抢占版,新进程到达时抢占 5.最高响应比优先:非抢占--算了这个懒得看了 6.(多级)反馈:时间片用完后抢占.方案345都是要估计服务时间,而这种方式则是关注已经执行的时间.分配不同优先级的队列i(i越小优先级越高),每个队列的中进程的允许执行时间为2^i.进程高优先级被抢占过后会掉到下一级(惩罚运行时间长的作业).首先

【Linux】 进程调度算法

Linux中的进程调度算法分类如下: 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法(FCFS) 先来先服务(First Come First Service,FCFS)调度算法是一种最简单的.不可抢占式的调度算法,既可用于作业调度,也可用于进程调度.该算法按照进程进入就绪队列的先后顺序选择可以占用处理器的进程.每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度

常见进程调度算法

常见进程调度算法 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理

Linux 常见的进程调度算法

1.在介绍进程调度之前,先对进程的状态的概念应该有所了解,下面是关于进程状态的一些基本概念:进程的状态分为三种,分别为: 1).运行态:该状态表明进程在实际占用CPU 2).就绪态: 该状态下进程可以运行,但因为其他进程正在运行而暂时停止 3).阻塞态: 该状态下进程不能运行,除非某种外部事件的发送 运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的. 等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行. 运行态→就绪态 不是由于自身原因,而是由外界原因使

【Todo】Linux进程调度算法学习

参考这篇文章 http://blog.chinaunix.net/uid-27052262-id-3239260.html Linux支持三种进程调度策略,分别是SCHED_FIFO . SCHED_RR和SCHED_NORMAL.Linux支持两种类型的进程,实时进程和普通进程.实时进程可以采用SCHED_FIFO 和SCHED_RR调度策略:普通进程采用SCHED_NORMAL调度策略. 本文主要讨论普通进程的调度算法,为了描述方便,后面章节中的"进程"指"普通进程&qu

操作系统中常用的进程调度算法

操作系统中对进程的调度算法大体上可以分为三类: 1.先来先服务算法 2.优先级法 3.时间片轮法 接下来简要介绍一下这三类算法. 一.先来先服务算法 (FCFS:    First Come First Service) 原理: 这是最简单的一种调度算法,用到了队列的思想.每次调度都从进程就绪队列中选择队首的进程(也就是最先进入队列的进程)进行调度. 直到进程的执行被阻塞,或进程结束,再调用下一个进程,依然是从队列中选择队首的进程的. 这里要注意,上文我说的队列中的进程实际上是进程的PCB,因为

浅析几个常见进程调度算法

今天来谈谈操作系统的几个常见的进程调度算法.那么第一步首先要了解什么是进程调度算法?简单来说就是根据系统的资源分配策略所规定的资源分配算法.举个例子来说明.假设任务一在执行完成后选择哪个任务来进行使得某一因素最小,这个因素可能是进程执行的总时间或是磁盘寻道时间等等.因此对于不同的系统目标有着不同的要求,要选择的调度算法也就不尽相同.接下来,就聊聊几个常见的进程调度算法.  First>>  先来先服务调度算法  FCFS 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业