操作系统第三章笔记

第三章

处理机调度概述

处理机调度的层次

  • 高级调度:又称长程调度或作业调度,它的调度对象是作业,决定将外存中处于后备队列中的哪些作业调入内存中,为他们创建进程,分配资源,发生频率最低,每个作业只调入一次,调出一次。调入创建PCB,调出撤销PCB
  • 低级调度:又称短程调度或进程调度。是指根据算法。进程从就绪到运行的状态,调入CPU中运行。
  • 中级调度:又称内存调度,主要目的是提高内存利用率和吞吐量,决定将哪些进程调入内存,哪些进程调出内存。如从运行到挂起,挂起到就绪。

作业和作业调度(高级调度)

  • 作业:包含程序,数据,作业说明书等。
  • 作业控制块(JCB):作业存在标志,类同PCB,保存了很多作业的信息。每当一个作业进入系统,“作业注册”程序会建立一个JCB
  • 作业调度的主要任务:即高级调度的主要任务,根据JCB中的信息,检查系统中的资源能否满足作业的需求,然后调入内存,创建进程到就绪队列等。

进程调度(低级调度)

  • 进程调度任务(低级调度任务):保护CPU现场安全;按某种算法选取进程;把CPU分配给进程
  • 进程调度机制:为了实现进程调度,在进程调度机制中,有3个基本部分
    • 排队器:用来排队成就绪队列的
    • 分派器:把CPU分配给进程
    • 上下文切换器:进程切换时,把被切换的进程的上下文内容从CPU寄存器保存至对应的PCB,新进来的进程反之。
  • 进程调度方式
    • 非抢占调度方式:正常情况一直运行,除非已经执行完毕或者发生了什么事让它执行不了,正在执行的进程I/O请求去阻塞态了,或者通信或者同步时执行了原语操作,比如阻塞原语(Block),优点:实现简单,开销小,适用大多数批处理系统。
    • 抢占调度方式:把处理机抢了,不是任意抢的,要遵守原则,原则主要有:优先级原则;短进程优先原则;时间片原则等

处理机调度算法的目标

  • 处理机调度算法的共同目标
    • 资源利用率高
      CPU利用率=(CPU有效工作时间)/(CPU有效工作时间+CPU空闲等待时间)
    • 公平性:各进程得到合理CPU时间,防止饥饿。
    • 平衡性:平衡系统资源,尽量使系统中CPU和各种I/O设备经常处于忙碌状态
    • 策略强制执行:对于制定的策略,只要有需要,就必须准确执行
  • 批处理系统中处理机调度算法的目标
    • 平均周转时间短:周转时间为作业开始到完成的时间。各个进程完成时间-到达时间之和/总进程数,周转时间包含:作业在外存后备队列中等待调度时间+进程在就绪队列上的等待调度时间+CPU执行事件+等待IO操作时间
    • 平均带权周转时间短:各个周转时间/运行时间之和/总进程数
    • 系统吞吐量高:单位时间内系统完成的作业数
    • CPU利用率高:提高方法:尽量选择计算量大的作业

分时系统中处理机调度算法的目标

  • 响应时间快:从用户通过键盘提交请求开始到系统首次响应
  • 均衡性:系统响应时间快慢与用户请求服务的复杂性成正比

实时系统的目标

  • 截止时间的保证
  • 可预测性准则

调度算法

先来先服务算法(FCFS)

它是非抢占式的,优点是比较公平,算法实现简单,不会产生饥饿,算法主要思想:按到达的时间顺序为进程分配CPU,如果是用于作业调度,则是按到达的时间顺序将作业调入内存,分配资源创建进程,插入就绪队列。
特点:有利于长作业,不利于短作业,有利于CPU密集/繁忙型的作业,不利于I/O繁忙的,因为他们跑的慢,来的晚。无法实现人机交互。
操作系统第三章笔记_第1张图片

短作业优先调度算法(SJF)

一般是非抢占式的,暂不介绍抢占式的,它追求最少的平均带权周转时间,平均周转时间,平均等待时间(周转时间-运行时间),有效的提高系统吞吐量,按作业长短来调度,越短越先运行。可用于作业和进程调度。
缺点:对长作业不公平,会产生饥饿;如果是进行作业调度,必须预先的知道作业的运行时间;没有考虑作业的紧迫程度,不能保证紧迫性作业能得到及时处理

优先级调度算法

