Table of contents
绪论
裸机、虚拟机(aka拓展机,不是开一个子系统那种虚拟机)
联机、脱机
批处理系统、实时操作系统、分时操作系统;通用操作系统
操作系统特征:并发、共享、虚拟、异步
并发是“多个任务交替推进、看起来同时进行”,并行是“多个任务在同一时刻真正同时执行”。
资源管理:进程管理、存储器管理、设备管理(外部 I/O 设备资源)、文件管理
操作系统中的中断可分为以下几类:
外中断 Interrupt:来自 CPU 外部,通常由硬件设备异步触发。常见例子有时钟中断、键盘中断、鼠标中断、磁盘 I/O 完成中断。
异常 Exception(内部中断):来自 CPU 执行指令时发生的内部事件,通常是同步触发。异常又可分为故障 Fault、终止 Abort 和陷阱 Trap。
故障 Fault:一种可恢复的异常,处理程序修复问题后,通常回到出错指令重新执行。常见例子有缺页异常 Page Fault、除零错误 Divide-by-zero。
终止 Abort:一种严重且通常不可恢复的异常,处理程序一般会结束进程或导致系统崩溃。常见例子有严重硬件错误、机器检查异常 Machine Check。
陷阱 Trap:由程序主动执行特殊指令触发,处理完成后通常执行下一条指令。常见例子有系统调用 System Call、调试断点 Breakpoint。软中断 Software Interrupt:由软件指令主动触发,很多教材会把它看作陷阱 Trap 的一种典型形式。常见例子有
int指令、syscall、ecall。
进程管理
进程

PCB包含:PPT第三章Page17
进程的状态:就绪,阻塞,运行;挂起,活动。挂起/活动之间:激活。阻塞/就绪之间:唤醒。 “就绪、阻塞是自身健康状态,挂起、活动是人身自由状态,二者并存”
失去CPU:发生中断,CPU被OS抢走,转就绪态;发起系统调用,OS无法立即完成,转阻塞态。
进程操作使用原语,原语实现方式:开头关中断,完成后重开中断。(外部中断)
进程调度:
- 上下文切换
- 每个进程有各自低地址用户栈,共享高地址内核栈
级联终止
进程之间通信:消息,管道,共享内存
线程
动机:进程的创建、撤消、切换等操作涉及到资源(特别是内存资源)管理,时空开销较大;多个进程间的协作不方便
进程:拥有资源,调度分派单位;引入线程:进程为拥有资源单位,线程为调度分派单位

