几种操作系统的作业调度算法

       由于某个项目需要用到对消息队列的调度和处理,我这里想预研一下调度的算法,网上度娘到了几种操作系统的作业调度算法,贴出来给自己做一下参考备份,我觉得说的很好,这里讲的几种调度算法结合我要做的项目,我觉得多级反馈队列调度算法比较合适,这里暂且做一下标记,后续有改动再说。

1.进程

https://www.cnblogs.com/tianlangshu/p/5224178.html

一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位

1.1三种状态

  • 运行状态:获得CPU的进程处于此状态,对应的程序在CPU上运行着。
  • 阻塞状态:为了等待某个外部事件的发生(如等待I/O操作的完成,等待另一个进程发来消息),暂时无法运行。也称为等待状态。
  • 就绪状态:具备了一切运行需要的条件,由于其他进程占用CPU而暂时无法运行。

1.1.1状态之间的转换

a. 运行状态 ===> 阻塞状态:例如正在运行的进程提出I/O请求,由运行状态转化为阻塞状态

b. 阻塞状态 ===> 就绪状态:例如I/O操作完成之后,由阻塞状态转化为就绪状态

c. 就绪状态 ===> 运行状态:例如就绪状态的进程被进程调度程序选中,分配到CPU中运行,由就绪状态转化为运行状态

d. 运行状态 ===> 就绪状态:处于运行状态的进程的时间片用完,不得不让出CPU,由运行状态转化为就绪状态

1.1.2 分类

a. 系统进程:操作系统用来管理资源的进程,当系统进程处于运行态时,CPU处于管态,系统之间的关系由操作系统负责

b. 用户进程:操作系统可以独立执行的的用户程序段,当用户进程处于运行态时,CPU处于目态,用户进程之间的关系由用户负责

2.线程

进程与线程的一个简单解释(还有互斥锁、信号量的解释)

一个进程就是一段程序的执行,但是一段程序可以实现很多功能,而我们可以简单的认为,每一个功能就是一个线程,线程就是进程内执行的任务。

一个进程内部可以有很多的线程。

线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源。

2.1 多线程优点

  • 响应度高:如果对一个交互程序采用多线程,即使有部分线程阻塞或执行冗长的操作,该程序也能继续执行,从而增加对用户的相应程度
  • 资源共享:多线程默认共享他们所属进程的内存和资源
  • 经济:进程创建所需要的内存和资源的分配比较昂贵,由于线程能够共享他们的进程的资源,所以创建线程比进程经济;
  • 多处理器体系结构的利用:多线程的优点是充分利用多处理器体系结构,以便每个进程能够并行运行在不同的处理器上。

3.进程的通信方式

3.1共享内存

最有用的进程间通信方式。

它使得多个进程可以访问同一块内存空间, 不同进程可以及时看到对方进程中对共享内存中数据得更新。

这种方式需要依靠某种同步操作, 如互斥锁和信号量等

3.2消息队列

“消息队列” 是在消息的传输过程中保存消息的容器

具有写权限的进程可以按照一定得规则向消息队列中添加新信息;

对消息队列有读权限的进程则可以从消息队列中读取信息。

3.3.信号

信号是一种比较复杂的通信方式, 用于通知接收进程某个事件已经发生。

3.4信号量

信号量是一个计数器, 可以用来控制多个进程对共享资源的访问。

它常作为一种锁机制, 防止某进程正在访问共享资源时, 其他进程也访问该资源。

因此, 主要作为进程间以及同一进程内不同线程之间的同步手段。

3.5 套接字

这是一种更为一般得进程间通信机制, 它可用于网络中不同机器之间的进程间通信, 应用非常广泛。

3.6 普通管道

普通管道是一种半双工的通信方式, 数据只能单向流动, 而且只能在具有父子关系的进程间使用。

3.7有名管道

有名管道也是半双工的通信方式, 但是它允许无亲缘关系进程间的通信。