调度思想:在后备队列中选择一个或多个优先级最高的作业,将他们调入内存…放入就绪队列。或者根据进程优先级选择。简单易行,系统开销小。会发生饥饿,如果有源源不断的优先级高的进程到来。有抢占式和非抢占式优先级调度算法。
优先级的类型:静态优先级,和随着时间延长而增加的动态优先级
优先级确认方法:进行类型-系统进程高于一般用户进程的优先权。进程对资源的要求-对CPU和内存要求小,运行时间短的优先权高些。用户要求-根据用户进程的紧迫程度和用户所付费用决定

高响应比优先调度算法

  • 通常用于作业调度;高响应比优先调度算法只是优先级调度算法的一个特例。不会产生饥饿
    优先级=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间。响应比(Rp)即优先级肯定是大于等于1的。
  • 每次调度之前都会计算响应比,会增加系统的开销
    操作系统第三章笔记_第2张图片

轮转调度算法(RR)

  • 基于时间片的轮转调度算法。把CPU划分为若干个时间片,按顺序赋给FCFS就绪队列中的每个进程。时间片用完后就会产生时钟中断请求,即使进程为执行完毕,系统也剥夺该进程的CPU。
  • RR的进程切换时机:
    时间片内进程已运行完成,立即激活进程调度程序。时间片用完,计时器中断处理程序被激活,送当前进程到就绪队列末尾。
  • 时间片大小的确定:
    • 时间片小,利于短进程,但进程调度切换频繁,增加开销。
    • 时间片大,退化为FCFS,无法满足短作业和交互式进程的需求。
    • 时间片可选取略大于一次典型交互的所需时间,使大多数交互式进程能在一个时间片内完成,从而获得很小的响应时间。操作系统第三章笔记_第3张图片

多级反馈队列调度算法

该算法为抢占式算法。调度机制如下:

  • 设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先级,第一个队列的优先级最高,第二个队列次之,其余队列的优先级依次降低。在优先级越高的队列中,其时间片越小。
  • 每个队列都采用FCFS,当进程最后被降到第n队列后,在第n队列中便采取RR方式运行
  • 按队列优先级调度:调度程序首先调度最高优先级队列中各进程运行,仅当第一队列空闲时,才调度第二队列中进程运行。
  • 调度算法性能:
    • 终端型作业用户:交互型作业,第一级队列的时间片可完成
    • 短批处理作业用户:最多轮两次就可完成,周转时间较短
    • 长批处理作业用户:不必担心长期得不到调度,比简单轮转性能好。

实时调度

在实时系统中,有两类不同性质的实时任务,即HRT和SRT任务,他们都联系着一个截止时间。实时调度必须满足实时任务对截止时间的要求

实现实时调度的基本条件

  • 提供必要的信息
    • 就绪时间
    • 开始截止时间和完成截止时间
    • 处理时间
    • 资源要求
    • 优先级
  • 系统处理能力强
    假设系统中有m个周期性的硬实时任务,处理时间为Ci,周期时间为Pi(1<=i<=m)
    单处理机下满足:m个Ci/Pi之和小于等于1
    多处理机即小于等于N(处理机个数)
  • 采用抢占式调度机制
  • 采用快速切换机制(广泛采用)
    • 对外部中断的快速响应能力:要求对紧迫的外部中断及时响应,要求快速硬件中断机构,允许中断的间隔短
    • 快速的任务分派能力:为了提高分派程序任务切换速度,使运行功能单位适当小,减少切换任务时的时间开销

实时调度算法分类

  • 根据实时任务性质不同可分为硬实时调度和软实时调度
  • 根据调度方式不同可分为非抢占调度和抢占调度算法
    • 非抢占式调度算法
      • 非抢占式轮转调度算法:不太严格的实时控制系统
      • 非抢占式优先调度算法:较为严格
    • 抢占式调度算法
      • 基于时钟中断的抢占式优先权调度算法:优先级高的进程到的时候,也要等当前进程时钟中断后,才能抢
      • 立即抢占的优先权调度算法:一旦出现请求中断的紧急任务,只要当前任务未处于临界区,就马上抢
  • 根据调度时间的不同分成静态和动态调度算法
  • 在多处理机情况下可分为集中式和分布式调度算法

最早截止时间优先算法(EDF)

根据任务的截止时间确定任务的优先级,任务的截止时间越早,其优先级越高,具有最早截止时间的任务排在队列的前面。

  • 非抢占式调度方式用于非周期实时任务
    操作系统第三章笔记_第4张图片

最低松弛度优先算法(LLF)

该算法在确定任务的优先级时,根据的是任务的紧急程度(或松弛度)。任务紧急程度越高,赋予该任务的优先级就越高,以使其可被优先执行
松弛度=必须完成时间-还需运行的时间-当前时间
松弛度是可以动态变化的,主要用于可抢占式调度方式。有点类似于最高响应比算法,只是计算公式不一样,松弛度越小,优先级越高,松弛度不能小于0
操作系统第三章笔记_第5张图片

