第一章 名词解释
![](https://img-blog.csdnimg.cn/direct/88d62996564f4ba4834cf1f3995ff9f4.png)
![](https://img-blog.csdnimg.cn/direct/4a92ee6af42843edb1644270b2248c37.png)
![](https://img-blog.csdnimg.cn/direct/9870f6c1d38c462a9d09ac6d2beb0f0c.png)
![](https://img-blog.csdnimg.cn/direct/bdcad8c822514c0883167d280c931f65.png)
缺点:需要频繁地在核心态和用户态之间切换(成本高),性能低
缺点:仅可调用相邻低层,难以合理定义各层之间的边界;效率低,不可跨层调用,系统调用执行时间长
模块化:将内核划分为多个模块,各个模块之间相互协作,内核=主模块(负责核心功能,比如进程调度等)+可加载内核模块(可以动态加载新模块到内核,而无需重新编译整个内核)
优点:模块间逻辑清晰,确定模块间接口后就能实多模块同时开发;支持动态加载新的内核模块;各个模块之间可以相互调用而无需进行通信
缺点:模块间的接口定义未必合理;模块之间相互依赖,更难调试和验证
外核:内核部分只负责进程调度,进程通信等功能;外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全;
比如内存分配空间,用户使用起来感觉是获取到一个连续的空间,但是这些存储空间是经过操作系统虚拟化的,本质上这些存储空间的物理页框是离散的;如果用户需要频繁地访问某些内存空间,为了减少磁头移动的时间,外核可以直接分配没有抽象的内存资源,用户看到的使用的就是实实在在的物理空间;且阻止其他进程访问已经分配给进程的抽象资源空间
优点:外核可以直接给用户分配“不虚拟 不抽象”的硬件资源,用户进程可以灵活地使用硬件资源;减少了虚拟硬件资源的映射层,提升效率(操作系统无需查页表)
缺点:降低了系统的一致性,系统变得更加复杂
操作系统的引导
![](https://img-blog.csdnimg.cn/direct/971def2edc7a497389978dbe2dce246f.png)
![](https://img-blog.csdnimg.cn/direct/3ba6a6521224471d8e03b5052e608002.png)
![](https://img-blog.csdnimg.cn/direct/26cff29664534b0fa83ca0c7311f59fe.png)
虚拟机
第一类虚拟机管理程序:直接运行在硬件上,操作系统需要使用特权指令时,VMM负责将特权指令进行等价转换
第二类虚拟机管理程序:安装在宿主操作系统之上,地址空间进行了多层的映射才对应到最终的地址,需要宿主操作系统作为中介
第二章 进程
进程描述信息:进程标识符PID(当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的ID,用于区分不同的进程)和用户标识符UID |
进程控制和管理信息:进程当前状态和进程优先级 |
资源分配清单:程序段指针、数据段指针、键盘和鼠标 |
处理机相关信息:各种寄存器值(当进程切换时需要把进程当前的运行情况记录保存在PCB中·) |
![](https://img-blog.csdnimg.cn/direct/dc243cbc8a134b2ebd84df98ce8fbd29.png)
![](https://img-blog.csdnimg.cn/direct/f512bf7dd1144166be6d7daa95df309e.png)
![](https://img-blog.csdnimg.cn/direct/2fe0f0bdb7514c34842e8fba988bb513.png)
- 申请空白PCB
- 为新进程分配所需的资源
- 初始化PCB
- 将PCB插入就绪队列
典型引起创建的事件:分时操作系统用户登录,作业调度进入内存等等
- PCB中找到终止进程的PCB
- 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
- 终止其所有子进程
- 将该进程拥有的所有资源归还给父进程或操作系统
- 删除PCB
引起进程终止的事件:正常结束、异常结束、外界干扰
- 找到要阻塞的进程对应的PCB
- 保护进程运行现场
- 将PCB插入相应事件的等待队列
- 将运行环境信息存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复新进程所需的运行环境
引起进程切换的事件:当前进程时间片到、更高优先级的进程到达、当前进程主动阻塞、当前进程终止
-
线程是处理机调度的单位,进程是资源分配的单位
-
多CPU计算机中,各个线程可占用不同的CPU
-
每个线程都有一个线程ID,线程控制块(TCB)
-
线程也有就绪、阻塞、运行三种基本状态
-
线程几乎不拥有系统资源
-
同一进程的不同线程共享进程的资源
-
由于共享内存地址空间,同一进程的线程间的通信甚至无需系统干预
-
同一进程的线程转换,不会引起进程切换;不同进程中的线程切换,会引起进程切换
-
切换同进程中的线程,系统开销会很小;切换进程,系统开销会很大
![](https://img-blog.csdnimg.cn/direct/015529a1f0fc43a9acebd6d047e3a3ad.png)
![](https://img-blog.csdnimg.cn/direct/356fd3bd104147788bf3377bcefacee3.png)
![](https://img-blog.csdnimg.cn/direct/228364b3d4114caa8b3643e121d04eec.png)
![](https://img-blog.csdnimg.cn/direct/9913478bbd49416296b654b56e977517.png)
调度层次
高级调度(作业调度) | 主存-辅存,从外存的后备队列上挑选一个或多个作业,调入内存并创建进程 | 调度频率低 |
中级调度(内存调度) | 外存-内存(面向进程),目的是为了提高内存利用率和系统吞吐量,口岸个暂时不能运行的进程调至外存等待,并将外存上已经具备运行条件的挂起进程重新调入内存 | 调度频率居两者之间 |
低级调度(处理机调度,进程调度) | 内存-CPU,最基本的一种调度,调度的频率非常高 | 调度频率高 |
七状态模型
CPU利用率 | CPU忙碌时间/总时间![]() |
系统吞吐量 | 总共完成作业/总共时间![]() |
周转时间 | 作业提交给系统到作业完成的时间,它包括四个部分:作业等待+作业就绪排队+作业运行+作业阻塞等待。后三项在一个作业的整个处理过程中,可能发生多次
作业周转时间=作业完成时间-作业提交时间
平均周转时间:各作业周转时间之和/作业数
带权周转时间=作业周转时间/作业实际运行的时间=(作业完成时间-作业提交时间)/作业实际运行时间;对于周转时间相同的两个作业,作业实际运行时间越长,
带权周转时间就越短,用户满意度就越高
平均带权周转时间=各作业带权周转时间之和/作业数
需要注意:如果进程完成后需要进行进程切换和进程调度,进程调度和切换的时间也算入一次进程完成所需要的时间
![]() |
等待时间 | 进程或作业等待处理机状态的时间之和; 对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。 对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间 |
响应时间 | 用户提出请求到首次产生响应的时间 |
算法思想:公平角度考虑算法规则:按照作业/进程到达的先后顺序进行服务0用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列是否可抢占:非抢占算法优点:公平、算法实现简单缺点:排在长作业((进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即, FCFS算法对长作业有利,对短作业不利是否会饥饿:不会
![](https://img-blog.csdnimg.cn/direct/ac9907ea5a334a698962445e17ef5c92.png)
算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于 进程调度时称为“短进程优先(SPF,Shortest Process First)算法”是否可抢占: SJF和SPF是非抢占式的算法。但是也有抢占式的版本――最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)优缺点: 优点:“最短的”平均等待时间、平均周转时间缺点:不公平。对短作业有利,对长作业不利。 可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先是否会饥饿:会
![](https://img-blog.csdnimg.cn/direct/8ffc9fdac0314a07bca397f65ad34efc.png)
![](https://img-blog.csdnimg.cn/direct/9ff04f7cecb14b8d8a968570e81d5c2e.png)
算法思想:考虑作业/进程的等待时间和要求服务的时间算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务; 响应比=(等待时间+要求服务时间)/要求服务时间用于作业/进程调度:都可以是否可抢占: 非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比优缺点: 综合考虑了等待时间和运行时间(要求服务时间)等待时间相同时,要求服务时间短的优先(SJF的优点) 要求服务时间一样(FCFS的优点)对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题是否会饥饿:不会
![](https://img-blog.csdnimg.cn/direct/e7c37b1639e94f98a9cdaae5625ecd10.png)
算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
用于作业/进程调度:用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)
是否可抢占:若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知CPU时间片己到
优缺点:
是否会导致饥饿:不会
![](https://img-blog.csdnimg.cn/direct/1a26819255044a2f83924c80dd84a09b.png)
![](https://img-blog.csdnimg.cn/direct/0f6378544adc473bb574a5c256f3b875.png)
![](https://img-blog.csdnimg.cn/direct/a704227d9bb54eec94591a240135bdea.png)
![](https://img-blog.csdnimg.cn/direct/b59ac0b53ff643c19f55c40b4237926c.png)
算法思想:对其他调度算法的折中权衡
设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
算法规则:新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
用于作业/进程调度:用于进程调度
是否可抢占:抢占式的算法。在 k 级队列的进程运行过程中,若更上级的队列
( 1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾(被抢占的进程不会放入下一个队列,而是回到当前队列的队尾)。
优缺点:对各类进程相对公平FCFS,每个新到达的进程很快就能得到响应RR,短进程只需要用很短的时间SPF
是否会导致饥饿:不会
![](https://img-blog.csdnimg.cn/direct/3b26b6c57708491aaab50afbf6b3a533.png)
![](https://img-blog.csdnimg.cn/direct/41ffcc9ef4fa4030a183d07a8b1202ad.png)
![](https://img-blog.csdnimg.cn/direct/7b1cea632b4c4d85a0505d0823059a72.png)
进程互斥的实现方法(软件实现)
- 单标志法
优点:同一时刻最多一个进程访问临界资源
存在的问题:违背空闲让进的原则,进程0完成一次后,下一次想要使用时只要进程1没有使用过,即使处理机空闲,进程0也无法再使用
- 双标志先检查法
- 双标志后检查法
- Peterson算法
- turn表示该轮到哪个进程进入临界区
存在一定的问题:违背让权等待的原则,即使进程无法进入临界区,但是仍然会占用处理机
进程互斥的实现方法(硬件实现)
- 中断屏蔽方法
- 硬件指令方法——TestandSet指令
TSL指令适合多处理机系统的原因:TSL指令会锁“内存总线”,其他CPU无法访问指向的内存地址;且指令是原子操作不可被打断
- 硬件指令方法——Swap指令
【互斥锁】
【信号量】
整形信号量:表示资源数目的整形量,违背让权等待的原则
记录型信号量:遵循让权等待
【用记录型信号量实现进程互斥、同步】
互斥需要设置初始互斥信号量mutex=1
同步根据哪些行为要求先执行,哪些需要根据运行结果后运行。需要先运行的在其后安排V操作(=生产一个单位的资源),需要后执行的在其前安排P操作(=要求获得该资源才能实现后面代码的执行),并且初始化信号量要为0
【用记录型信号量实现前驱关系】
生产者——消费者问题
多生产者与消费者的典型例题
没有设置互斥访问锁mutex的原因:这里的缓冲区大小为1(不设置互斥锁也不会导致进程的不同步),但是如果缓冲区大小为2就一定需要设置互斥访问锁;
吸烟者问题(多生产产品的单生产者问题)
读者——写者问题(读者和读者不互斥,写者和写者互斥)
完善的版本
哲学家进餐问题
确定哪些实体可能需要互斥或同步,不包括主体(发起动作的人)
进一步确认是同步关系,有没有体现严格的要先完成哪一个进程后完成哪一个进程,如果有进按照同步关系编写先V后P
如果是互斥关系,确定哪些资源需要互斥,设置相应的互斥信号量
确定完毕后,整个架子基本上就搭好了,具体结合题意完善
管程
管程解决PV操作分散,同步操作容易造成死锁的问题;管程根据条件变量阻塞进程,条件满足就调用wait函数阻塞
![](https://img-blog.csdnimg.cn/direct/d4e206ad43244aa59c06efbd4e2eef51.png)
![](https://img-blog.csdnimg.cn/direct/02aa7e16b6814e46b8d961f24004e834.png)
-
破坏“请求和保持”条件
死锁避免
安全状态下一定不会发生死锁;处于不安全状态可能发生死锁
![](https://img-blog.csdnimg.cn/direct/96e14f2353d44dcabbfaebeecd64933a.png)
-
死锁检测
//边表节点
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode,*ArcLink;
//顶点表节点
typedef struct VNode{
VertexType name;
int type;//0代表进程,1代表资源节点
int source;//资源节点拥有的资源数
ArcNode *firstarc;
}VNode,AdjList[MaxVertexNum];
//邻接表
typedef struct {
AdjList vertices;//邻接表
int vexnum,arcnum;//顶点数和弧数
int kind;
}ALGraph;
死锁定理(选择题解题技巧)
![](https://img-blog.csdnimg.cn/direct/597110598a8e4e4ba21862aa99e67cc7.png)
第三章 内存管理
系统中要运行用户程序要经历的步骤
- 编译 由编译程序将用户源程序进行编译,生成若干个目标模块
- 链接 由链接程序将编译后的一组目标模块以及它们所需的库函数链接在一起,形成完整的装入模块
- 装入 也称加载 由装入程序把装入模块装入内存
逻辑地址与物理地址
逻辑地址:由CPU产生的地址 也叫作相对地址
物理地址:内存单元看得到的地址 也叫作绝对地址
在编译与装入时的地址绑定会生成相同的逻辑地址或物理地址,而执行时的地址绑定则会生成不同的逻辑地址或物理地址。这种情况下也叫逻辑地址为虚拟地址,所有逻辑地址集合叫做逻辑地址空间;逻辑地址对应的物理地址集合叫做物理地址空间
内存保护
CPU硬件讲逻辑地址和界地址寄存器进行比较,若合法再将逻辑地址和重定位寄存器中的进程的起始物理地址相加得到物理地址
基地址寄存器保存的是最小的合法地址,界限寄存器指定了合法范围的大小
该方案下当用户态下执行的程序试图访问OS内存或其他用户内存时,会陷入OS内核,而OS内核会作为致命错误来处理;使用基地址寄存器与界限寄存器必须使用特权指令,因此只有OS内核才能加载基地址寄存器与界限寄存器,而用户不能修改它们
装入方式
绝对装入方式
计算系统很小,仅能运行单道程序时,可以使用绝对装入方式,用户程序编译后将产生绝对地址,绝对装入程序可以按照装入模块中的地址,将程序与数据装入内存,装入内存后,程序中的逻辑地址与实际内存中的地址完全相同,所以无需改变
可重定位装入方式
可将装入模块装入内存中任何允许的位置,可用于多道程序环境数据地址与指令地址(两个都是相对地址)都应该修改,与基地址寄存器中的起始地址相加,得到绝对地址
所以作业一旦进入内存就不能在内存中移动,在分配空间时也需要一次性分配其所需的全部内存空间
动态运行时装入方式
允许程序运行时在内存中移动位置动态运行时装入并不会立即把装入模块中的相对地址变换成绝对地址,而是推迟到程序真正要执行时才进行,因此装入内存后所有地址仍然是相对地址
需要借助重定位寄存器存放进程的起始地址
链接方式
静态链接
程序运行之前,先把各个目标模块以及其所需的库函数链接成一个完整的装配模块,以后不再拆开
需要解决的两个问题
修改相对地址 比如B和C装入模块的起始地址不再是0,而是L与L+M
变换外部调用信号
装入时动态链接
在装入内存时,边装入边链接
便于修改与更新
便于实现模块的共享
运行时动态链接
目前比较流行的是,在执行过程中,发现一个被调用模块尚未被装入内存,立刻让OS去寻找
对换
对换的引入:把内存中暂时不能运行的进程或暂时不用的程序与数据转移到外存中,以便提供足够的内存空间,再把已具备运行条件的进程或进程需要的程序与数据存入内存
对换的类型
整体对换
对换以整个进程为单位,称之为进程对换或整体兑换
页面对换
对换是以进程的一个页面或分段为单位进行,称之为页面对换或分段对换,它们统称为部分对换
对换区的管理(进程换出到磁盘的地方)
文件区管理的主要目标:提高文件存储空间的利用率 其次才是提高对文件的访问速度。采用离散分配方式
对换区管理的主要目标:提高文件换入换出的速度 其次才是提高文件存储的利用率,采用连续分配方式
进程的换入与换出(PCB不会换出外存,而是会常驻内存)
换出
选择被换出进程 首先会选择处于阻塞状态或睡眠状态的进程,当有多个这样的进程,应选择优先级最低的进程作为换出进程
如果系统中已无阻塞进程,现在的内存空间仍不满足需求,则选择优先级最低的就绪进程换出
换出进程 在换出时只能换出非共享的程序与数据段,而那些共享的程序与数据段只要有进程需要它,就不能被换出
换入
选择被换入进程,首先会检查PCB中所有进程的状态,从中找出处于就绪状态但被换出的进程,当有多个这样的进程时,选择已换出到磁盘时间最久的进程
换入进程后如果还有进程可换入,那么会继续换入;直到没有“就绪且换出”的进程或已无足够内存来支持换入进程
因为交换一个进程需要花费很多时间 为了提高处理的效率 处理机正常运行时并不执行换入操作,当发现许多进程在运行时都经常发生缺页,且出现内存紧张的情况,则启动调换,将一部分进程调换到外存中;
当发现所有进程的缺页率都已明显减少,系统的吞吐量已下降时,则暂停运行对换程序
覆盖
覆盖的具体思想是在内存中只保留那些任何时刻都需要的指令与数据,程序的其余部分会根据自身的逻辑结构共享一片内存区域
优点:不需要OS的特别支持,通过简单的文件结构就能将文件读入内存,实现完全覆盖
缺点:设计复杂,局限于微处理机和只有有限物理内存缺乏硬件支持的其他系统
连续存储分配管理方式
单一连续分配
将内存分为系统区与用户区,系统区放在内存的地址部分,用户区只装有一道用户程序
优点:简单,无外部碎片,不一定需要内存保护
缺点:适用于单用户,单任务的操作系统,有内部碎片
固定分区分配
每个分区只能占用一道作业,如果分区大小固定缺乏灵活性;但适合控制多个相同对象的场合;分区大小不等相对更灵活
缺点:程序太大可能放不进任何一个分区;程序小于分区可能造成浪费,形成很多内部碎片
动态分区分配
根据进程的实际需要,动态地为之分配内存空间
怎么回收?
系统会根据回收区的起始地址,从空闲分区链表中找到相应的插入点;此时可能会有如下四种情况
动态分区分配算法
- 基于顺序搜索
首次适应算法(FF)
要求空闲分区链以地址递增的顺序链接,在分配内存时从链首开始顺序查找,直到找到一个满足要求的分区为止,如果从链首到链尾都找不到一个分区,那说明系统中已经没有一个足够大的内存分配给进程,内存分配失败
优点:倾向于先利用内存中低址部分的空闲分区,从而保留高址部分的大部分分区,为大作业的内存分配创造了条件
缺点:低址不断被划分,产生很多细小的空闲分区(碎片)
最佳适应算法(BF)
将空闲分区按照大小连接形成空闲分区链,要求每次为作业分配内存时,总是能把最小的又符合要求的空闲分区分配给作业;也就是每次寻找适合的内存分区都要按照从小到大排序,然后寻找最小又满足要求的
缺点:会产生很多小碎片,算法开销大,回收分区后可能需要对空闲分区队列重新排序
循环首次适应算法/邻近适应算法(NF)
不再是从链首开始查询,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到下一个满足要求的分区,从中划出一块与请求的大小相等的内存分区分配给作业
优点:减少了查询空闲区间的开销,使空闲区间分布更加均匀
缺点:会使较大的空闲分区比较匮乏
最坏适应算法(WF)
与最佳相反,每次都是挑选的最大的空闲区,从中割取一部分给作业使用;对中、小作业有利,且查询效率很高
优点:剩下的空闲区不至于太小,产生碎片的几率也是最小的缺点:没有足够大的分区存放大进程,算法开销大
- 基于索引搜索
快速适应算法
算法会根据进程常用的空间大小对空间大小进行划分;第一步会根据进程的长度从索引表中寻找能容纳它的最小空闲分区表;第二步会从空闲分区表中取下第一块进行分配
优点:查找效率高,并且在内存分配时不会切割任何分区,因此不会产生碎片
缺点:为了有效合并分区,分区归还内存时的算法比较复杂,系统开销大。系统在分配分区时以进程为单位,一个分区只属于一个进程,
属于典型的以空间换时间
伙伴系统
哈希算法
建立一张以空闲分区大小作为关键字的哈希表,每个表项对应记录空闲分区链的头指针,分配时通过哈希函数计算哈希表中的位置,从而得到相应的空闲分区链表
非连续分配方式【分页+分段+段页式】
分页存储管理的基本方法
重要考点:根据内存块的数量计算页表项中块号大小(按字节编址)
基本分页变换机构
分页管理方式
段页式管理方式
虚拟内存管理
相比传统存储管理方式的缺点
局部性原理
虚拟存储器的特征
请求分页的页表机制
请求分页的缺页中断机构执行流程
请求分页地址变换过程(侧重与基本分页有什么不同)
①请求分页:首先会检索快表,查看页号是否存在
②修改页表项:如果查询到页表项存在,修改访问位为1,如果是写指令,还需要修改脏位,然后利用页表项的物理块号与页内地址组成物理地址,地址变换结束
③页面置换:如果快表未命中,就需要在内存页表中去查询页表项,并查看对应的状态位P以确定该页是否被调入了内存,如果已经调入了内存那么需要将该页表项写入快表,如果快表已满还需要按照算法调出其他页表项,再把该页表项调入;如果该页尚未调入内存,则产生缺页中断,并请求外存把该页调入内存
页面分配策略
页面置换算法
-
最佳页面置换算法(OPT)
发生缺页时选择将来最长时间不会被访问的页面换出
-
先进先出页面置换算法(FIFO)
发生缺页时把驻留时间最久的页面予以淘汰
只有在FIFO算法中会出现随着进程的物理块增多,缺页次数不减反增的异常现象——Belady异常
-
最近最久未使用页面置换算法(LRU)和最少使用页面置换算法(LFU)
LRU的硬件支持:寄存器和栈(当进程访问某页面时,便将该页面的页面号从栈移除,并压入栈顶,因此栈顶始终是最新未被访问的页面号)
-
clock页面置换算法(NRU,Not Recently Used)
-
改进型clock页面置换算法
因为淘汰被修改的页面的代价大,需要写入磁盘,所以淘汰时优先选择没有被访且没有被改过的页面
淘汰访问的优先级大于修改的页面,先比是否访问,再比是否修改
第一种情况
第二种情况
抖动与工作集
-
产生抖动的原因
同时在系统中运行的进程太多,导致分配给每个进程的物理块太少,不能满足进程正常运行得到基本要求,致使每个进程在运行时会频繁地出现缺页,必须请求系统将所缺页调入内存,使得系统中排队等待页面换入/换出的进程数量增加,造成每个进程的大部分时间都用于页面的换入/换出,而几乎不能去做其他有效的工作
-
工作集(驻留集大小不能小于工作集,可以根据工作集来设计驻留集)
-
预防抖动
内存映射文件(系统调用)
mmap将内存块的地址进行映射,进程通过这个地址访问内存就能获取相应的页面;相对传统的页面读取就不需要再将整个页面调入内存,缺页时由操作系统负责磁盘的读写,退出文件映射时才会将改动的页面写回磁盘
内存映射文件还能实现共享内存,只需要修改进程的页表,让虚拟地址空间映射到相同的物理内存(即相同的物理框号)
优点:程序员编程简单,建立映射后只需要以访问内存的方式读取读写即可;方便多个进程共享同一个磁盘文件;文件的读写完全由操作系统完成,操作系统可以采用预读入、缓写出的策略提高I/O速率
虚拟存储器性能影响因素
以缺页率作为主要的影响因素,而缺页率又受到页面大小,分配的物理块数,页面置换算法,程序的固有属性等等
小综合【结合计组】
结合王道题目:分析访问0x03d4 0x00f1 0x0229的过程
第四章 文件管理
文件的逻辑结构
- 有结构文件/无结构文件
- 顺序文件/索引文件/索引顺序文件
索引文件本身也是一种定长记录的顺序文件
文件目录
文件目录也是一种数据结构,用于标志系统中的文件及其物理地址,供检索时使用
单级文件目录
单级文件目录时最简单的文件目录,整个文件系统中只建立一张目录表,每个文件占一个目录项
优点:简单
缺点:①查找速度慢;②不允许重名,在一个目录表中所有文件都不能与另外一个文件有相同的名字;③不便于实现文件共
两级文件目录
为用户再建立一个单独的用户文件目录UFD,这些UFD具有相似的结构,它们由所有文件的FCB组成,再为这些用户文件目录建立一张主文件目录MFD
提高了检索速度、允许重名、可以使用不同文件名来访问系统中的同一个共享文件
多级文件目录
访问文件时需要用文件路径名标识符
无环图目录结构(方便实现文件共享,这是上述树型文件共有的缺点)
索引节点(由文件名和文件索引指针构成)
文件的物理结构
连续分配方式
文件分配空间必须连续,文件目录中存放起始块号和长度,逻辑地址转换成物理地址只需要转换块号即可;起始块号+长度i定位至第i块
优点:支持顺序访问和直接访问
缺点:要为一个文件分配连续的空间,容易产生外部碎片;必须事先知道文件的长度,且无法动态增长否则会覆盖相邻的后续文件;为保持文件的有序性,需要对相邻的文件进行物理上的移动
链接分配方式(题目没有提到,默认隐式链接)
- 隐式链接
- 目录项中包含文件第一块的指针和最后一块的指针,每个文件对应一个磁盘块的链表,磁盘块分布在磁盘的任何地方,这些指针对用户是透明的
-
文件名 起始块号 结束块号
-
- 逻辑地址怎么转换物理地址:操作系统根据文件名在目录项中找到起始块号,然后读入逻辑0块,根据下一块的指针读入下一块,以此类推直到第i块
- 缺点:只支持顺序访问,不支持直接访问文件的第i块,只能从第一块开始寻找;稳定性问题,任何一个指针出问题都会导致文件数据的丢失;指向下一个盘块的指针也会耗费一定的存储空间87354
- 优点:文件可扩展性很高,只需要修改结束块号;且不会产生内部碎片
- 目录项中包含文件第一块的指针和最后一块的指针,每个文件对应一个磁盘块的链表,磁盘块分布在磁盘的任何地方,这些指针对用户是透明的
- 显示链接
- 目录项只存放起始块号
- 逻辑地址转换成物理地址:操作系统根据文件名查询起始块号,然后在FAT表中寻找第i个逻辑块
- 优点:支持顺序访问,随机访问,事先通过FAT表查询第i个逻辑块即可;FAT表常驻内存,减少了检索次数
- 缺点:FAT表需要占用一定的内存空间
索引分配方式
将索引表放入索引块,文件目录项存放文件名和索引块号;
逻辑地址转换成物理地址:用户给出逻辑块号、文件名,操作系统根据文件名找到相应的索引块号,将索引块从外存读入内存,并查找索引表的第i个逻辑块即可得到逻辑块的外存存放地址
优点:容易扩展
怎么区分索引分配,索引文件
索引文件是文件主自己定义的一类文件,操作系统角度看仍然是普通的文件。记录的关键词是逻辑块的逻辑地址
索引分配是操作系统真正地创建索引表,关键词是逻辑块的物理地址
怎么区分链接分配和链接文件
链接文件是用户视角自己在文件内定义文件指针,底层存放的形式可能是顺序的也可能是链式的
链接分配是操作系统在存放逻辑块的时候采用链接方式存放
文件存储空间管理
卷:可以由一个磁盘,也可以由多个磁盘构成;每个卷包含目录区和文件区,目录区用来存放FCB,文件区用来存放文件数据
磁盘空闲空间管理办法
- 空闲表法
- 空闲链表法——空闲盘块链
- 空闲链表法——空闲盘区链
- 回收17、18盘区的时候没有与之相邻的盘区,所以会将其挂在链尾;回收20盘区时会将其合并至21-23盘区
- 位示图法
- 会计算(字号,位号)<——>盘块号
- 会计算(字号,位号)<——>盘块号
- 成组链接法
- 什么是超级块?超级块记录了下一组空闲盘块的个数,以及每个空闲块号
- 怎么分配
- 怎么回收
文件的基本操作
基本操作 | 背后的原理 |
---|---|
创建文件 | 为新文件分配外存空间(空闲表法,空闲链表法,位图法......)在目录中创建一个目录项,记录文件名和外存地址信息 |
删除文件 | 根据文件名查找目录,删除对应的文件目录项和FCB,并回收磁盘空间和内存缓冲区 |
打开文件 | 根据文件名找到目录项,将目录项复制到“打开文件表”,并返回打开文件表的索引号,之后用户使用打开文件表的编号来指明要操作的文件;每个用户进程的文件打开表的系统索引号都会指向系统文件打开表对应的编号,当有多个用户进程指向同一个系统打开文件表的编号时,采用打开计数器记录有多少个进程打开了该文件 系统打开文件表的特有属性:打开计数器 进程打开文件表的特有属性:读写权限,读写指针 打开文件并没有把文件数据直接读入,而是将文件目录项读入 |
删除文件 | 删除进程的文件打开表的相应的表项,并回收相应的磁盘空间和内存缓冲区,同时对系统打开文件表的计数器减一,如果系统文件打开表的计算器删至0需要删除系统文件打开表的对应表项 |
读文件 | 注意区分Read和Open,问Read和Open哪一个需要文件名? Open需要文件名,Read需要的参数是Open返回的文件标识符 |
写文件 | ![]() |
文件共享
- 硬链接
- 多个指针指向同一个缩影节点,保证只要还有一个指针指向索引节点,索引节点就不能被删除
- 多个指针指向同一个缩影节点,保证只要还有一个指针指向索引节点,索引节点就不能被删除
- 软链接(符号链接)
- 将到达共享文件的路径保存下来,当要访问文件时,根据路径来寻找文件
- 查找过程:当用户要访问文件的时候,才做系统看到要访问的文件属于LINK类型,就会根据其中记录的路径名依次查找目录,直到找到该文件的索引节点,然后进行读写
文件保护
文件层次结构
文件系统的全局结构(外存和内存)
虚拟文件系统
屏蔽不同文件系统的差异和操作细节
打开文件后,创建Vnode,并将文件信息复制到VNode中,VNode的功能指针指向具体文件系统的函数功能
文件挂载
第五章 IO管理
IO控制器(接口)及IO端口(寄存器)编址
【参考计组】
IO控制方式
【参考计组】程序查询方式、程序中断方式、DMA方式
IO软件层次结构(牢记各层的职责)
输入输出应用程序IO接口 & 设备驱动程序IO接口
设备驱动程序接口需要向上层提供一个统一的接口
IO核心子系统
要实现的功能:就是中间三层对应需要实现的功能
SPOOLing技术
- 什么是脱机技术:引用专门的外围控制机,将设备上的数据传到高速磁盘上,或者CPU想要输入数据的时候,能够直接读取磁盘上的数据;实现预输入,缓输出
- 假脱机技术:采用软件实现脱机技术
- CPU先将要打印的数据输出到磁盘的输出井中,然后做洽谈事情。如果此时打印机被占用,SPOOLing系统会将这个答应请求挂在等待队列上,等打印机有空时再将数据打印出来
设备分配与回收
- 考虑因素:设备的固有属性、设备分配算法、设备分配时的安全性
- 设备的固有属性
- 独占设备、共享设备、虚拟设备
- 设备的分配算法
- FCFS/最高优先级
- 设备分配的安全性
- 安全分配方式:进程发出IO请求后,就被阻塞,直到IO完成;设备分配安全,但是CPU和IO设备是串行工作的
- 不安全分配方式:进程发出IO请求后仍继续运行,只有当进程请求的设备被另一进程占用时才会进入阻塞态;一个进程可以同时操作多个设备,但是可能造成死锁
静态分配与动态分配
设备分配的数据结构
- 设备控制表DCT
- 控制器控制表COCT
- 通道控制表CHCT
- 系统设备表(记录的是全部设备的情况)
设备分配步骤
改进:
缓冲区管理
- 缓冲区的作用
- 单缓冲
- 平均传输时间:Max(输入时 间T,CPU处理时间C)+M(缓冲区传输时间)
- 双缓冲
- 平均传输时间:MAX(C+M,T)
- 缓冲池和循环缓冲
磁盘
明确三个因素——寻道时间、平均旋转延迟时间和,操作系统唯一可以影响的是寻道时间
调度算法
- 先来先服务FCFS:公平,但是仅适合于访问请求是簇聚的文件扇区
- 最短寻到时间优先SSFT:贪心算法的思想,每次选择离当前磁道最近的磁道。但是容易造成饥饿现象
- 扫描算法SCAN:只有磁头移动到最外侧的时候才能够往内移动,只有移动到最内侧的时候才能往外移动;不会产生饥饿现象;①只有到达最边上的时候才能改变磁头移动方向;②对于每个磁道的访问频率是不规律的,有可能中间某个磁道要等待较长的时间才能被下一次访问;而最边上的磁道被访问后不久又能马上被访问
改进:①LOOK调度(朝着一个方向移动,向前查看是否还有请求,没有则直接返回);②C-SCAN算法 - 循环扫描算法C-SCAN:规定磁头朝着某个方向移动的时候才会处理请求,而在返回的时候快速返回不处理任何请求
改进:增加LOOK调度 - C-LOOK调度算法:增加了LOOK算法的C-SCAN算法,并且返回时不需要回到最开头
LOOK和C-LOOK:LOOK算法不需要移动到最边缘,C-LOOK在此基础上返回不需要回到最开始
减少延迟时间的方法
交替编号
错位命名
磁盘管理
- 磁盘初始化:①低级格式化(物理格式化),将磁盘的各个磁道划分为扇区,一个扇区可以分为头,数据区域,尾三个部分组成;
- 分区,将磁盘分区,每个分区由一个或多个柱面组成;然后对物理分区进行逻辑格式化,将文件系统数据结构存储在磁盘上;
- 引导块:ROM上存放很小的自举装入程序,而将完整的引导程序般存在磁盘的启动块上
- 坏块:简单磁盘可以通过在FAT上进行标注,程序不再使用;此外,磁盘会保留一部分扇区用来替换坏块
固态硬盘
【参考计组】