注意事项:
序号有点问题,影响不大,内容都是各种资料整合和我自己归纳总结的,不喜勿喷,感觉扔回收站可惜了,所以分享出来,能有帮上你的忙就最好不过了,更多复习资料,可以去看我的合集。
第三章:处理机调度与死锁
1. 处理机调度的层次:
- 高级调度:作业调度、长程调度;作业;主要应用在批处理系统。
- 低级调度:进程调度、短程调度;进程(或内核级线程);多道批处理、分时、实时系统都必须配置。
- 中级调度:又称为内存调度,交换调度;进程。
2. 批处理系统的目标:
- 平均周转时间短
- 系统吞吐量高
- 处理机利用率高
3. 作业与作业调度:
- 作业:
-
- 程序段+数据段+作业说明
- 批处理系统中,从外存调入内存的基本单位
- 作业步:作业中相互独立又相互关联的顺序加工步骤
- 作业控制块(JCB):作业在系统中存在的标志,保存了系统对作业进行管理和调度所需的全部信息
- 作业运行的三个阶段和三种状态:
-
- 收容阶段:作业被输入到硬盘上,为其建立JCB,并把它放入后备队列的过程。(后备状态)
- 运行阶段:从第一次进入就绪状态开始,直到它运行结束前。(运行状态)
- 完成阶段:作业运行完成或者异常结束。程序回收JCB和所有资源,并将作业运行结果信息形成输出文件后输出。(完成状态)
- 作业调度的主要任务:
-
- 根据JCB中信息检查系统资源能否满足作业对资源的需求
- 按照一定的调度算法从外存后备队列中选取某些作业调入内存;
-
-
- 选择标准:
-
-
-
-
- 接纳多少个作业?~多道程序度=允许多少个作业同时在内存中运行
- 接纳哪些作业?~调度算法
-
-
-
-
-
-
- 最简单:先来先服务 调度算法:将最早进入外存的作业优先调入内存
- 较常用:短作业优先 调度算法:将外存上所需执行时间最短的作业优先调入内存
- 较常用:作业优先级 调度算法:将外存上作业优先级最高的作业优先调入内存
- 比较好:响应比高者优先 调度算法
-
-
-
-
- 为调入内存的作业创建进程,分配必要的资源
- 将新创建的进程排在就绪队列上等待调度
3.1. 先来先服务 调度算法 FCFS :可应用于作业调度和进程调度,非抢占
- 作业调度:最先进入后备作业队列,最先调入内存
- 进程调度:最先进入就绪进程队列,最先分配处理机
3.2. 短作业优先 调度算法 SJF :作业越短,优先级越高,非抢占,(也有抢占的,可能不考)
- 作业的长短~作业所要求的运行时间挂钩
- SJF 的缺点:
-
- 必须预支作业的运行时间
- 对长作业非常不利
- 无法实现人机交互
- 不能保证紧迫性作业得到及时处理
3.3. 高响应比优先 调度算法 HRRN:非抢占式
- FCFS 算法只考虑 作业的等待时间,忽视 作业的运行时间,SJF 算法只考虑 作业的运行时间,忽视 作业的等待时间,高响应比优先 调度算法 HRRN 就兼顾二者,既照顾了短作业,又不让长作业的等待时间过长,从而改善了处理机的调度性能
- 关键在于:动态优先级:随等待时间延长而增加
- 优先级=响应比 Rp=等待时间+要求服务的时间/要求服务的时间=响应时间/要求服务的时间
-
- 等待时间+要求服务的时间=响应时间
- 优点:
-
-
- 如果作业的等待时间相同,则短作业优先
- 如果作业要求服务的时间相同,则先到达的作业优先
- 如果作业较长,则其优先权会随着等待时间的增加而逐渐提高
-
3.4. 优先级 调度算法 PSA :基于作业的紧迫性
4. 进程调度:
- 任务:
-
- 保存处理机的现场信息
- 按照某种算法选取进程
- 把处理器分配给进程
- 方式:
-
- 非抢占方式:一旦处理机分配给某个进程之后,就一直让它运行下去,直至进程完成或被阻塞。
-
-
- 优点:实现简单,系统开销小,适用于大多数批处理系统
- 缺点:不能用于分时系统和大多数实时系统
-
-
- 抢占方式:允许调度程序根据某种原则,暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一个进程
-
-
- 抢占原则:
-
-
-
-
- 优先权原则:允许 优先级高的新到进程 抢占当前进程的处理机
- 短进程优先原则:允许 新到的短进程 抢占 当前长进程的处理机
- 时间片原则:各进程按时间片轮转运行时,当正在执行的进程的一个时间片用完后,便停止对该进程的执行而重新调度
-
-
4.1. 轮转 调度算法 RR:只适用于进程调度,不适用于作业调度,分时系统,抢占式
- 基本原理:系统根据FCFS(FIFO)策略,将所有就绪进程排成一个就绪队列,并设置每隔一段时间激活系统的进程调度,将CPU分配给队首进程。
- 进程切换时机:
-
- 若一个时间片未完,但是正在运行的进程已经完成
- 一个时间片用完
- 时间片大小的确定:
-
- 略大于一次典型交互所需的时间,使得绝大多数的交互式进程都能在一个时间片内完成,从而得到很小的响应时间
- 缺点:切换次数多,系统开销大,无法区分进程的紧迫性
4.2. 优先级 调度算法:实时系统
- 定义:把处理机分配给就绪队列中优先级最高的进程。
- 算法 类型:
-
- 非抢占式 优先级 调度算法:当前正在执行进程的处理机不会被抢占。
- 抢占式 优先级 调度算法:只要出现优先级高的进程,则立即抢占处理机。
- 优先级 类型:
-
- 静态优先级:判断依据
-
-
- 进程类型:系统进程 优先级 一般高于一般用户进程
- 进程对资源的要求:要求少,优先级高
- 用户要求:根据 进程的紧迫程度和用户花销的多少确定
- 简单易行,系统开销少,但是不够精确,可能出现优先级低的进程长期不被调度的情况
-
-
- 动态优先级:在创建进程之初,先赋予进程一个优先级,随进程的推进或等待时间的增加而改变,以便获得更好的调度性能
4.3. 多队列 调度算法:更灵活多变,满足用户的不同要求
- 不同类型或性质的进程 固定分配 在不同的就绪队列;
- 不同队列采用不同的调度算法;
- 同一个队列中的不同进程可以设置不同的优先级;
- 不同的就绪队列本身也可以设置不同的优先级
4.4. 基于公平原则 调度算法:
- 保证 调度算法:保证调度的公平性,即各进程获得基本平均的处理机时间。
- 公平分享 调度算法:保证每个用户获得基本平均的处理机时间。
-
- 用户 1 有 4 个进程:ABCD,用户 2 有 1 个进程:E
- 在公平分享调度算法下,强制调度序列:A E B E C E D E A E....
- 实现实时调度的基本条件
-
- 提供必要的信息:就绪时间、开始截止时间或完成截止时间、处理时间、资源要求、优先级
- 系统处理能力强
- 采用抢占式调度机制(硬实时)
- 具有快速切换机制:对中断快速响应的能力和对任务的快速分配能力
- 实时调度方式和算法选择
-
- 小型实时系统或要求不太严格的实时控制系统:简单易行的非抢占式 轮转 调度算法,响应时间一般为几秒或几十秒。
- 有一定要求的实时控制系统:非抢占式 优先级 调度算法,响应时间一般为几秒或几百毫秒
- 要求比较严格的实时系统:抢占式优先级调度算法(基于时钟中断的抢占式优先级调度算法、立即抢占的优先级调度算法)
- 优先级倒置:
-
- 高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞的现象称为优先级倒置。
- 规定进程进入临界区后,CPU不允许被抢占
- 动态优先级继承:临界区中的低优先级进程 继承 想使用 临界区资源的高优先级进程的优先级
5. 实时调度:轮转不考大题
- 实现实时调度的基本条件
-
- 提供必要的信息:就绪时间、开始截止时间或完成截止时间、处理时间、资源要求、优先级
- 系统处理能力强
- 采用抢占式调度机制(硬实时)
- 具有快速切换机制:对中断快速响应的能力和对任务的快速分配能力
- 实时调度方式和算法选择
-
- 小型实时系统或要求不太严格的实时控制系统:简单易行的非抢占式 轮转 调度算法,响应时间一般为几秒或几十秒。
- 有一定要求的实时控制系统:非抢占式 优先级 调度算法,响应时间一般为几秒或几百毫秒
- 要求比较严格的实时系统:抢占式优先级调度算法(基于时钟中断的抢占式优先级调度算法、立即抢占的优先级调度算法)
- 优先级倒置:
-
- 高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞的现象称为优先级倒置。
- 规定进程进入临界区后,CPU不允许被抢占
- 动态优先级继承:临界区中的低优先级进程 继承 想使用 临界区资源的高优先级进程的优先级
5.1. 最早截止时间优先算法 EDF:
- 根据任务的截止时间(开始或完成)确定任务的优先级,任务的截止时间越早,优先级越高。
- 非抢占式 调度方式 用于 非周期实时任务。
- 抢占式 调度方式 用于 周期性实时任务。
5.2. 最低松弛度优先算法 LLF :松弛度~任务紧迫程度
- 根据实时任务的最低松弛度(松弛度=任务必须完成的时间-任务本身运行的时间-当前时间)来确定优先权,松弛度越低,优先权越高。
- 本算法主要采用抢占式调度方式,以确保任务对截止时间的要求
6. 死锁:
- 定义:如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的(A 要的东西在 B,B 要的东西在 A,俩人都不放弃自己原本就有的东西)
- 产生死锁的原因:
-
- 竞争 不可抢占性 资源 引起死锁
- 竞争 可消耗 资源 引起死锁
- 进程 推进顺序不当 引起死锁
- 产生死锁的必要条件:
-
- 互斥条件:一段时间内某资源只能被一个进程占用。
- 请求和保持条件:进程至少保持了一个资源,又申请被其他进程保持的资源
- 不可抢占条件:进程已经获得的资源在进程未使用之前不能被抢占
- 循环等待条件:发生死锁的进程,必然存在一个资源循环等待链
-
-
- 预防死锁:因为互斥条件式非共享设备所必须的,不仅不能破坏,还应加以保证,所以要破坏后三个条件。
-
- 处理死锁的方法:
-
- 预防死锁——破坏死锁的必要条件
- 避免死锁——跟踪评估资源分配过程,调整
- 检测死锁——及时检测
- 解除死锁——撤销进程等
7. (大题必考)银行家算法避免死锁:会做就行
5 个进程{P0,P1,P2,P3,P4},3 类资源{A,B,C},各资源总数:10,5,7
进程 \ 资源情况 | MAX A B C | Allocation A B C | Need A B C | Available A B C |
P0 | 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2 |
P1 | 3 2 2 | 2 0 0 | 1 2 2 | |
P2 | 9 0 2 | 3 0 2 | 6 0 0 | |
P3 | 2 2 2 | 2 1 1 | 0 1 1 | |
P4 | 4 3 3 | 0 0 2 | 4 3 1 |
求:
(1)To 时刻系统是否安全,为什么?
(2)P1 发出请求向量 Request1(1,0,2),分析系统是否同意请求。
解:
(1):
进程 \ 资源情况 | Work | Need | Allocation | Work+Allocation |
P1 | 3 3 2 | 1 2 2 | 2 0 0 | 5 3 2 |
P3 | 5 3 2 | 0 1 1 | 2 1 1 | 7 4 3 |
P0 | 7 4 3 | 7 4 3 | 0 1 0 | 7 5 3 |
P2 | 7 5 3 | 6 0 0 | 3 0 2 | 10 5 5 |
P4 | 10 5 5 | 4 3 1 | 0 0 2 | 10 5 7 |
所以,由表可知:在To 时刻可以得到安全序列:P1 -> P3 -> P0 -> P2 -> P4
所以,安全
解析步骤:
- 第一个 work=原表的 Available,从上往下依次比较:work 与 Need 的值,work 大则选择这个进程的 Need:122,->P1,Allocation 抄原表的就行,最后Work+Allocation=3 3 2+2 0 0=5 3 2,对应相加就行
- 上一行的Work+Allocation=下一行的 work,再从上往下依次比较:work 与 Need 的值,work 大则选择这个进程的 Need:011,->P3,Allocation 抄原表的就行,最后Work+Allocation=5 3 2+2 1 1=7 4 3,对应相加就行
- 循环直到完成表格的填写
- 根据 表格写出关于第一列 P 的安全顺序序列,从上往下
(2):
因为:
Request1(1,0,2)=<N1(1,2,2):请求合理
Request1(1,0,2)=<Ava(3,3,2):请求可满足
系统暂时先为进程P2试行分配资源,并修改有关的确数据,如下图所示:
进程 \ 资源情况 | MAX A B C | Allocation A B C | Need A B C | Available A B C |
P0 | 7 5 3 | 0 1 0 | 7 4 3 | 2 3 0 |
P1 | 3 2 2 | 3 0 2 | 0 2 0 | |
P2 | 9 0 2 | 3 0 2 | 6 0 0 | |
P3 | 2 2 2 | 2 1 1 | 0 1 1 | |
P4 | 4 3 3 | 0 0 2 | 4 3 1 |
进程 \ 资源情况 | work | Need | Allocation | work+Allocation |
P0 | 230 | 020 | 302 | 532 |
P1 | 532 | 011 | 211 | 743 |
P2 | 743 | 743 | 010 | 753 |
P3 | 753 | 600 | 302 | 1055 |
P4 | 1055 | 431 | 002 | 1057 |
解析步骤:
- 将 Request1(1,0,2)与 P1 的 Need 和 Available 进行比较,都比他们小于等于,系统才可以同意,有一者不满足条件都不行
- 将原表的 P1 的 Allocation+Request1,Need-Request1,Available-Request1,再填入原表,照写下来
- 如果还能再根据新表的Available=work,再做一张表,就做,并且说明:系统是否同意请求,如果不能做,说明:可利用资源Available已不能满足任何进程的需要,故系统进入不安全状态,此时系统不能将资源分配给P2。
第四章:存储器管理
1. 固定分区分配:
- 把物理内存空间划分成若干个大小一定的区域,每个分区装入一道作业。
- 划分分区的方法:分区大小、数量固定
- 通过分区说明表进行内存分配
-
- 分区说明表:将分区按其大小进行排队
2. 动态分区分配:
- 根据进程实际需要,为进程分配一块大小刚好满足需求的内存。
- 空闲分区表或空闲分区链
-
- 用于描述空闲分区和已分配分区的情况,为分配提供依据
- 动态分区分配算法;
-
- 为把新作业装入内存,需要安装一定的分配算法,从空闲分区表或空闲分区链中选择一分区分配给该作业
- 分区的分配与回收
-
- 分配内存:请求大小-每个空闲分区大小=A,if A <= 剩余固定分区大小,则剩下的都给它,else 能给多少给多少,满足不了的部分就让它留在空闲分区表等着。
- 回收内存:
2.1. 基于顺序搜索:适合小系统
- 首次自适应算法 FF:
-
- 定义:每次从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,再根据作业的大小,从这个空闲分区划一块内存空间给请求者,
- 特点:
-
-
- 空闲区按地址由低到高排序;
- 将程序装入到主存中足够装入且地址最低的空闲区中
- 尽量利用主存低地址空闲区,尽量在高地址保留大空闲区
-
- 循环首次适应算法 NF:
-
- 特点:从上次找到的空闲空间的下一个空闲空间分区开始查找
- 最佳适应算法 BF:
-
- 最佳是指每次为作业分配内存时,总能把满足要求的最小空闲分区分配给作业,避免“大材小用”
- 为了提高效率,应该让空闲分区按照从小到大的顺序排列
- 每次分割切下来的剩余部分总是最小——碎片多,难以再加利用
- 最坏适应算法 WF:
-
- 总是将满足需求的最大的分区切割后分配给作业。
- 空闲分区按照从大到小的顺序排列
- 碎片少,查找效率高
2.2. 基于索引搜索:适合大系统
- 快速适应算法:以相同好分配查找的划类空间换精打细算的时间
-
- 又称为分类搜索算法:将空闲分区按照容量大小分类,每一类单独设置一个链(表),每一类具有相同容量
- 内存中建立一张管理索引表,记录了每一类空闲分区的类型和链(表)头指针
- 分配时找到满足需求的最小分区进行分配
- 优点:查找效率高
- 缺点:整块分配可能会造成浪费,回收分区开销大
- 伙伴系统:
-
- 规定无论是已分配分区还是空闲分区,其大小均是2的k次幂
- 系统开始运行时,整个内存是一个2k的大分区,随着系统运行不断划分成小分区
- 当为大小为n的进程分配分区时,计算i使得2i-1<n<2i成立,然后将大小为2i的空闲分区链(表)里面找一块分区进行分配
- •若找不到,则在大小为2i+1的空闲分区链(表)里面找一块分区,划分成大小为2i的两块,一块用于分配,一块挂在的空闲分区链(表)中,依此类推……(伙伴分区)
- 哈希算法:略
3. 分页存储管理方式:
- 页面与物理块:
-
- 页面:进程 逻辑地址 空间 分成若干大小相等的页,从0开始编号。把 内存 物理地址 空间 也分成相同大小的块,加以编号(如0#块、1#块……),为进程分配内存时,以块为单位分配
- 先分块,后分页
- 碎片:进程的最后一页经常装不满一块,形成页内碎片
- 页面大小:2k,通常为1KB~8KB
- 逻辑地址结构:
-
- 页号的位数决定了逻辑空间中页面总数的最大值~数量
- 页内地址的位数决定了页面的大小~大小
- 注意逻辑地址的进制
- 逻辑地址=页号+页面地址,二进制
- 例题:
-
- 逻辑地址为2170的页面在页面大小为1KB的系统中的页号和页内地址分别是多少?逻辑地址为3150的页面呢?逻辑地址为 2F4C H 的页面呢?
-
-
- 解:
-
-
-
-
- 页面大小:1KB->页面地址:210=10 位=1024
- 逻辑地址/页面大小=页号......页内地址: 2170/1024=2......122
- 页号:2,页内地址:122
- 10 00 0111 1010
-
-
-
-
- 解:
-
-
-
-
- 3150/1024=3......78
- 页号:3,页内地址:78
-
-
-
-
- 解:
-
-
-
-
- 2F4C(H)=0010 11 11 0100 1100
- 页号:0010 11=11
- 页内地址:11 0100 1100=116
-
-
-
- 如果逻辑地址的长度为16位,页面大小为1KB,则逻辑地址的构成是?页总数为多少?
-
-
- 解:
-
-
-
-
- 页面大小为1KB~页内地址=10 位,页号:6 位
- 16 位逻辑地址=6 位页号+10 页内地址
- 页总数=26=64
-
-
4. 分页和分段的主要区别:
- 页是信息的物理单位,分页的目的是提高内存的利用率;段是信息的逻辑单位,分段的目的是为了更好地满足用户需求
- 页的大小固定,由系统决定。用户不可见;段大小不固定,由用户编写的程序决定,用户可见
- 分页的地址空间是一维的,分段的地址空间是二维的