【操作系统】第八章——进程调度算法

一、背景

1、上下文切换与CPU调度:【承上启下】

(1)上下文切换

  • 切换CPU的任务,切换的实体为线程或进程
  • 要保存当前CPU的状态,便于之后的现场恢复【也就是保存TCB/PCB的上下文】
  • 读取下一个线程/进程的上下文

(2)CPU调度

  • 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程
  • 调度程序:挑选进程/线程的内核函数(通过一些调度策略)

2、在进程/线程的生命周期中的什么时候进行调度?

在一个状态变换到另一个状态,特别是与运行状态相关的变换【运行 >> 就绪、运行 >> 退出、运行 >> 阻塞】

请添加图片描述

3、什么情况下内核会运行调度程序?

(1)可以为一个进程从运行状态切换到等待状态

(2)可以为一个进程结束了

  • 大部分情况下我们调度的是应用程序【运行时以用户态的进程形式存在】
  • 分为两种情况:

(1)不可抢占(非抢占式)

调度程序必须等待事件结束,也就是进程启动之后不能被打断

(2)可以抢占(抢占式)

调度程序在中断被响应后执行
当前进程从运行切换到就绪,或者一个进程从等待切换到就绪
当前运行的进程可以被换出

二、调度准则

3、进程在操作系统中的运行状态是怎样的?【程序执行模型】

请添加图片描述

此处以一个进程为例,可以看到CPU的使用频率是波动的,说明程序在CPU突发和I/O中交替

  • 每个调度决定的是在下一个CPU突发时将哪个工作交给CPU
  • 在时间分片机制下,线程可能在结束当前CPU突发前被迫放弃CPU【抢占式】

4、可以从哪些方面了比较一个调度算法?

(1)CPU使用率:CPU处于忙状态所占时间百分比

(2)吞吐量:在单位时间内完成的进程数量【操作系统的计算带宽】

(3)周转时间:一个进程从初始化到结束,包括所有等待时间所花费的时间

(4)等待时间:进程在就绪队列中的总时间

(5)响应时间:从一个请求被提交到产生第一次响应所花费的总时间【操作系统的计算延迟】

  • 更快:高宽带、低延迟、
  • 减少响应时间:及时处理用户的输出并且尽快将输出提供给用户
  • 减少平均响应时间的波动:在交互系统中,可预测性比高差异低平均更重要
  • 增加吞吐量:减少系统开销、提高系统资源的利用率
  • 减少等待时间:减少每个进程的等待时间

5、公平是调度算法的一种重要衡量指标:

(1)保证每个进程占用CPU的时间大致相同

(2)进程等待的时间也大致相同


三、调度算法

1、先来先服务调度算法(FCFS)

  • 该算法是采用先进先出队列实现的:如果进程在执行过程中阻塞,队列中的下一个会得到CPU
  • 通过案例分析:

请添加图片描述

从程序开始执行计算周转时间,我们看到的平均周转时间;

通过对比可以发现,短队列如果在前面会降低周转时间

  • 先来先服务调度算法的特点:

(1)优点:实现简单

(2)缺点:

平均等待时间波动较大

花费时间少的任务可能排在花费时间长的任务后面【这就导致等待的时间会很长】

没有考虑抢占,可能导致I/O和CPU之间的重叠处理


2、短任务优先调度算法

  • 进程的执行时间越短,调度的优先级就越高
  • 通过案例分析:

请添加图片描述

pw、px、py、pz为四个进程,c代表预测的执行时间

通过调度算法来完成就绪进程队列的的排序

  • 如果新来一个进程,而且它的执行时间比当前运行进程的时间短怎么办?

(1)方案一:继续运行当前的进程,将新来的进程插入到就绪队列的队首,不会立刻去执行这个新来的队列【非抢占式,SPN】

(2)方案二:将当前进程从运行态切换到就绪态,并重新挂回到就绪队列中,让这个新进程去占用CPU执行【抢占式,最短剩余时间的策略,SRT】

请添加图片描述

SPN方法可以保证平均周转时间是最短的

  • 短任务优先调度算法的问题:

(1)连续的短任务流会使长任务饥饿

(2)短任务可用时的任何长任务的CPU时间都会增加平均等待时间

(3)要预先知道进程任务的执行时间【利用执行的历史数据去预测】
请添加图片描述
请添加图片描述

3、最高响应比优先调度算法(HRRN)

  • 属于短进程优先调度算法的一种改进 >> 不可抢占 + 进程等待时间【防止无限期推迟】
  • 最高相应比公式:R = (w + s) / s【w:等待时间、s:执行时间】

4、轮循调度算法(RR)

  • 各个进程轮流占用CPU【体现了公平策略】

请添加图片描述

  • 案例分析:

请添加图片描述

p1-p4四个进程,甘特图为占用CPU的时间片,计算了每个进程的等待时间和平均等待时间

  • 轮循算法的局限性:【时间量子就是时间片】

