目录
第三章 处理机调度与死锁
调度的目标:选择哪个一个任务可以分配CPU开始执行
调度是多道程序系统的关键所在。
系统运行性能(如吞吐量大小、周转时间长短、响应及时性等)在很大程度上都取决于调度,特别是处理机调度
一个作业从提交到执行,通常都要经历不同的等待队列从而经历多种不同的多级调度
高级、中级与低级调度
作业调度机制要领
- 作业量确定<-多道程序度(Degree of Multiprogramming)
- 作业选择<-调度算法
高级调度(作业/长程/宏观调度)
- 用于决定把外存上处于后备队列中的哪些作业接纳进入可执行的进程池,并为它们创建进程和分配必要资源;然后,再将新创建进程插入到就绪队列上准备执行
中级调度(实质是存储器管理中的对换功能)
- 为提高内存利用率和系统吞吐量,应使那些暂时不能运行的进程放弃占用内存资源,即调至外存上去等待;当内存稍有空闲时,可将外存中那些重又具备运行条件的就绪进程重新调入内存,修改其状态和挂到就绪进程队列等待进程调度
低级调度(进程/短程调度)
是基本调度,所有类型操作系统均需配置
调度方式:抢占方式、非抢占方式(仅针对低级调度)
调度的时机
调度算法及其评价(非常重要!)
先来先服务调度算法(FCFS)
- 按照作业提交的顺序进行调度。优点是简单易实现,但可能导致"作业长"等待时间和低吞吐量,因为一旦一个长时间的作业进入系统,其他短作业需要等待。
短作业(进程)优先调度算法(SJF/SPF)
- 选择下一个执行的作业是队列中估计执行时间最短的作业。这可以减少平均等待时间和提高系统吞吐量。但是,需要准确估计作业执行时间,而这在实际中很难得到。
高优先权优先调度算法(FPF)
- 每个作业分配一个优先级,调度器选择具有最高优先级的作业执行。这可以根据作业的重要性或其他指标来调度。但可能存在“饥饿”问题,低优先级的作业可能长时间等待。
高响应比优先调度算法(HRRN)
- 通过计算作业的响应比来确定下一个执行的作业,响应比定义为(等待时间 + 作业执行时间)/ 作业执行时间。这种方式综合考虑了等待时间和作业执行时间,可以更有效地减少平均等待时间。
FCFS/SPF高响应算法比较
时间片轮转调度算法(非常重要!)
- 将CPU时间划分为时间片,每个作业在一个时间片内执行,然后进入队列等待下一轮。这样可以确保公平性,但可能存在上下文切换带来的开销,以及长作业影响短作业响应时间的问题。
示例(重要!!)
多级反馈队列调度算法(资源分配算法)
- 将作业队列划分为多个优先级,每个队列可能采用不同的调度策略。作业在不同队列间移动,根据执行情况调整优先级。这种调度器可以结合多种调度策略,适应不同类型的作业。
调度算法总结
死锁产生及处理策略
死锁概念
-
在多道程序系统中,一组进程(线程)中的每一个进程都无限等待被同组的另外一个进程所占有且永远不会释放的资源的状态。
死锁产生的原因
竞争资源
进程推进次序非法
产生死锁的必要条件
- 互斥条件 资源排它性使用,其他进程必须等待
- 请求和保持条件 请求资源未果进程虽阻塞但保持占有资源不放
- 不剥夺条件 进程已获资源未使用完之前不能被剥夺
- 环路等待条件 进程-资源环形链
处理死锁的基本方法
预防死锁 避免死锁 检测死锁 解除死锁
死锁避免策略
预防死锁:设置对程序代码在申请资源环节的限制,只要可以破坏产生死锁的4个必要条件之一,就可防止死锁的发生。
策略1:一次性申请全部资源
策略2:申请失败则释放所有资源
策略3:按升序申请资源(资源排序法),破坏环路等待条件
死锁定理
死锁则一定存在环, 反之存在环,不一定死锁
系统状态S为死锁状态的充要条件是当且仅当该状态下的资源分配图是不可完全化简的。
例题:
状态转移:
初始状态:
P1: wait(R1); wait(R2);
P2: wait(R2); wait(R1);
↓
获取资源R1(P1):
P1: wait(R2);
P2: wait(R2); wait(R1);
↓
获取资源R2(P1):
P1: 无法继续,等待R2释放;
P2: wait(R1);
↓
获取资源R1(P2):
P1: 无法继续,等待R2释放;
P2: 无法继续,等待R1释放;
死锁状态:
P1: 无法继续,等待R2释放;
P2: 无法继续,等待R1释放;
银行家算法(避免死锁的重要算法)
死锁的一些概念
- 安全状态:指系统可按某种进程序列<P1, P2, …, Pn>(称之为安全分配序列)来顺序地为每个进程Pi分配其所需资源满足该进程对资源的最大需求,其完成并释放资源,最终使每个进程均能顺利完成。(最坏情况下,并发执行退化为顺序执行)。
- 不安全状态:系统无法找到一个安全分配序列的系统状态
安全状态下一定没有死锁,如果死锁则一定不是安全状态
银行家算法
背景问题:
银行共有资金800万;A的最大需要金额是600万(不是累计金额),B是400万,C 是500万;假设客户在全部工作完成后会立即全额归还,反之可以不还款。A第一次要求贷款300万,B要求200 万,C要求100万;银行将钱贷给他们后,请问银行可能会破产吗?
算法策略:
- 检查初始状态是否安全状态
- 每个进程的资源申请最大数都不超过系统资源数。 每次进程申请资源,操作系统收到申请后分配资源前都进行检查
- 假设分配后进入安全状态,就分配。
- 假设分配后进入不安全状态,就不予分配。
关键数据结构和主体算法(重要!)
银行家算法应用举例
- 系统资源总量 Available[A,B,C] = {10, 5, 7}
- T0时刻 Available[A,B,C] = {3, 3, 2}
- 求安全分配序列
答案:
安全分配序列为< P1 ,P3 , P4 , P0 , P2 >
处理机调度习题
1. (FCFS,容易)假设有以下三个作业按照到达时间先后顺序到达系统:A、B、C。它们的到达时间(Arrival Time)和执行时间(Burst Time)如下所示:
作业 | 到达时间 | 执行时间 |
---|---|---|
A | 0 | 4 |
B | 1 | 3 |
C | 2 | 5 |
使用先来先服务(FCFS - First Come, First Served)调度算法,计算每个作业的等待时间和平均等待时间。
解答:
首先,按照到达时间的先后顺序,依次执行这三个作业。
- 作业 A 到达时间为 0,执行时间为 4,开始执行作业 A,等待时间为 0。
- 作业 A 执行完毕,时钟为 4,作业 B 到达时间为 1,但在时钟 4 之前已经到达,所以开始执行作业 B,等待时间为 3(时钟 4 - 到达时间 1)。
- 作业 B 执行完毕,时钟为 7,作业 C 到达时间为 2,但在时钟 7 之前已经到达,所以开始执行作业 C,等待时间为 5(时钟 7 - 到达时间 2)。
因此,作业 A 的等待时间为 0,作业 B 的等待时间为 3,作业 C 的等待时间为 5。
平均等待时间 = (0 + 3 + 5)/ 3 = 8 / 3 ≈ 2.67 个单位时间。
所以,使用先来先服务调度算法时,作业 A 的等待时间为 0,作业 B 的等待时间为 3,作业 C 的等待时间为 5,平均等待时间为约 2.67 个单位时间。
2. 先来先服务、高响应比优先、短作业优先、时间片轮转等调度算法中,哪个吞吐量最大?为什么?
解答:时间片轮转算法具有较高的吞吐量,原因如下:
-
公平性: 时间片轮转算法能够保证每个进程都能获得CPU时间片,因此能够较好地实现公平性。这样可以避免长作业霸占CPU,同时短作业也能够及时执行,从而提高了整体的吞吐量。
-
快速响应时间: 时间片轮转算法通常对于每个进程都分配一个较小的时间片,在这个时间片内执行,因此可以快速地响应用户的请求,从而提高了系统的响应速度。
虽然短作业优先和高响应比优先算法也可以在一定程度上提高系统的吞吐量和响应时间,但这两种算法有可能导致长作业等待时间过长或者某些作业出现饥饿现象,而时间片轮转算法能够更好地避免这些问题,因此在多数情况下,时间片轮转算法具有较高的吞吐量。
3. 假设有五个进程按P1、P2、P3的顺序分布在时刻0、1、2到达,且其预计运行时间分别为4毫秒、2毫秒、3毫秒。试分别给出系统实施短进程优先调度算法、时间片轮转调度算法(不妨设时间片大小为1毫秒)和高响应比优先权优先调度算法的运行情况(运行次序、运行时刻和运行时间、平均周转时间和平均带权周转时间)。
解答:给定进程信息如下:
进程 | 到达时间 | 预计运行时间 |
---|---|---|
P1 | 0 | 4 |
P2 | 1 | 2 |
P3 | 2 | 3 |
短进程优先调度算法(Shortest Job First - SJF)
- 短进程优先调度算法运行情况:
按照预计运行时间排序:P2(2ms) -> P3(3ms) -> P1(4ms)
进程 | 到达时间 | 开始运行时间 | 结束时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|
P2 | 1 | 1 | 3 | 2 | 1 |
P3 | 2 | 3 | 6 | 4 | 1.33 |
P1 | 0 | 6 | 10 | 10 | 2.5 |
平均周转时间: (2 + 4 + 10) / 3 = 5.33 毫秒
平均带权周转时间: (1 + 1.33 + 2.5) / 3 = 1.61 毫秒
时间片轮转调度算法
- 时间片轮转调度算法运行情况:
时间片大小为1毫秒。
进程 | 到达时间 | 开始运行时间 | 结束时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|
P1 | 0 | 0 | 4 | 4 | 1 |
P2 | 1 | 4 | 6 | 5 | 2.5 |
P3 | 2 | 6 | 9 | 7 | 2.33 |
平均周转时间: (4 + 5 + 7) / 3 = 5.33 毫秒
平均带权周转时间: (1 + 2.5 + 2.33) / 3 = 1.94 毫秒
高响应比优先权调度算法
- 高响应比优先权调度算法运行情况:
首先,计算每个进程的响应比,响应比 = (等待时间 + 预计运行时间) / 预计运行时间
进程 | 等待时间 | 预计运行时间 | 响应比 |
---|---|---|---|
P1 | 0 | 4 | 1 |
P2 | 1 | 2 | 1.5 |
P3 | 2 | 3 | 1.67 |
按照响应比降序执行进程:P1 -> P2 -> P3
进程 | 到达时间 | 开始运行时间 | 结束时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|
P1 | 0 | 0 | 4 | 4 | 1 |
P2 | 1 | 4 | 6 | 5 | 2.5 |
P3 | 2 | 6 | 9 | 7 | 2.33 |
平均周转时间: (4 + 5 + 7) / 3 = 5.33 毫秒
平均带权周转时间: (1 + 2.5 + 2.33) / 3 = 1.94 毫秒
在这个特定的进程序列和运行时间条件下,短进程优先、时间片轮转和高响应比优先权这三种调度算法得到的平均周转时间和平均带权周转时间是相同的,分别为约5.33毫秒和约1.94毫秒。
死锁习题
1. 死锁、资源分配图有环、非安全状态之间是什么关系?
资源分配图有环和非安全状态是死锁发生的一种指示,但并非必然导致死锁,它们是死锁发生的潜在风险和条件。死锁是其中最严重的情况,是由于资源互相等待而无法继续运行。
2. 有N个进程,每个进程访问M个资源。一定不会导致死锁的最少资源数是多少?
不死锁时,满足的条件是:,其中R表示资源总数。