4.操作系统调度方法

https://www.cnblogs.com/kxdblog/p/4798401.html

在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用

下面介绍几种常用的调度算法。

4.1.先来先服务调度算法

该调度算法既可以用于作业调度也可以用于进程调度。

  • 在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
  • 在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。

假设系统中有4个作业,它们的提交时间分别是8、8.4、8.8、9,运行时间依次是2、1、0.5、0.2,

  • 等待时间=开始时间-提交时间;
  • 完成时间=开始时间+运行时间;
  • 周转时间=作业完成时刻—作业到达时刻;
  • 带权周转时间=周转时间/服务时间;
  • 平均周转时间=作业周转总时间/作业个数;
  • 平均带权周转时间=带权周转总时间/作业个数;
作业号提交时间运行时间开始时间等待时间完成时间周转时间带权周转时间
18280(8+2)10(10-8)21
28.4110(10-8.4)1.6(10+1)11(11-8.4)2.62.6
38.80.511(11-8.8)2.2(11+0.5)11.5(11.5-8.8)2.75.4
490.211.5(11.5-9)2.5(11.5+0.2)11.7(11.7-9)2.713.5
  • 平均等待时间=(0+1.6+2.2+2.5)/4=1.575;
  • 平均周转时间=(2+2.6+2.7+2.7)/4=2.5;
  • 平均带权周转时间=(1+2.6+5.4+13.5)/4=5.625

属于不可剥夺算法。

从表面上看,它对所有作业都是公平的,但若一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。但它常被结合在其他调度策略中使用。例如,在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。

FCFS调度算法的特点是算法简单,但效率低;对长作业比较有利,但对短作业不利(相对SJF和高响应比);

有利于CPU繁忙型作业,而不利于I/O繁忙型作业。

4.2.短作业(进程) 优先调度算法

以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。

  • 短作业优先(SJF)调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
  • 短进程优先(SPF)调度算法,则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。
  • 平均等待时间=(0+2.3+1.4+1)/4=1.175;
  • 平均周转时间=(2+3.3+1.9+1.2)/4=2.1;
  • 平均带权周转时间=(1+3.3+3.8+6)/4=3.525

SJF调度算法也存在不容忽视的缺点:

  • 该算法对长作业不利,由前两个表可知,SJF调度算法中长作业的周转时间会增加。更严重的是,如果有一长作业进入系统的后备队列,由于调度程序总是优先调度那些 (即使是后进来的)短作业,将导致长作业长期不被调度(“饥饿”现象,注意区分“死锁”。后者是系统环形等待,前者是调度策略问题)。
  • 该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理。
  • 由于作业的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

注意,SJF调度算法的平均等待时间、平均周转时间最少

4.3. 优先权调度算法

优先级调度算法又称优先权调度算法,该算法既可以用于作业调度,也可以用于进程调度

  • 在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最髙的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
  • 在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。

该算法中的优先级用于描述作业运行的紧迫程度
根据新的更高优先级进程能否抢占正在执行的进程,可将该调度算法分为:

  • 非剥夺式优先级调度算法。当某一个进程正在处理机上运行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在运行的进程继续运行,直到由于其自身的原因而主动让出处理机时(任务完成或等待事件),才把处理机分配给更为重要或紧迫的进程。
  • 剥夺式优先级调度算法。当一个进程正在处理机上运行时,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。

而根据进程创建后其优先级是否可以改变,可以将进程优先级分为以下两种:

  • 静态优先级。优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
  • 动态优先级。在进程运行过程中,根据进程情况的变化动态调整优先级。动态调整优先级的主要依据为进程占有CPU时间的长短、就绪进程等待CPU时间的长短。

4.4. 高响应比优先调度算法

高响应比优先调度算法主要用于作业调度,该算法是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑每个作业的等待时间和估计的运行时间

  • 在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。

响应比的变化规律可描述为:

