第1章 引论
- OS的目标:方便性、有效性、可扩充性
- OS的基本特征:并发、共享、虚拟、异步
OS的作用
- 作为用户与计算机硬件系统之间的接口
- 作为计算机系统资源的管理者
OS的发展过程 ★
- 手工操作阶段
- 单道批处理系统:内存中只有一个程序运行
- 多道批处理系统:内存中同时有多个程序交替运行
- 分时系统:多个用户通过终端同时共享一台主机
- 实时系统:及时响应外部事件的请求
OS的结构
- 无结构
- 模块化结构
- 分层式结构
- 微内核:将无需再内核态执行的功能移到用户态执行。从而降低了内核设计的复杂性
第2章 进程管理
- 程序的顺序执行:顺序性、封闭性、可再现性
- 程序的并发执行:间断性、失去封闭性、不可再现性
进程
- 进程:进程实体的运行过程,是系统进行资源分配和调度的独立单位
- 进程实体(进程映像):程序段 + 数据段 + PCB
- PCB 是进程存在的唯一标识
- 创建进程的实质就是创建 PCB,撤销进程的实质就是撤销 PCB
线程
- 线程可以看作是轻量级的进程
- 线程的实现方式:用户级线程、内核支持线程
进程 vs 线程 ★
- 调度:进程是拥有资源的基本单位,线程是独立调度的基本单位
- 拥有资源:线程不拥有系统资源,但可以访问所属进程的系统资源
- 并发性:线程之间也可以并发执行
- 系统开销:线程的创建、撤销和切换的开销要更小
进程控制
- 进程控制是由OS的内核中的原语来实现的,它具有原子性
- 进程的阻塞是一种主动行为,唤醒是一种被动行为
- 活动就绪:进程在主存,可以被调度
- 静止就绪:进程在外存,不参与调度
进程通信
- 共享存储
- 消息传递
- 管道
- 信号量
- socket
进程同步
- 互斥是指某一资源同时只允许一个进程对其进行访问,但无法控制访问顺序
- 同步是在互斥的基础上实现对资源的有序访问
- 进程同步的原则:空闲让进、忙则等待、有限等待、让权等待
- 整型信号量
wait(Semaphore s) {
while (s <= 0);
s--;
}
signal(Semaphore s) {
s++;
}
- 记录型信号量
wait(Semaphore* s) {
s->value--;
if (s->value < 0) {
block(s->list);
}
}
signal(Semaphore* s) {
s->value++;
if (s->value <= 0) {
wakeup(s->list);
}
}
Producer-Consumer
Reader-Writer
第3章 处理机调度和死锁
处理机调度
- 高级调度:后备队列→ 就绪队列
- 低级调度:为就绪队列的进程分配 CPU 时间片
- 非抢占方式:不准插队,容易造成线程饥饿
- 抢占方式:允许插队
- 中级调度:
- 就绪挂起队列→ 就绪队列
- 就绪队列→ 就绪挂起队列
- 阻塞队列→ 阻塞挂起队列
进程调度算法 ★
先来先服务算法(FCFS)
周转时间
=
完成时间
−
提交时间
带权周转时间
=
周转时间
要求服务时间
\small\begin{aligned} &周转时间=完成时间-提交时间\\\,\\ &带权周转时间 = \frac{周转时间}{要求服务时间} \end{aligned}
周转时间=完成时间−提交时间带权周转时间=要求服务时间周转时间
短作业优先调度算法(SJF)
优先级调度算法
高响应比优先调度算法
- 在每次进行调度,先计算后备队列每个作业的响应比
响应比 = 等待时间 + 要求服务时间 要求服务时间 \small 响应比=\frac{等待时间+要求服务时间}{要求服务时间} 响应比=要求服务时间等待时间+要求服务时间
时间片轮转调度算法(RR)
多级反馈队列调度算法(MFQ)
- 第1级队列优先级最高,后续队列逐级降低
- 优先级越低,时间片越长
死锁 ★
基本概念
- 死锁的定义:多个进程之间竞争资源造成的一种互相等待的局面,若无外力作用,所有进程将无法继续推进
- 死锁产生的原因:竞争不可剥夺资源、进程执行顺序不当
死锁的预防-破坏4个必要条件
- 互斥条件:无法实现
- 不可剥夺条件:实现复杂
- 请求保持条件:进程一次申请所需全部资源,实现简单
- 循环等待条件:为所有资源编号,进程必须按编号递增申请资源
死锁的避免-银行家算法
- 令 Work 初值为 Available
- 寻找满足 Need ≤ Work 的进程,然后 Work = Work + Allocation,不断重复此步骤直到找到一个安全序列
死锁的检测-资源分配图
- 死锁定理:若状态S的资源分配图不可完全简化,则该状态为死锁
- 资源图的简化:找到一个进程满足,申请某资源的数量 ≤ 该资源的空闲数量
第4章 存储器管理
程序的链接
- 静态链接
- 装入时动态链接
- 运行时动态链接
程序的装入
- 绝对装入
- 静态重定位
- 动态重定位
连续分配管理方式 ★
单一连续分配
- 用户区内存只有一道用户程序
- 有内部碎片,利用率非常低
固定分区分配
- 用户区划分成若干固定大小的区域,每个分区只装有一道用户程序
- 有内部碎片,利用率非常低
动态分区分配
- 程序装入时动态划分区域,运行结束时撤销分区
- 动态分区策略:
- 首次适应(FF):空闲分区按地址递增,最简单,性能也最好
- 最佳适应(BF):空闲分区按容量递增,性能最差,会产生很多外部碎片
- 最坏适应(WF):空闲分区按容量递减
- 循环首次适应(NF)
非连续分配管理方式 ★
分页管理方式
- 分页的原理:将用户程序的地址空间分为若干个大小相同的页,将内存空间分为大小相同的块,页和块大小相等
- 页表的作用:将页号映射为物理块号
- 快表的作用:相当于缓存,可以加快地址变换的过程
- 两级页表:用于建立索引,以便不浪费主存空间去存储无用的页表项,也不用顺序式查找页表项
分段管理方式
- 分段的原理:将用户程序的地址分为若干个大小不同的段
- 段表的作用:将段号映射为段基址
分页 | 分段 | |
---|---|---|
基本单位 | 页的大小固定 | 段的长度不固定 |
地址空间 | 一维 | 二维 |
目的 | 为了满足系统管理的需要 | 为了满足用户的需要 |
段页式管理方式
- 每个进程一张段表,每个段一张页表
虚拟存储器 ★
局部性原理
- 时间局部性:某条指令被执行后,可能会再次执行;某个数据被访问后,可能会被再次访问。原因是程序中存在大量循环操作
- 空间局部性:某个存储单元被访问后,附近的存储单元也将被访问
虚拟存储
- 虚拟存储器:利用局部性原理,程序装入时值将程序的部分装入内存,其余部分留在外存,后续执行时再进行请求调入和置换,让用户感觉好像存在一个比实际物理内存大得多的存储器
- 虚拟存储器是一种以时间换空间的技术
- 虚拟存储器的最大容量取决于:CPU 地址
- 虚拟存储器的实际容量取决于:CPU 地址、内外存之和
缺页中断 vs 普通中断
- 缺页中断在指令执行期间处理中断请求,普通中断是在指令执行完之后
- 一条指令在执行期间可能出现多次缺页中断
抖动
- 同时运行的进程太多,分配给每个进程的物理块太少,导致每个进程运行时频繁出现缺页中断,从而使处理机的利用率急剧下降
页面置换算法
- 最佳置换算法(OPT):无法实现
- 先进先出算法(FIFO):每次缺页替换出最早的那一页
- 最近最久未用算法(LRU):利用栈实现
- 时钟算法(CLOCK)
第5章 设备管理
- I/O控制方式:程序查询方式、程序中断方式、DMA 方式、通道方式
设备分配
- 设备独立性:用户程序独立于具体使用的物理设备
- 设备独立性实现:设置一张逻辑设备表(LUT),将逻辑设备映射为物理设备
SPOOLing技术
原理
- 为了缓解高速CPU 和低速 I/O 设备之间的矛盾,引入了假脱机技术
- 用专门的外围控制机,将低速 I/O 设备的数据传送到高速磁盘上,或者相反
- 本质是一种以空间换时间的技术
组成
- 输入井、输出井
- 输入缓冲区、输出缓冲区
- 输入进程、输出进程
主要特点
- 提高了I/O操作的速度
- 将独占设备改造为共享设备
- 实现了虚拟设备功能
磁盘管理
磁盘访问时间
- 设磁盘每秒的转数为 r r r , 每条磁道的字节数为 N N N
- 寻道时间 T s T_s Ts,旋转延迟时间 T d T_d Td,传输时间 T t T_t Tt
- 数据传输率:
D = r N D = rN D=rN - 平均存取时间:
t = T s + T d + T t = T s + 1 2 r + b r N t = T_s + T_d+T_t = T_s+\frac1{2r}+\frac{b}{rN} t=Ts+Td+Tt=Ts+2r1+rNb
磁盘调度算法 ★
- 先来先服务算法(FCFS)
- 最短寻道时间优先算法(SSTF):容易造成饥饿
- 扫描算法(SCAN):电梯算法
- 循环扫描算法(C-SCAN)
第6章 文件管理
文件的逻辑结构
- 顺序文件
- 索引文件
- 索引顺序文件
- 直接(Hash)文件
文件的物理结构
- 连续分配
- 链接分配
- 隐式链接:不能随机存取,安全性容错性差
- 显式链接:使用 FAT(File Allocation Table),支持随机存取,安全性容错性好
- 索引分配
文件存储空间的管理
- 空闲表法
- 空闲链表法
- 位示图法
- 成组链接法
文件共享
- 基于索引结点
- 基于符号链