3.1处理机调度的基本概念

处理机的调度与死锁

作业-任务实体

进程-执行实体

一个作业由多个进程组成

3.1.1三种调度

1 高级调度

高级调度也称为作业调度

分配除cpu以外的资源

外存->内存就绪队列

2 低级调度

低级调度也称为进程调度

分配cpu

进程调度的两种调度方式

  1. 非抢占方式

  2. 抢占方式

3 中级调度

对挂起操作的调度

外存->内存

实际上就是存储器管理的对换功能

5_1.png

3.1.2调度队列模型

...

3.1.3选择调度方法和调度模型的准则

3.1.3.1 不同系统下的调度指标

系统类别 指标
批处理系统 周转时间
分时系统 响应时间
实时系统 截止时间

3.1.3.2 调度指标的计算方法


$$ {\small 周转时间T=外存后备队列等待作业调度+就绪队列等待进程调度+cpu执行时间+I/O阻塞等待} $$

$$ 周转时间T=完成时间-到达时间 $$


$$ 带权周转时间W=\frac{T}{服务时间T_{s} } $$

带权周转时间W越高说明等待时间越长

服务时间:作业被CPU调度的时间


$$ 平均周转时间\bar{T}=\frac{1}{作业个数n}[\sum_ {i=1}^{n} T_{i}] $$


$$ 平均带权周转时间\bar{W} =\frac{1}{n}[\sum_{i=1}^{n} \frac{T}{T_{s} }] $$


带权周转时间-反应作业的等待时间长短=作业的周转时间/系统提供服务的时间

$$ {\small 响应时间=外设传输时间+处理机处理时间+终端显示时间} $$


$$ 截止时间=开始执行的最迟时间或完成的最迟时间 $$


3.1.3.3 调度模型的准则

1 面向用户的准则

2 面向系统的准则

3.2调度算法

名词 计算方法
周转时间 完成时间-到达时间
带权周转时间 周转时间/服务时间

5_2.png

3.2.1 FCFS 先来先服务

先入就绪队列的先分配

利于长作业

利于CPU繁忙型

不利于I/O繁忙型

3.2.2 SJF & SPF 短作业(短进程)优先

服务时间短的作业优先到达时间最早的依旧先执行

利于提高吞吐量

不利于长作业、紧迫性作业

不一定真正做到短优先

5_3.png

3.2.3 FPF 高优先权优先

HRRN高响应比优先调度算法。

进程分为抢占式、非抢占式:

	  graph LR
	  A(进程)
      A  --- B(抢占式)
      A  --- C(非抢占式)
    

优先权的类型:

	  graph LR
	  A(优先权)
      A  --- B(动态)
      A  --- C(静态)
    

优先权计算方法: $$ 优先权Rp=\frac{等待时间+要求服务时间}{要求服务时间}=\frac{响应时间}{要求服务时间} $$

优先权越大,优先级越高

等待时间=上一个进程的完成时间-这个到达时间

5_4.png

3.2.4 RR 时间片轮转的调度算法

常用于分时系统

  1. RR时间片轮转算法

    时间片大小的确定

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

    目前公认最好

    (1) 时间片短优先权高

    (2) 就绪队列采用FCFS;上一个队列没完成的进程会调入下一个就绪队列

​ (3) 仅当上一个队列空闲时才会进入下一个队列

5_5.png

3.3实时调度算法

硬实时

软实时

3.3.1实时调度的基本条件

  1. 提供必要信息

    就绪时间、截至时间、处理时间、资源要求、优先级

  2. 系统处理能力强 $$ \sum_{i=0}^{n} \frac{Ci}{Pi}\le N $$ n个(硬)实时任务,Ci处理时间,Pi周期时间,N处理机数(默认为1)

  3. *抢占式调度

  4. 具有快速切换机制

    中断快速相应、任务快速分派

3.3.2实时调度算法分类

	  graph LR
	  A(实时调度算法)
      A  --- B(非抢占调度)
      B  --- D(非抢占式轮转调度)
      B  --- G(非抢占式优先级调度)
      A  --- C(抢占调度)
      C  --- E(基于时钟中断的抢占式优先权调度算法)
      C  --- F(立即抢占的优先权调度)
    

3.4多机处理的实时调度

3.4.1常用的几种实时调度算法