死锁概述

一组进程中的每个进程都在等待被该组的其他进程占有的资源,处于一种僵持局面,没有外力作用,都无法向前推进,这种现象称为进程死锁,这组进程称为死锁进程。即这组进程都在吃着碗里的,看着锅里的。

  • 可抢占资源和不可抢占资源
    • 可抢占资源:进程获得资源后,这类资源可以被其他进程或系统抢占
    • 不可抢占资源:一旦分配出去后就不能强行收回,只能进程自己释放。

计算机系统中的死锁

  • 竞争不可抢占资源引起死锁:不可抢占代表你有皮球我有枪,你我即想要皮球又想要枪,但是我们家长在,不能打架抢,所以死锁了,都玩不愉快
  • 竞争可消耗资源引起死锁:比如在哲学家就餐问题中的筷子
  • 进程推进顺序不当引起死锁
    操作系统第三章笔记_第6张图片

死锁的定义、必要条件与处理方法

  • 死锁的定义:一组进程中的每个进程都在等待仅有该组进程中的其他进程才能引发的事件发生,那么该组进程是死锁的
  • 产生死锁的条件
    • 互斥条件:涉及的资源是非共享的
    • 不可抢占条件:不能抢占其他进程拥有资源
    • 请求和保持条件:进程在等待一新资源时继续占有已分配的资源
    • 循环等待条件:存在一种进程的循环链,链中的每一个进程已获得的资源同时被链中的下一个进程所请求
  • 死锁的处理方法
    • 预防死锁:通过某种限制条件,去破坏死锁四个必要条件中的一个或多个,来防止死锁
      • 优点:较易实现,广泛使用
      • 缺点:由于所施加的限制往往太严格,可能导致系统资源利用率和系统吞吐量的降低
    • 避免死锁:不破坏四条件,仅在资源分配的过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生
      • 优点:事先只需要较弱的限制条件,可获得较高的资源利用率和系统吞吐量
    • 检测死锁:事先不采取任何措施,允许死锁发生
      • 优点:检测死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当措施将系统中已发生的死锁清除掉
    • 解除死锁:将进程解脱出来,常用的方法是撤销或挂起进程,回收资源,再将资源分配给阻塞状态的进程
      • 特点:实现难度大,但可获得较好的资源利用率和系统吞吐量

资源分配图

二元组G=

  • N:节点集:分为P,R两部分
    • P={p1,p2,…,pn}进程结点
    • R={r1,r2,…,rm}资源结点
  • E:边的集合,其元素为有序二元组
    操作系统第三章笔记_第7张图片
    资源类:用方框表示
    资源实例:用方框中的黑圆点(圈)表示
    进程:用圆圈中加进程名表示
    分配边:资源实例->进程
    申请边:进程->资源类
    操作系统第三章笔记_第8张图片

死锁预防

破坏“请求和保持”条件

  • 第一种协议:执行时不再提出资源请求
    所有进程开始运行前,一次性申请运行时需要的全部资源,如果有足够资源满足才能运行。运行中不请求,若有资源不足以分配给该进程,则该进程所有的资源即使空闲也不会分配,不保持有资源
    缺点:用户作业必须等待,直到所有资源满足才能运行,一个作业运行时间很短,甚至不会用到。
  • 第二种协议:请求,不保持所有资源
    获得初期的资源就运行,运行过程中先慢慢释放自己的用完的全部资源,再进行请求资源

破坏“不可抢占”条件

一个已拥有资源的进程,若它在提出新资源要求而不能立即得到满足时,它必须释放已经拥有的所有资源待以后需要时再重新申请
缺点:实现复杂且要付出很大代价(以前的工作失效,执行推迟)

破坏“循环等待”条件

系统将所有资源按类型进行线性排序,并赋予不同的序号,所有进程对资源的请求必须严格按照资源序号递增的次序提出,总有一个进程会占用较高序号的资源,此后它继续申请的资源必然是空闲的,因此进程可以一直推进
优点:同前两法相比,其资源利用率和系统吞吐量有较明显的改善
缺点:进程实际需要资源的顺序不一定与资源的编号一致,因此仍会造成资源浪费;资源的序号必须相对稳定,从而限制了新设备的增加

死锁避免

系统安全状态

在系统运行过程中,对进程提出的每一个(系统能满足的)资源申请进行动态检查(安全性检查)根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配

  • 安全状态:如果系统能按照某种顺序为每个进程分配它所需的资源,直到所有进程都能运行完成,称为安全状态。
  • 处于不安全状态的系统不一定会死锁,安全状态一定不会死锁
  • 由安全状态进入不安全状态:如果不按安全序列分配资源,则系统可能会由安全状态进入不安全状态

