操作系统第三章处理机调度与死锁
Posted 九死九歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统第三章处理机调度与死锁相关的知识,希望对你有一定的参考价值。
2.2_1 处理及调度的概念、层次
1.调度是弄啥呢?
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。
在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
调度分为作业调度、内存调度和进程调度。这分别是调度的三个层级。
2.七状态模型:
我们前面讲过了五状态模型:创建、就绪、阻塞、运行、终止。408里面要考就是考这种模型的,但是防不住你万一想考其他学校呢?有的学校用的就是这个七状态模型。
而且咱们今天要讲的调度的三个层级还要用到这个七状态模型呢。
3.高级调度:
2.中级调度:
3.低级调度:
4.表格对比三个层次:
要做什么 | 发生时刻 | 发生频率 | 对进程状态的影响 | |
---|---|---|---|---|
高级调度 (作业调度) | 按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程 | 外存→内存 (面向作业) | 最低 | 无→创建态→就绪态 |
中级调度 (内存调度) | 按照某种规则,从挂起队列中选择合适的进程将其数据从外存中调回内存 | 外存→内存 (面向进程) | 中等 | 就绪挂起→就绪 阻塞挂起→阻塞 |
低级调度 (进程调度) | 按照某种规则,从就绪队列中选择一个进程为其分配处理机 | 内存→CPU | 最高 | 就绪→运行 |
2.2_2 进程调度的时机、切换与过程、方式
1.进程调度的时机
进程调度嘛,又称低级调度。就是按照某种算法,从就绪队列中选一个进程为他分配处理机。
需要进行进程调度与切换的情况:
不能进行进程调度与切换的情况:
咱们现在看一个概念和一个考研真题:
我们得先了解一些概念:
对于操作系统的内核程序临界区:
对于一般的临界区:
总体概括一下:
2.进程调度的方式:
3.进程的切换与过程:
2.2_3 调度算法的评价指标
1.CPU利用率:
由于早期的CPU造价昂贵,因此人们总是希望让CPU尽可能忙碌地工作。
CPU利用率:指CPU忙碌时间占总时间的比率。
利
用
率
=
忙
碌
时
间
总
时
间
利用率=\\frac{忙碌时间}{总时间}
利用率=总时间忙碌时间(有的题还会考单独某个设备的利用率,计算方法和CPU利用率是一样的)
2.系统吞吐量:
系统吞吐量是单位时间内完成的作业数量
系
统
吞
吐
量
=
完
成
作
业
数
量
消
耗
的
时
间
系统吞吐量=\\frac{完成作业数量}{消耗的时间}
系统吞吐量=消耗的时间完成作业数量
3.周转时间:
对于计算机的用户来说,他很关心自己的作业从提交到完成花了多少时间。
周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。
它包括四个部分:① 作业在外存后备队列上等待作业调度(高级调度)的时间、② 进程在就绪队列上等待进程调度(低级调度)的时间、③ 进程在CPU上执行的时间、④ 进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。
周 转 时 间 = 作 业 完 成 时 刻 − 作 业 提 交 时 刻 周转时间=作业完成时刻-作业提交时刻 周转时间=作业完成时刻−作业提交时刻(对于用户来说,更关心自己的单个作业的周转时间)
平 均 周 转 时 间 = 各 作 业 周 转 时 间 之 和 作 业 数 平均周转时间=\\frac{各作业周转时间之和}{作业数} 平均周转时间=作业数各作业周转时间之和(对于操作系统来说,更关心系统的整体表现,因此更关心所有作业周转时间的平均值)
另外,还有一个概念,带权周转时间。
2.2_5 六种调度算法
1.FCFS算法:
算法思想:主要从“公平”的角度考虑(类似于我们生活中排队买东西的例子)
算法规则:按照作业/进程到达的先后顺序进行服务。
用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列。
是否可抢占?非抢占式的算法。
优点:公平、算法实现简单。
缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利。
是否会导致饥饿?不会。
例题:
2.短作业优先算法(SJF:Short Job First):
算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间。
算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(( SPF, Shortest Process First)算法”
是否可抢占?SJF和SPF是非抢占式的算法。但是也有抢占式的版本――最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)
优点:“最短的”平均等待时间、平均周转时间。
缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。
是否会导致饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”。
例题:
几点注意:
3.高响应比算法(HRRN):
算法思想:要综合考虑作业/进程的等待时间和要求服务的时间。
算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。 响 应 比 = 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 响应比=\\frac{等待时间+要求服务时间}{要求服务时间} 响应比=要求服务时间等待时间+要求服务时间
用于作业/进程调度:即可应用于作业调度,也可应用于进程调度。
是否可抢占?非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
优缺点:综合考虑了等待时间和运行时间(要求服务时间),等待时间相同时,要求服务时间短的优先(SJF的优点)要求服务时间相同时,等待时间长的优先(FCFS的优点)对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题。
是否会造成饥饿问题:不会的。
例题:
4.前三种调度算法的对比:
算法 | 可否抢占 | 优点 | 缺点 | 考虑到了等待时间&运行时间? | 会导致饥饿? |
---|---|---|---|---|---|
FCFS | 非抢占式 | 公平:实现简单 | 对短作业不公平 | 等待时间√ 运行时间× | 不会 |
SJF/SPF | 默认为非抢占式,也有SJF的抢占式版本最短剩余时间优先算法(SRTN) | “最短的”平均等待/周转时间; | 对长作业不利,可能导致饥饿;难以做到真正的短作业优先 | 等待时间× 运行时间√ | 会 |
HRRN | 非抢占式 | 上述二者折中 | 上述二者折中 | 等待时间√ 运行时间√ | 不会 |
注:前三种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统,当然,FCFS算法也常结合其他的算法使用,在现在也扮演着很重要的角色。而适合用于交互式系统的调度算法则是下面要介绍的后三种算法。
5.时间片轮转算法:
6.优先级调度算法:
7.多级反馈队列调度算法:
8.后三种调度算法的对比:
2.3_1 进程互斥的软件实现方法:
1.单标志法:
2.双标志先检查法:
3.双标志后检查法:
4.peterson算法:
2.3_2 进程互斥的硬件实现方法:
1.中断屏蔽法:
2.TestAndSet指令:
3.Swap指令:
2.3_3 信号量机制
1965年,荷兰学者Dijkstra提出的信号量(Semaphores)机制是目前最牛逼的硬件实现进程同步的方式,没有之一。
1.整型信号量:
2.记录型信号量:
3.信号量机制实现进程互斥同步:
互斥需要一个值为1的mutex信号量。
同步需要前v后p。多说无益,看算法里面怎么用理解起来效率更高。
2.3_4 进程互斥同步相关算法
【操作系统&数据结构图论】用有向图临接矩阵获得满足该前驱关系的线程数组
【操作系统&java多线程技术】几种信号量机制算法
2.3_5 管程机制
1.为什么要引入管程机制:
2.管程的定义和特征:
3.用管程解决生产者消费者问题:
2.4_1 死锁的概念
1.死锁的基本概念:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁与饥饿、死循环的区别于共同点。
共同点 | 区别 | |
死锁 | 都是进程无法顺利向前推进的现象(故意设计的死循环除外) | 死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。 |
饥饿 | 可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的I/o设备),也可能是就绪态(长期得不到处理机) | |
死循环 | 可能只有一个进程发生死循环。死循环的进程可以上处理机运行(可以是运行态),只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题。 |
2.产生死锁的条件:
产生死锁必须同时满足一下四个条件,只要其中任一条件不成立,死锁就不会发生。
- 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。
- 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
PS:注意!发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)
如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。
3.什么时候会发生死锁:
4.死锁的处理策略:
2.4_2 如何预防死锁
2.4_3 如何避免死锁
一句话,银行家算法。
2.4_4 如何检测和解除死锁
1.死锁的检测:
为了能对系统是否已发生了死锁进行检测,必须:① 用某种数据结构来保存资源的请求和分配信息;② 提供一种算法,利用上述信息来检测系统是否已进入死锁状态。
如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。如果这个进程执行结束了把资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利地执行下去。相应的,这些被激活的进程执行完了之后又会归还一些资源,这样可能又会激活另外一些阻塞的进程…
如果按上述过程分析,最终能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁(相当于能找到一个安全序列)
如果最终不能消除所有边,那么此时就是发生了死锁。例如下面这个。
消着消着最后还连着边的进程就是死锁进程,如图中P3就不是死锁进程,只有P1 P2是。
2.死锁的解除:
以上是关于操作系统第三章处理机调度与死锁的主要内容,如果未能解决你的问题,请参考以下文章