参考汤小丹老师的计算机操作系统 第四版
第3-4章
3章 处理及调度与死锁
4章 存储器管理
第3章 处理机调度与死锁
3.1 处理机调度的层次和调度算法的目标
调度 = 资源分配
3.1.1 处理机调度层次
高级调度:作业调度,长程调度,对象是作业;多道批系统配置,分时与实时系统不必
低级调度:进程调度,短程调度,对象是进程;多道批,分时与实时系统都需要
中级调度:内存调度,对象是内存,主要目的提高内存利用率和系统吞吐量
3.1.2 处理机调度算法的目标
1、处理机调度算法的共同目标
1)资源利用率:提高
2)公平性:诸进程应当获得合理的CPU时间
3)平衡性:保持系统资源使用的平衡性
4)策略强制执行:如安全策略
2、不同系统目标:
1)批处理系统:
平均周转时间短:周转时间指从作业被提交到作业完成为止
系统吞吐量高:多选择短作业
处理机利用效率高:选择长作业(运算量大的作业)
2)分时系统目标:
响应时间快
均衡性
3)实时系统目标:
截止时间保证
可预测性
3.2 作业与作业调度
3.2.1 批处理系统中的作业
1、基本概念:作业,作业步,作业控制块JCB
2、作业三个阶段和三种状态:
状态:后备状态,运行状态,完成状态
阶段:
收容阶段:从输入作业,建立JCB,到放入后备队列
运行阶段:从作业被作业调度选中到就绪,到运行结束之前
完成阶段:作业运行完成或发生异常而提前结束
3.2.2 作业调度的主要任务
需要做两个决定:
接纳多少作业:要适量
接纳哪些作业:需要调度算法
3.2.3 作业调度算法
1、先来先服务FCFS:谁先来先调用谁
2、短作业优先SJF:作业越短,优先级越高
缺点:需预估作业运行时间
对长作业不利
无法实现人机交互
不能保证紧迫性作业得到及时处理
3、优先级调度算法:外部根据作业紧迫程度赋予作业相应优先级,优先级高的先进入内存
4、高响应比优先调度算法:结合FCFS和SJF
优先权 = (等待时间 + 要求服务时间)/要求服务时间
或
优先权 = 响应时间/要求服务时间
缺点:计算响应比增加了系统开销
3.3 进程调度
3.3.1 进程调度的任务、机制和方式
1、进程调度的任务
保存处理机现场信息;按某种算法选取进程;把处理器分配给进程
2、进程调度机制
排队器:存放就绪进程
分派器:根据进程调度选定就绪进程,进行上下文切换,分配处理机给进程
上下文切换器:两对
第一对:保存当前进程上下文,装入分派程序上下文
第二对:移除分派程序上下文,装填新选进程的CPU现场信息
上下文切换许开销较大,通过硬件实现方法减少上下文切换时间
3、进程调度方式
1)非抢占方式:处理机被分配给某个进程后,一直运行直到进程结束或者阻塞
优点:实现简单,开销小;适用于多数批处理系统
缺点:不适用于分时系统和多数实时系统
2)抢占方式:允许调度程序根据某种原则。暂停某个正在执行的进程,将已分配给该进程的处理机分配给另一进程
优点:
批处理:可防止某个程序长时间占用处理机
分时系统:可实现人机交互
实时系统:能满足实时任务需求
缺点:实现方式复杂,因此系统开销大
原则:优先权原则;段进程优先原则;时间片原则
3.3.2 进程调度算法
1、轮转调度算法RR:
1)原理:根据FCFS策略,将所有就绪进程排成队列,依次执行,每个进程执行一个特定时间片
2)进程切换时机:
①时间片用完,这是正常情况
②时间片未用完,但程序已经执行完毕
3)时间片大小
小的时间片有利于短作业,但意味着频繁进程调度和上下文切换,增加系统开销
长的时间片,RR’算法退化为FCFS算法
2、优先级调度算法
1、分类:
非抢占式优先级调度算法:处理机分配给就绪队列优先级最高进程后,该进程便一直执行下去,直到完成或放弃处理机
抢占式优先级调度算法:某个进程执行期间,若出现优先级更高的进程,则把处理机交给优先级更高的进程
2、优先级类型:
1)静态优先级:创建进程时就确定,在整个进程生存期保证不变
评判优先级依据:
进程类型:一般系统进程优先级更高
对资源需求,需求越小,优先级越高
用户要求:钞能力
2)动态优先级
进程优先级随进程推进或等待时间增加而改变
3、多队列调度算法
将系统中的就绪队列从一个拆分为多个,不同的就绪队列采用不同的调度算法,同一个队列内的进程设置不同的优先级,不同的队列也可以设置不同的优先级
4、多级反馈队列调度算法
1)设置多个就绪队列,第一个队列优先级最高,但时间片最短,以此类推1…n
调度程序首先调度第一队列程序,第一队列为空时,再调用第二队列,以此类推;
若有新进程进入高优先级队列,则暂停当前队列中的进程执行,转到高优先级队列执行新进程
2)进程A进入内存时放到第一个队列尾部,按照FCFS原则调度。
3)轮到进程A执行时,若能在时间片内完成,则撤离A。否则转入第二队列尾部,倘若轮到A时依旧未执行结束,转入第三队列…,直到第n队列尾部,在第n队列按照RR方式运行
优势:
终端用户:满意
短批处理用户:周转时间短
长批处理用户:不用担心作业长期得不到处理
3.3.3 基于公平原则的调度算法
1、保证调度算法
该算法向用户做出的保证并不是优先运行,而是明确的性能保证。尽量做到使每个进程的时间比率一样,时间比率等于进程实际获得的时间/进程应该获得的时间
2、公平分享调度算法
分配给每个进程相同的处理机时间,优先保证用户拥有相同的处理机时间
3.4 实时调度
3.4.1 实时调度基本条件
1、提供必要信息:向调度程序提供有关任务的信息,包括就绪时间,开始截止时间和完成截止时间,处理时间,资源要求,优先级
2、系统处理能力强
3、采用抢占式调度机制:应使所有的实时任务都比较小
4、具有快速切换机制
1)对中断的快速响应能力
2)快速的任务分派能力
3.4.2 实时调度算法分类
根据实时任务性质分为:硬实时任务调度算法和软实时任务调度算法
根据调度方式:非抢占调度算法和抢占调度算法
1、非抢占调度算法
1)非抢占式轮转调度算法:
响应时间:数秒至数十秒
适用于:要求不太严格的实时控制系统
2)非抢占式优先调度算法
响应时间:数秒至数百毫秒
适用于:有一定要求的实时控制系统
2、抢占式调度算法
1)基于时钟中断的抢占式优先级调度算法:
当优先级更高的任务到达后,并不立即抢占当前任务,而是等到时钟中断发生时,才抢占
响应时间:几十至几毫秒
适用于:多数实时系统
2)立即抢占的优先级调度算法:
字面意思
相应时间:几毫秒至100微秒
3.4.3 实时调度算法
1、最早截止时间有限算法EDF
任务截止时间越早,优先级越高,具有最早截至时间的放到队列头
场景
1)非抢占式调度方式用于非周期实时任务
2)抢占式调度方式用于周期性实时任务
2、最低松弛度优先LLF算法
任务紧急程度愈高,赋予该任务的优先级就愈高,对应松弛度越低
松弛度最低的任务排在最前面
主要用于抢占调度方式中
松弛度计算公式:
3.4.4 优先级倒置
1、优先级倒置:高优先级进程被低优先级进程延迟或阻塞
2、出现环境:使用优先级调度算法和抢占方式的OS
3、场景:P1和P3共享临界资源,P3运行期间,P2就绪抢占处理机,P3阻塞未释放临界资源,P1就绪,抢占处理机,运行,需要访问临界资源,但被P3占用,P1阻塞,P2执行,执行完毕后,P3执行,释放临界资源,P1在运行,P1优先级高于P2,应当先运行,但实际情况相反
4、解决方法:动态优先级继承。场景演示中P3可以继承P1的优先级,避免P2插入,从而规避优先级倒置问题
3.5 死锁
3.5.1 资源问题
1、可重用性资源和消耗性资源
1)可重用性资源
是一种可供用户重复使用的资源
性质:一个可重用性资源单元只能由一个进程使用
进程使用可重用性资源顺序:请求资源,使用资源,释放资源
系统中可重用性资源数量相对固定
可重用性资源的调用一般通过系统调用实现
2)可消耗性资源:又称临时性资源,由进程动态创建和消耗
性质:可消耗性资源单元数目在进程运行期间可变化
常见的可消耗性资源是消息
2、可抢占性资源和不可抢占性式资源
1)可抢占性资源:进程获得这类资源时,可以被其他进程抢占,如CPU
2)不可抢占性资源:进程获得这类资源,可以一直占用直到进程结束
3.5.2 计算机系统中的死锁
产生原因:
1、竞争不可抢占性资源引起死锁
2、竞争可消耗资源引起死锁
3、进程推进顺序不当引起死锁
3.5.3 死锁的定义
1、定义:如果一组进程中的每一个进程都在等待仅由改组进程中的其他进程才能引发的事件,那么该组进程是死锁的
2、产生死锁必要条件:
1)互斥条件:即在某一段时间内,资源只能被一个进程占用
2)请求和保持条件:吃着自己碗里的,望着别人碗里的
3)不可抢占条件:进程获得的资源在未使用完之前不得释放
4)循环等待条件:发生死锁时必然存在一个进程——资源的循环链
3、处理死锁的方法:
1)预防死锁:破坏死锁产生的必要条件
2)避免死锁:防止系统进入不安全状态,从而产生死锁
3)检测死锁
4)解除死锁
3.6 预防死锁
互斥条件是非共享设备必须的,只能加强,不能破坏
3.6.1 破坏”请求和保持条件“
1、第一种协议:进程在运行之前,一次性申请需要的所有资源
优点:简单,易行,安全
缺点:资源浪费严重;使进程经常发生经常发生饥饿现象
2、第二种协议:第一种协议改进。进程只获得初期所需资源便可以运行,后续运行过程,用毕获得的资源,再申请(批量)新的所需资源
3.6.2 破坏”不可抢占“条件
进程提出新的资源请求而不能得到满足时,必须释放已经保持的所有资源
缺点:实现复杂;代价大;可能导致进程被无限期推迟
3.6.3 破坏”循环等待“条件
对系统中所有资源类型线性排序并编号
规定每个进程必须按照序号递增顺序请求资源
重点是如何规定每种资源的序号
优点:资源利用率和系统吞吐量有明显改善
缺点:限制了新类型设备的增加
作业使用各类资源的顺序与系统规定的顺序不同,造成资源浪费
按规定次序申请资源限制用户简单自主编程
3.7 避免死锁
3.7.1 系统安全状态和不安全状态
安全状态指系统能按某种进程推进顺序(p1,p1,p3)为每个进程p分配所需资源,直到满足每个进程资源需求,该序列称为安全序列
1)安全状态:不会产生死锁
2)不安全状态:可能产生死锁。注意不是一定
3.7.2 避免死锁算法:银行家算法(期末必考?)
1、银行家算法数据结构
1)可用资源Available;
Available[j] = K,表示系统中j类资源有K个
2)最大需求矩阵Max;
Max[i,j] = K,表示进程i需要j类资源K个
3)分配矩阵Allocation;
Allocation[i,j] = K,表示进程i以获得K个j类资源
4)需求矩阵Need
Need[i,j] = K,表示进程i需要K个j资源
2、银行家算法
见课本结合习题
3、安全性算法
见课本结合习题
4、一个例题P122
3.8 死锁检测与解除
3.8.1 死锁检测
当且仅当S状态的资源分布图是不可完全简化的,则S状态为死锁
3.8.2 死锁解除
1、抢占资源:从其他进程抢夺足够资源分配给死锁进程
2、终止进程:终止一个或多个进程,直到打破循环环路
终止策略:
1)终止所有进程
缺点:代价大
2)逐个终止进程
按某种顺序终止进程,知道有足够的资源
缺点:代价大
考虑的因素:使解除死锁代价最小
进程优先级,进程执行时间,进程使用资源,进程性质交互式还是批处理式
第4章 存储器管理
4.1 存储器层次结构
4.1.1 存储器的多层结构
1、层次结构
cpu寄存器 | 寄存器 | |
---|---|---|
高速缓存 | ||
主存储器 | ||
主存 | 磁盘缓存 | 操作系统管理 |
固定磁盘 | ||
辅存 | 可移动存储介质 | 设备管理 |
由上而下,容量增大,速度降低
2、可执行存储器
寄存器和主存储器
3、主存储器
为解决主存储器访问速度远低于cpu执行指令速度的矛盾,引入寄存器和高速缓存
4、高速缓存
1)介于寄存器和主存储器之间
2)多级高速缓存:
一级高速缓存速度最高,容量最小,越靠近内存
二级高速缓存速度较低,容量稍大
3)是实际的存储器
5、磁盘缓存
1)介于主存储器和磁盘
2)本身并不是实际的存储器,实际是主存中的部分存储空间
4.2 程序的装入和链接
用户程序运行步骤:编译->链接->装入
4.2.1 程序的装入
三种装入方式
1、绝对装入方式
特点:将目标模块装入到内存中事先指定的位置,程序中的相对地址(逻辑地址)与实际内存地址完全相同
应用场景:单道程序环境
2、可重定位装入方式
特点:根据内存的具体情况,将装入模块装入到内存的适当位置,装入模块所有逻辑地址与实际装入内存后的物理地址不同;不允许程序运行时在内存中移动位置
应用场景:多道程序环境
不同
3、动态运行时的装入方式
特点:装入模块的逻辑地址与物理地址的地址转换等到程序真正要执行的时候才进行
辅助设备:重定位寄存器
4.2.2 程序的链接
三种链接方式
1、静态链接方式
在程序运行之前将各目标模块和所需库函数连接成一个完整的装配模块,以后不再拆开
需解决的问题:
1)对相对地址进行修改
2)变换外部调用符号:将每个模块中的外部调用符号改为相对地址
2、装入时动态链接
将目标模块装入内存时,变装入边链接
优点:
1)便于修改和更新,相较于静态链接方式
2)便于实现对目标模块共享
3、运行时动态链接
装入时链接的一种改进,程序执行过程中将需要调用但没被装入内存的模块进行链接
优点:节加快程序装入过程,省大量空间
4.3 连续分配存储管理方式
连续分配方式可分为四类:单一连续分配,固定分区分配,动态分区分配,动态可重定位分区分配
4.3.1 单一连续分配
应用场景:单道程序环境,用户内存仅装有一道用户程序
4.3.2 固定分区分配
应用场景:多道程序系统
1、划分分区方法
1)分区大小相等
缺点:缺乏灵活性;造成内存空间浪费
优点:适用于一台计算同时控制多个相同对象
2)分区大小不等
多个较小分区,适量中等分区,少量大分区
2、内存分配
检索分区使用表分配
4.3.3 动态分区分配
1、动态分区分配数据结构
1)用途:描述空间分区和已分配分区情况
2)两种形式:空闲分区表,空闲分区链(双向链)
2、动态分区分配算法
顺序式搜索算法四种,索引式搜索算法三种(略)
3、分区分配操作
分配内存和回收内存
1)分配内存:切割分配
2)回收内存:整合内存
4.3.4 基于顺序搜索的动态分区分配算法
1)首次适应算法
空闲分区链以地址递增次序链接
缺点:
保留了高址部分的大空闲区,低址部分留下许多难以利用的小的空闲分区
每次都从低址部分查找,增加查找开销
2)循环首次适应算法
在首次适应基础上,每次查找从上一次找到的空闲分区的下一个空闲分区开始查找
优点:
使空闲空间分布更均匀,从而减少查找空闲分区开销
缺点:
缺乏大的空闲分区
3)最佳适应算法
空闲分区按照容量从小到大顺序形成空闲分区链
优点:
避免大材小用
缺点:留下许多难以利用的碎片
4)最坏适应算法
空闲分区按照容量从大到小顺序形成空闲分区链
优点:
产生碎片可能性小
查找效率高
缺点:
缺乏大的空闲分区
4.3.5 基于索引搜索的动态分区分配算法(略)
1、快速适应算法
2、伙伴系统
3、哈希算法
4.3.6 动态可重定位分配
1、紧凑:也称拼凑,通过移动内存中的作业,将诸多小的难以利用的内存“碎片”集中合成大的分区
缺点:
1)开销大
2)需要对移动了作业的地址进行修改
2、动态重定位
利用重定位寄存器,用它来存放程序在内存中的起始地址
程序在真正执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的
用途:有助于解决1中第二个缺点
3、动态重定位分区分配算法
1)与动态分区分配算法基本相同(基于顺序式的和基于索引式的)
2)增加紧凑功能。将内存“碎片”利用起来
4.4 对换
将作业在内存和外存之间进行移动
4.4.1 多道程序环境下的对换技术
1、对换:指把内存中暂时不能运行的进程或者暂时不用的程序或数据换出到外存上,把外存上具备运行条件的进程或程序数据换入到内存
2、作用:改善内存利用率,直接提高处理机利用率和系统吞吐量
3、类型
1)整体对换:调换以整个进程为单位,又称进程对换。即中级调度
实现进程兑换,系统必须实现:对兑换空间的管理,进程的换出和进程的换入三方面功能
2)页面对换:部分对换,以进程的一个页面或分段为单位进行对换,目的是为了实现虚拟存储系统。
4.4.2 对换空间管理
1、对换空间的主要目标
OS常讲磁盘分为文件区和对换区
1)对文件区管理的主要目标
①首要目标提高文件存储空间的利用率
②其次提高对文件的访问速度
采取离散分配方式管理
2)对对换空间管理的主要目标
①首要提高进程换入换出的速度
②其次提高文件存储空间的利用率
采取连接分配方式
2、对换区空闲盘块管理中的数据结构
在系统中配置相应的数据结构,用于记录外存对换区中的空闲盘块的使用情况
3、对换空间的分配与回收
同动态分区方式的分配与回收算法类似
4.4.3 进程的换出与换入
1、进程换出
①选择被换出的进程:
首选处于阻塞状态或睡眠状态的进程,优先级低的优先换出
其次优先级低的就绪进程
②进程换出过程
注意进程换出,只能换出非共享的程序和数据段
换出成功后,回收内存空间,修改PCB和内存分配表
2、进程换入
讲PCB中满足就绪状态并且换出的进程换入
如无足够的内存空间,则换出一些进程
4.5 分页存储管理方式
程序装入的三种离散分配方式:分页存储管理方式,分段存储管理方式,段页式存储管理方式
4.5.1 分页存储管理基本方法
1、页面和物理块
1)页面:分页存储管理讲进程的逻辑地址空间分成若干个页。也将物理地址空间分为多个块,页大小和块大小一样
2)页面大小
太小:
优点:有助于减少内存碎片,提高内存利用率
缺点:页表过长,占用大量内存;降低页面换入换出效率
太大:
优点:减少页表长度,提高换入换出效率
缺点:内存碎片增大
适中:一般为1KB-8KB
2、地址结构
分页地址中的地址结构由两部分组成:页号和偏移量
页号 | 偏移量 |
---|---|
20位 | 12位 |
特定机器地址结构是一定的,如逻辑地址为A,页面大小位L
则页号P和页内地址d分别为
3、页表作用:
实现从页号到物理块号的地址映射
4.5.2 地址变换机构
地址变换机构作用:将用户地址空间中的逻辑地址转换为内存空间中的物理地址
地址变换机构实际任务:将逻辑地址中的页号转换为物理块号
1、基本的地址变换机构
1)页表存放位置:存放在内存
页表的起始地址和长度存放在进程的PCB中
2)页表寄存器:存放页表在内存的起始地址和页表长度
缺点:页表放在内存中,cpu存取数据时需要访问两次内存,一次查页表,第二次查数据
计算:物理地址=块号*页大小(或块大小)+偏移地址
习题
2、具有快表的地址变换机构
1、联想寄存器:称为快表,用以存放当前访问过的页表项
CPU给出有效地址后,先到联想寄存器查找页号,若未查到再到内存中的页表查找
快表容量有限,通常存放16-512各页表项
习题
3、寻址过程
①通过页表寄存器获取页表始址和页表长度,由此获取页表
②通过逻辑地址中的页号作为索引查询页表,获取物理块号
③将物理块号和页内偏移量组合获得内存物理地址
4.5.3 访问内存的有效时间
略
4.5.4 两级和多级页表
1、如何解决页表过大问题?
1)离散分配:对于页表所需的内存空间,可采用离散分配方式,以解决难以找到一块连续的大内存空间的问题
2)有限调入:只需将当前需要的部分页表项调入内存,其余的页表放在磁盘中,等需要时再调入(虚拟存储器章节再讲)
2、两级页表
1)实现上述离散分配的方法:对页表分页,类比对程序分页
因此需要额外建立一张页表,称为外层页表,在每个页表项中记录分页表的的物理块号
2)以32位逻辑地址空间为例说明:
外层页号 | 外层页内地址 | 页内地址 |
---|---|---|
10位 P1 | 10位 P2 | 12位 d |
3)寻址过程
①通过外层页表寄存器找到外层页表始址,从而找到外层页表
②利用逻辑地址的外层页号作为索引,找到页表分页的始址
③再利用逻辑地址的外层页内地址(同样称作页号感觉更好理解)作为索引,找到对应的物理块号
④用物理块号和页内地址d即可获取要访问的内存物理地址
3、多级页表
对于64位系统,两级页表会导致外层页表过大不可行,因此将可直接寻址的存储器空间减少为45位长度左右,利用三级页表结构实现分页管理
4.5.5 反置页表
略
4.9 分段存储管理
目的:为了满足用户(程序员)在编程和使用上多方面的要求
4.9.1 分段存储管理方式的引入
1、好处
1)方便编程:程序按照逻辑关系划分为若干段,需要访问的逻辑地址由段号和段内地址决定
2)信息共享
3)信息保护
4)动态增长
5)动态链接:动态链接要求是以目标程序(即段)作为链接的基本的单位,因此分段存储管理方式适合动态链接
4.6.2 分段系统基本原理
1、分段
程序地址空间根据本身逻辑关系分为若干段,每个段都从0开始编址,并采用一段连续的地址空间,各段长度不等
分段地址中的逻辑地址结构
段号 | 段内地址 |
---|---|
12位 | 12位 |
2、段表
段表中的表项记录该段在内存中的起始地址和段的长度
段表用于实现从逻辑段到物理内存区的映射。类似于页表
3、地址变换机构
段表寄存器:存放段表始址和段表长度。
联想寄存器:保存常用的段表项,便于快速访问
4、寻址过程
①由段表寄存器获取段表始址和段表长度,由此获取段表
②以逻辑地址中的段号位索引查询段表获取该段在内存中的起始地址和段的长度
③将起始地址和段内地址组合获取该段的内存物理地址
5、分页和分段的主要区别
相同点:离散分配;通过地址映射机构实现地址变换
不同
1)页是信息的物理单位,以消减内存的外零头,提高内存利用率为目的
段是信息的逻辑单位,以更好地满足用户(程序员)的需要为目的
2)页大小固定且由系统决定,段长度不固定,由用户编写的程序决定
3)分页的用户程序地址空间是一维的,分段的用户程序地址空间是二维的
4.6.3 信息共享
相较于分页系统,分段系统易于实现段的共享和保护
4.6.4 段页式存储管理方式
既能有效提高内存利用率,又能更好地满足用户多方面的需要
1、基本原理
程序分段,段分页
地址结构
段号 | 段内页号 | 页内地址 |
---|---|---|
2、地址变换机构
1)段表:存储页表始址和页表长度;段表始址存放于段表寄存器中
2)页表:存储页号和物理块号;不需要页表寄存器
3、地址变换过程
①通过段表寄存器获取段表始址和段表长度,依次获得段表
②以段号做为索引查询段表,获取该段的页表始址和页表长度,以此获取页表
③以段内页号为索引查询页表,获取物理块号
④组合物理块号和页内地址,获取内存物理地址
高速缓冲寄存器:段页式存储管理方式获取指令或数据需要访问三次内存,利用高速缓冲寄存器保存最近访问的物理块号,段号和页号作为索引检索