利用银行家算法避免死锁

操作系统第三章笔记_第9张图片

  • 银行家算法中的数据结构
    • 可利用资源向量Available:是一个含有m个元素的数组
      在这里插入图片描述
    • 最大需求矩阵Max:n*m矩阵,n为进程数,m为资源种类数,Max[i,j]代表第i个进程对j类资源的最大需求
      操作系统第三章笔记_第10张图片
    • 分配矩阵Allocation:n*m矩阵,表示进程已分配的每类资源数
      操作系统第三章笔记_第11张图片
    • 需求矩阵Need:表示进程还需要各类资源数
      操作系统第三章笔记_第12张图片
      Need[i,j]=Max[i,j]-Allocation[i,j]
  • 银行家算法
    • 当Pi发出资源请求,分配一个Request向量
      Requesti:是进程Pi的请求向量
      如果Requesti[j]=K,表示进程i需要K个Rj类型的资源
    • 当进程Pi提出资源申请时Requesti[j],系统执行下列步骤:操作系统第三章笔记_第13张图片
  • 安全性算法
    增加两个向量:Work和Finish
    • Work表示系统可提供给进程继续运行所需的各类资源数目(即在试着分配过程中,系统的可用资源数)
      初始值 Work=Available(可用资源向量)
    • Finish表示系统是否有足够的资源分配给进程i,使之运行完成
      初始值 Finish[i]=false,当有足够资源分配给进程时,Finish[i]=true
      操作系统第三章笔记_第14张图片

银行家算法举例

  • 假设系统中有五个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10,5,7在T0时刻的资源分配情况如下:
    操作系统第三章笔记_第15张图片
    To时刻可以找到一个安全系列,安全序列可以不唯一

  • P1发出请求Request(1,0,2),系统能分配资源吗
    执行银行家算法
    Request1(1,0,2),Need1,Available

    • Request1(1,0,2)<=Need1(1,2,2);
    • Request1(1,0,2)<=Available(3,3,2);
    • 系统为P1进行预分配,并修改Available,Allocation1和Need1向量
    • Available=Available-Request1=(3,3,2)-(1,0,2)=(2,3,0)
    • Allocation1=Allocation1+Request1=(2,0,0)+(1,0,2)=(3,0,2)
    • Need1=Need1-Request1=(1,2,2)-(1,0,2)=(0,2,0)
      操作系统第三章笔记_第16张图片
    • 执行安全性算法
      • Work:=Available=(2,3,0);Finish[i]:=false;
      • 在进程集合中找到Need1=(0,2,0)<=Work;
      • 则设P1可顺利执行完成,从而有:Work:=Work+Allocation1=(2,3,0)+(3,0,2)=(5,3,2);Finish[1]:=true
      • 在进程集合中找到Need3=(0,1,1)<=Work(5,3,2)且FInish[3]=false;

    • 执行安全性算法检查时,仍能够得到安全序列{P1,P3,P0,P2,P4},故请求向量Request1(1,0,2)发出时系统安全!可以将P1请求资源分配给它
    • 还可以找到一个安全序列{P1,P3,P4,P0,P2}操作系统第三章笔记_第17张图片
      根据以上规则P4发出Request(3,3,0),不满足第二步,P0发出请求Request(0,2,0),找不到一个安全序列,系统都不能分配资源

死锁的检测与解除

如果资源分配图中没有环路,则系统中没有死锁,如果图中存在环路则系统中可能存在死锁
如果每个资源类中只包含一个资源实例,则环路是死锁存在的充要条件

死锁的检测

  • 找到一个非阻塞非独立的节点,去掉分配和请求边,变成孤立节点
  • 再将相应资源分配给一个等待该资源的进程,即将某进程的申请边变为分配边
  • 重复以上步骤,如果所有进程都可孤立,则改图是可完全简化的,否则称改图是不可完全简化的
  • 死锁状态的充分条件:资源分配图是不可完全简化的
    操作系统第三章笔记_第18张图片

死锁的解除

抢占资源;终止或者撤销进程(终止所有进程,逐个终止进程)
重要的是以最小的代价解除死锁,恢复系统运行,方法如下:

  • 撤销所有的死锁进程
  • 连续撤销死锁进程直至不再存在死锁
  • 连续剥夺资源直到不再存在死锁
  • 把每个死锁进程备份到前面的定义的某个检测点,并重新启动所有进程

你可能感兴趣的:(笔记,操作系统)