根据公式可知:

  • 当作业的等待时间相同时,则要求服务时间越短,其响应比越高,有利于短作业
  • 当要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,因而它实现的是先来先服务
  • 对于长作业,作业的响应比可以随等待时间的增加而提高,当其等待时间足够长时,其响应比便可升到很高,从而也可获得处理机。克服了饥饿状态,兼顾了长作业

4.5.基于时间片的轮转调度算法

时间片轮转调度算法主要适用于分时系统

在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。

在时间片轮转调度算法中,时间片的大小对系统性能的影响很大

  • 如果时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务调度算法。
  • 如果时间片很小,那么处理机将在进程间过于频繁切换,使处理机的开销增大,而真正用于运行用户进程的时间将减少。因此时间片的大小应选择适当。

时间片的长短通常由以下因素确定:

  • 系统的响应时间、
  • 就绪队列中的进程数目
  • 系统的处理能力。

4.6.多级反馈队列调度算法

多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合和发展。UNIX操作系统采取的便是这种调度算法。

如下图所示。

通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。

  • 例如,为提高系统吞吐量和缩短平均周转时间而照顾短进程;
  • 为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;
  • 同时,也不必事先估计进程的执行时间。

多级反馈队列调度算法的实现思想如下:

  1. 应设置多个就绪队列,并为各个队列赋予不同的优先级,第1级队列的优先级最高,第2级队列次之,其余队列的优先级逐次降低。
  2. 赋予各个队列中进程执行时间片的大小也各不相同,在优先级越高的队列中,每个进程的运行时间片就越小。例如,第2级队列的时间片要比第1级队列的时间片长一倍, ……第i+1级队列的时间片要比第i级队列的时间片长一倍。
  3. 当一个新进程进入内存后,首先将它放入第1级队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第2级队列的末尾,再同样地按FCFS 原则等待调度执行;如果它在第2级队列中运行一个时间片后仍未完成,再以同样的方法放入第3级队列……如此下去,当一个长进程从第1级队列依次降到第 n 级队列后,在第 n 级队列中便釆用时间片轮转的方式运行。
  4. 仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;仅当第1 ~ (i-1)级队列均为空时,才会调度第i级队列中的进程运行。如果处理机正在执行第i级队列中的某进程时,又有新进程进入优先级较高的队列(第 1 ~ (i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,(时间片运行完抢占还是直接抢?)即由调度程序把正在运行的进程放回到第i级队列的末尾,把处理机分配给新到的更高优先级的进程。

多级反馈队列的优势有:

  • 终端型作业用户:短作业优先
  • 短批处理作业用户:周转时间较短。
  • 长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理。

4.7对比

5.线程的通信方式

5.1 锁机制

互斥锁:提供了以排他方式防止数据结构被并发修改的方法。

读写锁:允许多个线程同时读共享数据,而对写操作是互斥的。

条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

5.2信号量机制(Semaphore)

包括无名线程信号量和命名线程信号量。

信号量(semaphore):信号量的数据结构为一个值和一个指针

  • 指针指向等待该信号量的下一个进程。

信号量的值与相应资源的使用情况有关:

  • 当它的值大于0时,表示当前可用资源的数量;
  • 当它的值小于0时,其绝对值表示等待使用该资源的进程个数。

信号量的值仅能由PV操作来改变。

PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:

  • P(S):
    • 将信号量S的值减1,即S=S-1;
    • 如果S<=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
  • V(S):
    • 将信号量S的值加1,即S=S+1;
    • 如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

PV操作的意义:用信号量及PV操作来实现进程的同步和互斥

PV操作属于进程的低级通信

使用PV操作实现进程互斥时应该注意的是:

  1. 每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
  2. P、V操作应分别紧靠临界区的。

5.3 信号机制(Signal)

类似进程间的信号处理。

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

 

以上内容转载网上,如有侵权请告知删除,谢谢!

 

 

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值