1 最早截止时间优先EDF(Earliest Deadline First)算法

截止时间早的优先权高

2 最低松弛度优先LLF(Least Laxity First)算法

紧急程度高(松弛度小)优先权高

松弛度计算: $$ 松驰度=必须完成时间-本身的运行时间-当前时间 $$ 发生切换的情况:当前任务完成或下一个任务的松弛度=0

3.5产生死锁的原因和必要条件

死锁(Deadlock):是指多个进程在运行过程中因争夺资源而造成的 一种僵局,当进程处于这种状态时,若无外力作用,它们都将无法再 向前推进。

产生死锁的原因:

	  graph LR
	  A(产生死锁的原因)
      A  --- B(资源竞争)
      A  --- C(进程间推进顺序非法)
    

3.5.1产生死锁的原因

  1. 资源竞争

    (1) 可剥夺资源-不会引起进程死锁

    ​ CPU、主存

    (2) 不可剥夺资源-可能会发生死锁-临界资源

    ​ 磁带机、打印机

    (3) 独占资源

  2. 进程间推进顺序非法

3.5.2产生死锁的必要条件

  1. 互斥条件

    访问的临界资源

  2. 请求和保持条件

    请求别的资源但不放弃自己的资源

  3. 不剥夺条件

    不能抢其他进程拿到的资源

  4. 环路等待条件

    死锁环形链

3.6预防死锁的方法

  1. 预防死锁

    破坏产生死锁的必要条件

  2. 避免死锁

    防止系统进入不安全状态

    ​ 不是所有的不安全状态都是死锁状态

  3. 检测死锁

  4. 解除死锁

避免死锁-银行家算法

1) 数据结构:

m类资源,n个进程

(1) 可利用资源Avaliable - 一维数组

Avaliable[j]=k,j类资源有k个(2) 最大需求矩阵Max - n*m矩阵

Max[i,j]=k,进程i需要j类资源的最大数是k个

(3) 分配矩阵Allocation - n*m矩阵

Allocation[i,j]=k,进程i已分配j类资源k个

(4) 需求矩阵Need - n*m矩阵

Need[i,j]=k ,进程i需要j类资源k个

三个矩阵的关系:Need[i,j] = Max[i,j] - Allocation[i,j]

2) 处理步骤:

用于求解进程i请求k个j类资源

(1) Request[j] <= Need[i,j] 成立则进行第二步

(2) Requese[j] <= Allocation[i,j] 成立则进入第三步

(3) 系统试探着给i分配资源

分配前 分配后
Avaliable[j] Avaliable[j] - Request[j]
Allocation[i,j] Allocation[i,j] + Request[j]
Need[i,j] Need[i,j] - Request[j]

(4) 系统执行安全性算法

3) 安全性算法:

(1) step1:设置两个向量

向量 解释 类型
work[j] 工作向量,表示系统可供给的j类资源数目;初始work=Avaliable
Finish[i] 初始Finish[i]=false(i=1...n),分配资源后Finish[i]=true 含n个元素的一维数组

安全性检测就是要验证程序按照某顺序执行完n个进程后,Finish是否都为true

​ goto step2

(2) step2:判断进程是否有资源可以分配

​ 满足 Finish[i] = false; Need[i,j] <= work[j];则goto step3,否则goto step4

(3) step3:待进程运行完成后收取进程释放的资源 Allocation[i,j] ,并对进程的 Finish[i]进行标记。跳转至step2,直到没有资源分配或没有进程需要资源。

work[j] = work[j] + Allocation[i,j];
Finish[i] = true;
goto step 2

(4) step4:如果所以进程的 Finish[i] = true;都满足,则系统处于安全状态,否则系统处于不安全状态

4) 例子:

5_6.png

5_7.png

3.7死锁的检测与解除

3.7.1死锁的检测

基本思路:

  1. 保存资源请求分配信息;
  2. 提供一种解析信息的算法判断是否进入死锁

资源分配图可以用来描述系统的死锁

死锁状态 ——> 资源分配不可完全简化

3.7.2死锁的解除

  1. 剥夺资源
  2. 撤销进程

已有 2 条评论

  1. yangwenbin 的 npy
    yangwenbin 的 npy 2024-05-13 18:30
    回复

    😍

发表评论