每个线程有自己的用户栈和内核栈
TCB、线程的状态
进程切换的全过程:
多线程实现的两种方法:
- 真正的线程,由 OS 内核创建并管理
- 不依赖于 OS 核心,由应用进程利用特别的线程库提供创建、同步、调度和管理(不依赖系统调用),多对一,也叫协程、纤程
用户线程和内核线程:一对一(主流) 多对多 多对一
Windows和Linux中的线程库、不同语言的线程库
进程调度
- 评价准则:
吞吐量:单位时间内运行完的进程数 周转时间:从作业提交到完成的时间间隔;带权周转时间:周转时间除以运行时间 等待时间:进程在就绪队列中等待调度的时间总和 响应时间:从提交请求到系统首次产生响应所用的时间
- 调度算法:
FCFS,SJF(SRF),RR,MQ,MFQ,PPT第5章Page18
FCFS(First-Come, First-Served / 先来先服务)
SJF(Shortest Job First / 最短作业优先)
SRF / SRTF(Shortest Remaining Time First / 最短剩余时间优先):SJF 的抢占式版本
RR(Round Robin / 时间片轮转):每个进程轮流获得固定时间片,时间片用完未完成就排到队尾。题目中同一时间时,先到达再排到队尾。对I/O型进程的奖励,使用优先级更高的附加队列。
HRRN(Highest Response Ratio Next / 高响应比优先):根据“等待时间和运行时间的综合比例”选择进程,兼顾短作业优先和长作业不饥饿。这里似乎把响应假设为完成任务了。
MQ(Multilevel Queue / 多级队列):把进程固定分到不同优先级队列中,各队列可用不同算法,但队列之间优先级固定。
MFQ / MLFQ(Multilevel Feedback Queue / 多级反馈队列):进程可在不同优先级队列间动态移动,短交互任务优先响应,长计算任务逐渐降级。(一次CPU burst)
Linux 的普通进程调度主要使用 CFS(Completely Fair Scheduler),PPT第五章P64
多CPU:
- 处理器对称性
- 共用/专属就绪队列(主流:专属,带来负载均衡问题)
- 负载均衡:推迁移,拉迁移。平衡判断标准:数量、优先级…
- 处理器亲和性:进程换到另一个CPU需要重建缓存
同步:
临界区不能同时访问,解决方案:Peterson(两个进程、忙等,第六章Page19)、关中断、内存屏障、原子指令自旋锁、信号量、互斥锁、条件变量…
Test-and-Set(TAS)原子指令,Compare-and-Swap(CAS)原子指令,指令执行期间锁内存总线。
自旋锁spinlock:基于原子指令封装来。忙等,等的时间很小,保护简单的东西,本身撞上的概率就不大。
spin_lock() 只能防止调度切换,不能防止中断。
如果同一份临界资源可能被中断处理函数访问,就必须在拿锁时关本 CPU 中断,例如用* spin_lock_irq() 或更常用的 spin_lock_irqsave()。
原子变量有用自旋锁实现,但是是阻塞等待
信号量:标记资源有多少:结构体:资源数量和阻塞队列
互斥锁:类似于二元的信号量
用两个函数:增加资源个数P和减少资源个数V来操作,PV都是内核代码,实际要系统调用来使用
实现:临界区安全靠信号量,信号量安全靠自旋锁(保护变量),自旋锁安全靠特殊硬件指令
条件变量:信号量的变式,没有了信号量中的变量,只有一个队列,多了一个条件
同步实例:
PPT第7章写很清楚了,看一下就懂了
生产者消费者 读者写者 哲学家进餐
信号量集 SP(S1, t1, d1; S2, t2, d2; …; Sn, tn, dn)
死锁
必要条件:互斥(对于资源实例来说而不是一种资源来说)、占有并等待、非抢占、循环等待
处理方法:忽略(鸵鸟策略😆),预防,避免,检测死锁及解除
预防:破坏四个条件之一。互斥是本身属性不能破坏。 占有并等待,静态资源分配法,简单、安全且易于实现但可能出现饥饿。 非抢占,应用于状态可以保存和恢复的资源,如CPU寄存器、内存,对于大多数资源并不适用。 循环等待,有序资源分配法。反证法容易证明,在循环等待场景下,资源编号不可能单向持续递增。内核中多种资源依靠自旋锁,确会用有序资源分配法。不是对所有资源排序,仅涉及嵌套获取的自旋锁
避免:一类算法,在资源动态分配过程中,借助算法防止系统进入不安全状态,以避免死锁。针对特定年代,仅用于计算的计算机,现不适用。要求提供关于如何请求资源的额外信息。安全状态。银行家算法(Dijkstra,当用户申请一组资源时,系统必须确定这些资源的分配是否仍会使系统处于安全状态,如果是就可分配资源,否则等待)
检测:死锁定理:S为死锁状态的条件是当且仅当S状态的资源分配图是不可完全简化的。资源分配图简化法。
恢复:资源剥夺法,撤消进程法。
存储器管理
操作系统存储器管理:主存、高速缓存和寄存器,不包括磁盘。但从广义的存储器来说,磁盘当然也是存储器。
内存管理单元(MMU),运行时把虚拟地址映射到物理地址的电路,通常集成在CPU内
不记录old的技术了,见PPT第9章
动态分区分配策略:首次适应算法,循环首次适应算法(从上一次的位置下一个开始找),最佳适应算法,最坏适应算法
内部碎片:分配给作业,但未被作业利用的部分,固定分区分配会产生内部碎片 外部碎片:未分配,系统保留,但尺寸太小无法利用部分,动态分区分配会产生外部碎片 拼接(Compaction):针对外部碎片,通过移动把多个分散的小分区拼接成一个大分区
伙伴系统
分页系统
将物理内存分为固定大小的块,称为帧(或称物理块、页框) 将逻辑内存也分成同样大小的块,称为页 最常见为4KB,也有更大的
分页系统中有碎片吗?没有外部碎片;进程的数据段、代码段、堆栈段等,总有末尾部分用不完,形成内部碎片。
每个进程有自己的页表,页表可被看作PCB的一部分,保存在物理内存中。
虚拟存储器
虚拟存储器是指具有请求调入和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统
物理块分配,见PPT第10章Page30
置换算法,见PPT第10章Page38
设备管理
磁盘
机械硬盘:柱面号,磁头号和扇区号;寻道时间,旋转延迟时间,传输时间;逻辑块寻址(LBA),传统的柱面-磁头-扇区的寻址方式称为CHS,出于兼容考虑仍被支持。 固态硬盘:基于闪存,需要擦取
磁盘调度(在磁盘层面上,有一堆要读取/写入的请求,谁先谁后):
PPT11章Page11,主要是机械硬盘需要。最终FSCAN。
SSD 不需要像机械硬盘那样优化磁头移动,所以读请求可以简单按顺序处理;但写请求成本更复杂,因此会尽量合并相邻写请求来提高效率。
低格(低级格式化,划分扇区),高级格式化(分区+逻辑格式化aka创建文件系统)
Linux案例: NOOP,No Operation,请求按来的顺序排队,最多做一下相邻请求合并,常用于 SSD,尤其是 Linux 4.11 之前; None,内核不太干预,让 SSD 自己处理请求,Linux 4.11 之后常用于 SSD(现代 SSD 内部控制器已经很复杂,自己会做并行、重排、磨损均衡等优化,所以 Linux 内核层面不一定需要复杂调度); Deadline,分读和写,读写都有一个LBA和一个FIFO,一般从LBA队列取请求,如果FIFO 队列前面的请求超时了,就优先处理超时请求; CFQ,Completely Fair Queuing,每个进程分配一个请求 FIFO 队列,时间片轮转,按照 I/O 优先级分类,Linux 4.11 之前常用于 HDD;
引导块: MBR+BIOS (= Master Boot Record + Basic Input/Output System = 主引导记录 + 基本输入输出系统) GPT+UEFI (= GUID Partition Table + Unified Extensible Firmware Interface = 全局唯一标识分区表 + 统一可扩展固件接口)
PPT11章Page31
硬件: 控制器:用控制寄存器、数据寄存器。 总线:系统总线(CPU可以直接控制),拓展总线。 轮询,中断,DMA,(I/O通道,现在已经不使用了,是一个别的ISA的小CPU,有执行程序的能力)
DMA,总线的一部分,外包了数据的搬运。以前是有限开放Memory给DMA,进一步开放成为IO通道那种。现在,硬盘控制器/USB控制器这些总线控制器,本身具备访问内存的能力,各种控制器在内存上有一块自己喜欢的数据结构。
应用接口:
设备驱动程序:设备驱动程序是 I/O 进程与设备控制器间的通信程序。统一的系统调用接口和设备的接口之间
上传下达。
系统调用的标准化封装
IO系统调用:阻塞(同步),非阻塞(立刻返回已有的,无论够不够要求;需要程序再去问),异步(完成IO时通过一些变量、信号、软中断或回调函数传达给应用程序)
内核IO:
缓冲(这里的一个缓冲区是一个完整缓冲块,不能被同时读写),Spooling(Simultaneous Peripheral Operating On-Line,外部设备同时联机操作,又称假脱机操作),IO保护(特权指令、内存映射到内核部分)
文件管理
文件系统
文件结构:
- 逻辑结构(没啥用:记录式(一条一条记录)、流式(字节流))
- 物理结构:在磁盘上的盘块分布(顺序结构、链接结构、索引结构)
- 目录结构:文件控制块(FCB),树型目录结构
- 文件夹是一个包含目录的文件
- 无环图目录,一般不允许通用图(有环)
- 硬链接:有两个身份。操作系统中不允许文件夹硬链接(避免环)。
- 特殊的 Windows NTFS Junction Point,为了兼容老的程序使用Documents and Settings文件夹(现在用Users)
- Linux软链接,内容中包含指向另一个文件或目录的路径信息,=Windows 快捷方式
保护:
- Linux:拥有者,拥有者的同组用户,其他 * 读,写,执行 =9位二进制。
ls -l中多一位d表示是不是文件夹 - NTFS: 存取控制表+权限继承,默认继承父文件夹的权限
- 存取控制矩阵/用户权限表
- 口令,密码
内存映射文件:
普通 I/O 是“调用 read/write,把文件内容复制到用户缓冲区”;
mmap 是“把文件对应到进程虚拟地址,程序像访问内存一样访问文件”。
文件系统实现:
按层组织:I/O 控制层 基本文件系统层 文件组织模块层 逻辑文件系统层

