操作系统期末复习重要知识点
第一章:概述
- 现代OS最基本的两个特征:并发与共享
- 并行和并发的区别:
- 并行:concurrent running,即便在单核环境也能在同一时刻发生并执行
- 并发:alternative execution,即便在多核环境中也是同一时间间隔内发生
- 系统调用syscall,是用户程序申请系统服务的接口,令其能间接访问到由内核管理的资源(如CPU,内存,I/O……)
- 在用户态下使用特权指令产生的是访管中断(内核态也被称为管态)
- 中断是硬件机制,将用户态转为核心态,而核心态转回用户态则是OS程序完成的
- 中断,由OS负责的是:提供中断服务,初始化中断向量表,保存中断屏蔽字
- 被中断的程序的中断点由中断指令隐含的硬件压栈操作完成
第二章:进程
- 进程 = P C B + 程序 + 数据 进程=PCB+程序+数据 进程=PCB+程序+数据
- PCB是进程存在的唯一标志,包含四大内容:进程描述信息,进程控制和管理信息,资源分配清单,处理器相关信息
- 进程的五大特性:异步性、并发性、动态性、独立性(封闭性)、结构性
- 进程的三个主要状态:就绪(等CPU)、运行(跑起来了)、阻塞(等各种资源)
- 进程创建后,立刻挂入就绪态
- 其中阻塞是进程自身的主动行为(比如跑着跑着发现需要申请新服务了)
- 阻塞状态的进程等待的条件被满足时,它就被唤醒(往往是被相关进程唤醒),进入就绪态
- 管道:实际上是内存缓冲区,具有FIFO特性,且是半双工的,里面的数据一旦被读取就被抛弃
- 满时阻塞写操作
- 空时阻塞读操作
线程与进程
- 引入线程后,拥有资源的基本单位是进程,独立调度的基本单位是线程
- 属于同一进程的若干线程共享进程的资源,比如:进程的变量、地址空间
- 进程之间的关系类似于树(或图),但同一个进程的线程之间是池关系
- 多线程模型:根据用户线程和内核线程之间的关系来划分
- 多对一模型(用户级方式):多个用户级线程映射到一个内核线程
- 一对一模型(内核级方式):每个用户线程都映射到一个内核线程
- 多对多模型(组合方式):混合上面两种模型
第三章:处理器调度
- 抢占式调度:允许紧急任务插队,直接将正在执行的低级任务踹开,给紧急任务让路
- I/O约束型:经常进行I/O操作,这些操作的CPU时间短频率高,会产生大量短CPU区间
- CPU约束型:经常进行CPU运算,占用的CPU时间长频率低,会产生少量长CPU区间
- CPU调度中一个任务的三种时间:
- 周转时间: T 周转 = T 完成 − T 到达 T_{周转}=T_{完成}-T_{到达} T周转=T完成−T到达,带权周转时间: T 周转 T 实际需要 \frac{T_{周转}}{T_{实际需要}} T实际需要T周转
- 等待时间:任务在就绪队列中等待时间的 总和 总和 总和
- 响应时间: T 响应 = T 首次运行 − T 到达 T_{响应}=T_{首次运行}-T_{到达} T响应=T首次运行−T到达
- 综上,周转时间是最久的,且等待时间越长,带权周转就越大
FCFS
- 利于长作业(CPU约束型),不利于短作业(I/O约束型)
- 非抢占式(不可剥夺)
SJF
- 普通的SJF是不可剥夺的,但SRJF是可剥夺的
- SRJF会根据当前进程中剩余时间最短的予以执行
- SJF只会简单地选一个到达的时间最短的进程进行,即便中途有更短的作业到达,他也置若罔闻
- 但无论是SJF还是SRJF,都对长作业不利,甚至可能出现死锁
RR
- 平均主义,不会出现死锁,但合适的时间片大小难以把控
- 属于可剥夺
优先级调度
- 可以动态或静态地设置优先级,让高优先级任务先执行
- 即有可剥夺版本也有不可剥夺版本
MFQS
- 将任务按优先级分成多个队列,每次从优先级最高的队列选任务
- 属于可剥夺
第四章:同步互斥,信号量
- 同步机制的一让三等原则
-
共享
≠
临界
共享\neq临界
共享=临界,二者最基本的区别在于能否一次被多个进程使用,
可以
→
共享资源
可以\to共享资源
可以→共享资源,
不可
→
临界资源
不可\to临界资源
不可→临界资源
- 例如:磁盘是共享资源,而打印机是临界资源
- 访问临界资源的代码就是临界区(如果多个进程访问同一个临界区,那么就会产生相应个数的临界区)
- 同步:即直接制约关系,进程的执行需要依赖于其它进程的结果,例如进程A依赖于进程B的运算结果,那么在B求解之前,A进程即便可占用CPU也只能放弃并阻塞,否则就会在得不到数据的情况下进行后续操作
- 互斥:即间接制约关系,因为资源不够(或都需要访问共享资源)而引起的制约,比如打印机只能由一个进程占用,那么其它需要打印机的进程就只能被阻塞
- 软件代码实现临界区互斥是高频考点
- 信号量:初值为1的semaphore代表互斥信号量;初值大于1的semaphore代表同步信号量
- PV操作是低级进程通信原语,不可被中断,不是syscall
第五章:死锁
- 系统出现死锁时:至少有两个及以上的进程处于阻塞态
- 处理策略:
- 死锁预防:破坏四个必要条件之一
- 死锁避免:防止系统进入不安全状态
- 死锁检测及解除:允许死锁发生,检测到发生死锁后采取措施解除死锁
死锁预防
- 死锁产生的四个必要条件及破坏方式:
- 互斥
- 破坏方式:将资源变得可以共享
- 不剥夺
- 破坏方式:强行剥夺一个对某些资源求而不得,同时手里又保持着不可剥夺资源的进程
- 请求保持(占有并请求)
- 破坏方式:在进程运行前,一次性分配它需要的全部资源
- 循环等待
- 破坏方式:顺序资源分配法,每个进程只能按照序号递增的顺序来申请资源
- 互斥
死锁避免
- 银行家算法:
- Available向量:代表系统可用资源,各元素表示系统各项资源的个数
- Max矩阵:表示系统中n个进程各自对m种资源的总需求量
- Allocation矩阵:表示已经分配给系统中n个进程的,m种资源的数量
- Need矩阵:表示n个进程对m种资源剩余需求量
- N e e d = M a x − A l l o c a t i o n Need=Max-Allocation Need=Max−Allocation
- 令Work向量保存Available向量,并不断地在找寻安全序列中增减分量
- 安全序列增长方式:
- 如果某个进程的Need向量小于Work向量,则将其加入安全序列,并将该进程在Allocation中对应已分配的资源回收,加入Work向量
死锁检测
- 资源分配图中,由资源到进程的边称为分配边,由进程到资源的边称为申请边
- 一类资源的闲置量=它的资源点数-分配边数
- 检测方式(死锁定理):
- 如果一个进程申请量小于等于系统中的空闲资源量,就表明这个进程不会死锁,可以减掉跟他相关的所有边
- 若能够成功减掉所有边,则系统没有死锁
第六章:内存管理
- 一个进程只有一张段表,但可能有多张页表
- 最佳适应算法将空闲区按大小递增的顺序记录
- 首次匹配算法将空闲区按地址递增的顺序记录,此方法最容易产生内部碎片
- 无论是分页还是分段,同一台机器上提供给用户的物理地址空间大小取决于段表(页表)所占大小
- OS实现分区存储管理代价最小(越简单代价越小)
- 段式存储管理是一维的,段页式管理是二维的,页式管理可能是1~n维(取决于几级页表)
- 所谓几维,看的是除了offset,还需要多少个参数来确定一个逻辑地址
- 高级管理方式中,只有段式管理才不会出现内部碎片
第七章:虚拟内存管理
- 三大特征:对换性,多次性,离散性
- 虚拟存储器最大容量只取决于:CPU寻址空间
- Belady异常:分配的物理块数增加,缺页异常不减反增的怪象
- 只可能出现在FIFO置换算法中
- 注:抖动是所有策略都可能出现的
- OPT置换算法:无法实现,但能够作为评价标准
- 将未来最迟才被访问的页面换出
- LRU置换算法:将最久未使用的页面换出,使用堆栈,性能接近OPT但开销大
- CLOCK置换算法:用循环队列实现,将所有物理块围成一个圈,用一个指针扫描,扫到访问位为0的就替换之,然后指针指向这个替换块的下一块
- 改进的CLOCK算法:(访问位+修改位),替换优先级为:(0,0)>(1,0)>(0,1)>(1,1)
- 如果找到(0,0)类型的块则立刻替换,若找不到则找是否有(1,0)类型的块
- 在找(1,0)类型块时,每找一个就把它的访问位置0,变成(0,0)型
- 重复第一步
- 物理页分配策略:
- 固定分配+局部置换:为每个进程分配固定数量的物理块,整个运行期间都不改变,若发生缺页就只能从自己的物理块队列中选一个来换出去
- 可变分配+全局置换:为每个进程分配可变数量的物理块,OS自身也维护一个空闲物理块队列,如果某进程缺页,则可以从OS的全局空闲块队列中摘一个给它
- 看似非常灵活,但可能导致并发能力下降(某个进程频繁请求调块)
- 可变分配+局部置换:为每个进程分配可变数量的物理块,但不允许抢夺它人的物理块,不影响其它进程的运行
- 注:缺页次数和页置换次数不同!
第八章:I/O与存储
- 存储部分主要考磁盘:可参考CSAPP内容
- 磁盘调度算法:
- FCFS:先来先服务
- SSTF:最短寻道数优先
- SCAN:电梯法,选择当前移动方向上最近的请求,并到达尽头才折返
- C-SCAN:消除对两端磁道请求的不公,到一端尽头后,立刻从另一端的尽头又开始找
- LOOK:在SCAN基础上,取消了不必要的尽头寻道数
- C-LOOK:在C-SCAN基础上消除不必要的尽头寻道数
第九章:文件系统
文件逻辑结构,目录结构
- 逻辑文件有两种:无结构式文件(流式文件),有结构式文件
- 是为了方便用户而设计的
- 顺序文件一般指物理上顺序存储的文件
- 设置当前工作目录的主要目的:加快文件检索速度
- FCB存储着文件访问控制信息,同时实现了文件名和文件物理块之间的映射
- FCB就是文件目录项,文件目录项必须连续存放
- 树形目录结构可以方便管理和保护,但不利于共享,为此提出了无环图目录结构
- 采用多级目录结构的目的是解决命名冲突问题
- 索引节点的引入是为了轻量化文件目录项,可以将目录项中除文件名和索引节点指针的内容全部移到索引节点内,大幅度加快了文件检索速度
- 存放在磁盘上的索引节点就是磁盘索引节点,放入内存后增加一些信息就成了内存索引节点
- read调用是syscall,参数中不需要文件名,而read会调用open,open参数中才有文件名,返回一个fd,fd是read需要的参数
文件分配方式
- FAT表常驻内存,因此显式连接比隐式连接快很多,且支持随机访问,二者都不会有碎片问题
- 默认情况下,连接分配指的是隐式链接
- 索引分配中,每个文件都有一个索引块,索引块中包含了逻辑块号到物理块号的映射关系,且逻辑块号可以隐含(按顺序存放),进一步增加索引块能存储的映射项
- 支持随机访问,且容易扩展
- 为了解决大文件的索引,引入多层索引(类似于多级页表)
- Unix的混合索引分配方式就是分级的,10个直接块,1个一级索引,1个二级索引,1个三级索引
- 注:分析时留意顶级索引是否已读入内存!
文件存储管理
- 本质是对外存空闲区的管理
- 空闲表法:将每一段连续空闲块的首块号和连续空块数作为表项存储
- 适合管理连续分配方式的空闲块管理,方便首次适配算法
- 空闲链表法:适合链接分配方式,用指针将空闲块或者空闲区间串起来,方便最佳适配算法
- 位示图法:每个bit表示一个盘块,0表示空闲,1表示已分配,可用于任何分配方式