操作系统原理二:处理机调度与死锁

三级调度

高级调度(作业,长程,接纳

  • 将外存作业调入内存,创建PCB,插入就绪队列
  • 一般用于批处理系统,分/实时系统一般直接入内存

低级调度(进程,短程
主要是由分派程序分派处理机
运行频率最高

  • 非抢占式:简单,实时性差
  • 抢占式
    1. 时间片原则
    2. 优先权原则
    3. 短作业优先原则

中级调度(中程

为提高系统吞吐量和内存利用率引入的内外存对换功能

调度队列模型

仅有低级调度

  1. 任务在时间片内已完成,该进程便在释放处理机后进入完成状态
  2. 时间片内尚未完成,OS便将该任务再放入就绪队列的末尾
  3. 在执行期间,进程因为某事件而被阻塞后,被OS放入阻塞队列

低级和高级调度

从外存的后备队列中选择一批作业调入内存,并为它们建立进程,送入就绪队列,然后才由进程调度按照一定的算法选择一个进程,分配处理机

  1. 就绪队列的形式不同
  2. 设置多个阻塞队列

三级调度

进程的就绪状态分为内存就绪外存就绪,类似的也可以将阻塞状态进行划分,分为内存阻塞外存阻塞,在调度操作下,进程可以由内存阻塞转换为外存阻塞。

调度方式准则

\[ cpu利用率= \frac{cpu有效工作时间}{cpu有效工作时间+cpu空闲等待时间} \]

面向用户的准则:周转时间短(常用于批处理系统)

周转时间=作业从提交->完成的时间

周转时间分为:

  1. 驻外(后备队列)等待调度时间
  2. 驻内(就绪队列)等待调度时间
  3. CPU执行时间
  4. 阻塞(I/O操作)时间

平均周转时间
\[ T=\frac{1}{n}[\sum_{i=1}^{n} T_{i}] \]
平均带权周转时间:周转时间T与提供服务的时间Ts之比
\[ T=\frac{1}{n}[\sum_{i=1}^{n} \frac{T_{i}}{T_{s}}] \]

调度算法

先来先服务FCFS

  • 简单,有利于长作业。

短作业优先SJF

  • 降低了平均周转时间和平均带权周转时间(从
    而提高了系统吞吐量)
  • 对长作业不利,有可能得不到服务(饥饿)
  • 估计时间不易确定

死锁

产生死锁的原因

1.竞争资源

  • 可剥夺/抢占(CPU,内存)和非剥夺性死锁(打印机,磁带机)资源
  • 竞争非剥夺性资源
  • 竞争临时性/可消耗资源

2.进程推进顺序不当

设系统有一台打印机(R1),一台输入设备(R2),两进程共用这两台设备。用信号量S1,S2表示R1,R2资源,初值1

产生死锁的必要条件

  1. 互斥条件(资源的临界性):对分配到的资源进行排它性使用
  2. 请求和保持条件:保持了至少一个资源,却又提出了新的资源请求
  3. 不剥夺/不可抢占条件:进程已获得的资源在用完之前不能被抢占
  4. 环路等待:死锁时,必然存在一个进程——资源循环链

处理死锁的方法

预防死锁:破坏四个必要条件之一(有效,资源利用率低

避免死锁:防止进入不安全状态(允许动态申请资源,银行家算法

检测死锁,解除死锁(撤销一些进程

预防死锁

  1. 摒弃互斥条件:互斥是资源固有属性,不能避免。
  2. 摒弃请求和保持条件:资源的一次性分配。
    全分配,全释放(AND)
    • 延迟进程运行
    • 资源严重浪费
  3. 摒弃不可抢占条件:新申请不能满足则释放已获得资源。
    • 增加系统开销,且进程前段工作可能失效。
  4. 摒弃环路条件:资源的有序分配法
    资源有序分配法:为资源编号,申请时需按编号进行。
    • 新增资源不便;(原序号已排定)
    • 用户不自由;
    • 资源与进程使用顺序不同造成浪费

避免死锁

安全状态

  • 某种顺序并发进程都能达到获得最大资源而顺序完成的序列为安全序列。
  • 找到安全序列的状态为安全状态

银行家算法

检测死锁

资源分配图

圆圈表示进程,方框表示资源,方框内点表示资源数,箭头表示“占有”或者“请求”。

死锁定理:S为死锁状态的充分条件是当且仅当S状态的资源分片图是不可完全简化的

  1. 找出一个既不阻塞又非独立的结点,去掉所有分配和请求边
  2. 继续化简,能消去所有边则不会发生死锁

解除死锁

  • 剥夺资源
    把一个资源从一个进程手中抢过来,交给另一个进程使用,等它用完之后,再还给原来的进程。( 在资源剥夺过程中所造成的不良影响的大小,完全取决于该资源自身的性质。实际上,死锁问题正是由不可抢占资源所引起的,所以强行剥夺资源必然会影响进程的正常运行。( 这种方法实现起来有点困难,甚至是不可能的。因此只能选择那些相对而言容易剥夺的资源。
  • 进程回退
    定期地把每个进程的状态信息保存在文件当中,这样就得到一个文件序列,每个文件分别记载了该进程在不同时刻的状态。( 进程的状态信息包括它的内存映象和它所占用的资源的状态。( 当系统检测到死锁时,先查明有哪些资源涉及,然后把其中一个资源的拥有者(进程)回退到以前的某个时刻(尚未拥有该资源),从而打破死锁。但该进程从那时刻开始的所有工作都丢失了
  • 撤消进程
    撤消一个或多个处于死锁状态的进程。( 先撤消一个死锁进程(或未死锁但占用了资源的进程),若其他死锁进程能够运行起来,则说明有效;否则继续撤消进程,直到死锁解除。( 为了减少伤害程度,应尽可能地选择那些能安全地重新运行的进程,如编译进程;而不要去选择那些无法安全地重新运行的进程,如对数据库的更新。

猜你喜欢

转载自www.cnblogs.com/zhxmdefj/p/12088981.html
今日推荐