基本文件系统层:又称物理 I/O 层,向合适的设备驱动程序发送通用命令,处理内存和外存之间的数据块交换,关心数据块在外存和在缓冲区中的位置。简单来说,靠近IO系统的部分。
文件组织模块层:面向物理盘块。现代硬盘对外展示LBA,LBA是硬盘内部对CHS做了抽象。简单来说,管文件内的逻辑地址转换为LBA。
逻辑文件系统层:组织管理目录结构、文件夹、文件控制块( FCB )、权限控制等,有这些实例:
Windows: FAT32, exFAT, NTFS Linux: ext3, ext4, xfs, btrfs U盘常用FAT32/exFAT
文件系统在磁盘上的数据
用于文件系统管理的内存信息:
- 全局打开文件表与进程打开文件表。
- 每个进程的文件描述符,0 固定表示标准输入,1 标准输出,2 标准错误。重定向实现:先close对应的fd,再open,自动占用进程表中最前的空。
文件的盘块组织方式:连续分配、链接分配、索引分配 FAT:链接分配。分为FAT区(放每个块的下一个是谁,像链表一样,0表示空)、DIR(根目录)、DATA。 ext4:混合索引分配。分为数据块位图 block bitmap、inode位图 inode bitmap、inode表、数据。inode分为文件元数据(没有文件名,用inode编号。文件名在目录中,实现硬链接),索引,三级扩展索引。2号inode为根目录。 空间分配方式:静态分配、动态分配
空闲块管理:bitmap,链表。 改进:成组链接法,记录连续空闲区(这个好像没什么人用)
缓存:不是L1/L2 Cache那种。将读和写磁盘的操作先缓存到内存。统一缓存缓冲区,将内存映射的缓存和IO缓存统一在一起。LRU。
恢复: 事务:干就会全干。 基于日志的文件系统。崩溃就将日志重做一遍。保护的是文件系统,不是每一份文件。
其他:
- RAID。RAID5主流。三块硬盘。具体可以AI。
- 挂载。
- 虚拟文件系统。不同类型的文件系统,使用相同的系统调用接口。