(1)额外的上下文切换导致很大的开销

(2)如果时间片太小。尽管反应迅速,不过吞吐量会受到大量上下文切换的影响

(3)如果时间片太大。会导致等待时间过长,极限情况下退化到先到先处理调度算法

所以应该选择一个合适大小的时间量子,维持上下文切换开销处于1%以内

  • 分析不同时间片的大小对平均等待时间的影响:

请添加图片描述

5、多级队列调度算法

  • 就绪队列被划分为独立的队列,不同的队列采用不同的调度算法
  • 当高优先级的任务完成之后,再去执行低优先级的任务
    请添加图片描述

6、多级反馈队列调度算法(MFQ)

  • 反馈体现在进程可以在不同的队列中移动
  • 进程任务随着等待时间变长,它的优先级会不断变高

请添加图片描述

7、公平共享调度算法(FFS)

请添加图片描述

8、调度算法的测评方法与汇总:

请添加图片描述

请添加图片描述

四、实时调度

之前为面向通用操作调度算法,实时操作系统一般用于工业控制


1、什么是实时系统?

  • 一种正确性依赖于其时间和功能两方面的操作系统

  • 性能指标体现在两方面:时间约束的及时性、速度和平均性能相对不重要

  • 主要特性:时间约束的可预测性

  • 实时系统又分为两类:

(1)强实时系统:需要在保证的时间内完成重要的任务,必须完成

(2)弱实时系统:要求重要的进程的优先级更高,尽量完成,并非必须

  • 一次实时任务:

请添加图片描述

(1)就绪后不会立刻执行,在这段时间内执行

(2)Relative deadline 是相对截止时间,Absolute deadline是真正结束的时间

(3)Execution time 是实际执行的时间

  • 周期任务:

请添加图片描述

从图中可以看出时限为5,蓝色部分为实际执行

2、对于强弱实时系统的时限有什么要求呢?

(1)硬时限

  • 如果错过了最后期限,可能发生非常严重的后果
  • 必须事先验证在最坏的情况下是否能满足时限
  • 保证确定性

(2)软时限

  • 理想情况下,时限应该被最大满足,没有满足就相应的降低要求
  • 尽最大努力保证

3、设置什么样的调度算法满足硬实时和软实时的调度需求?

  • 静态优先级调度:在任务执行前就已经确定了任务的优先级
  • 动态优先级调度:在任务执行过程中,任务的优先级不断变化

请添加图片描述

请添加图片描述

五、多处理器调度

1、在有多个CPU的情况下,如何完成多个进程并行的调度?

这就要涉及到我们多处理器的调度算法了。

如何确保CPU的负载平衡?

请添加图片描述

六、优先级反转

请添加图片描述
请添加图片描述

通过优先级继承来解决,访问共享资源速度变快

请添加图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,进程调度算法操作系统中非常重要的一部分。常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)、时间片轮转(RR)等。下面是这些算法的 Python 实现: 1. 先来先服务(FCFS): ```python def FCFS(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 2. 短作业优先(SJF): ```python def SJF(processes): processes = sorted(processes, key=lambda x: x['burst_time']) waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 3. 高响应比优先(HRRN): ```python def HRRN(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for i, process in enumerate(processes): if i == 0: completion_time = process['burst_time'] else: response_ratio_list = [] for j in range(i): response_ratio = (completion_time - processes[j]['arrival_time'] + processes[j]['burst_time']) / processes[j]['burst_time'] response_ratio_list.append(response_ratio) max_response_ratio_index = response_ratio_list.index(max(response_ratio_list)) selected_process = processes.pop(max_response_ratio_index) completion_time += selected_process['burst_time'] turn_around_time += completion_time - selected_process['arrival_time'] waiting_time += turn_around_time - selected_process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 4. 时间片轮转(RR): ```python def RR(processes, time_slice): waiting_time = 0 turn_around_time = 0 completion_time = 0 while processes: for i in range(len(processes)): if processes[i]['burst_time'] > time_slice: completion_time += time_slice processes[i]['burst_time'] -= time_slice else: completion_time += processes[i]['burst_time'] turn_around_time += completion_time - processes[i]['arrival_time'] waiting_time += turn_around_time - processes[i]['burst_time'] processes.pop(i) break return waiting_time / len(processes), turn_around_time / len(processes) ``` 这里的 `processes` 是一个列表,其中每个元素是一个字典,表示一个进程的信息,如下所示: ```python processes = [ {'name': 'P1', 'arrival_time': 0, 'burst_time': 8}, {'name': 'P2', 'arrival_time': 1, 'burst_time': 4}, {'name': 'P3', 'arrival_time': 2, 'burst_time': 9}, ... ] ``` 在这个列表中,每个进程有一个名称、到达时间和执行时间。你可以根据自己的需要修改这些信息,来测试这些进程调度算法的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bow.贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值