vault backup: 2026-07-03 23:22:28

This commit is contained in:
2026-07-03 23:22:28 +08:00
parent 8197fd341e
commit 3aac80fb26
41 changed files with 11906 additions and 10335 deletions

View File

@@ -0,0 +1,626 @@
# 操作系统期末知识点总结与考点分析
## 一、历年试卷考点频率统计
| 考点 | 20-21A | 21-22A | 2023A | 2025A | 频率 |
|------|--------|--------|-------|-------|------|
| 磁盘调度算法 | ✓ | ✓ | ✓ | ✓ | ★★★★★ |
| 虚拟内存页面置换 | ✓ | ✓ | ✓ | ✓ | ★★★★★ |
| 进程控制(fork) | ✓ | ✓ | ✓ | ✓ | ★★★★★ |
| CPU调度算法 | ✓ | - | ✓ | ✓ | ★★★★ |
| 文件系统(Ext2/inode) | - | ✓ | ✓ | ✓ | ★★★★ |
| I/O控制方式 | ✓ | - | - | ✓ | ★★★ |
| 段页式地址转换 | ✓ | ✓ | - | - | ★★★ |
| 银行家算法 | ✓ | - | - | - | ★★ |
| 工作集模型 | ✓ | ✓ | ✓ | - | ★★★ |
| 代码优化 | - | ✓ | ✓ | - | ★★ |
| 系统运行机制 | - | - | ✓ | - | ★★ |
| 多级反馈队列 | - | - | ✓ | - | ★★ |
---
## 二、各章核心知识点总结
### 第1章操作系统概述
**考点OS基本概念、发展历史、结构**
- **四大特征**:并发、共享、虚拟、异步
- **OS结构类型**
- 单体结构Linux所有服务在内核态运行性能好但耦合度高
- 分层结构:按层次组织,便于调试但层间通信开销大
- 微内核结构:内核只保留最基本功能,其余在用户态运行,可靠性高但性能差
- 虚拟机结构在硬件上运行多个OS实例
---
### 第2章系统运行机制
**考点中断、MMU、CPU双模式、系统调用**
- **中断机制**
- 硬中断:外部设备产生,异步
- 软中断异常CPU内部产生同步除零错误、缺页异常、系统调用
- **时钟中断**OS获得CPU控制权的关键机制
- **MMU地址转换**
- 逻辑地址 → 物理地址的硬件支持
- U/S位用户态/内核态标识,实现内存保护
- **CPU双模式**
- 用户态(目态)→ 内核态(管态):通过中断/异常/系统调用
- 内核态 → 用户态通过PSW程序状态字切换
- **系统调用流程**
```
用户程序 → 系统调用号放入EAX → int $0x80 → 内核态
→ 查系统调用表 → 执行服务程序 → 返回用户态
```
---
### 第3章Linux基础
**考点:目录结构、文件权限、/proc文件系统**
- **目录结构**/bin, /etc, /home, /proc, /dev, /tmp
- **文件权限**chmod 数字法r=4, w=2, x=1
- **/proc文件系统**:虚拟文件系统,提供进程和内核信息
---
### 第4章C语言开发基础
**考点编译流程、ELF内存布局、调试**
- **编译流程**:预处理 → 编译 → 汇编 → 链接
- **ELF内存布局**(从低到高):
```
.text代码段
.rodata只读数据
.data已初始化全局变量
.bss未初始化全局变量不占磁盘空间
heap向上增长 ↗)
stack向下增长 ↘)
```
- **关键区别**.bss不占磁盘空间但占内存空间运行时分配
---
### 第5-6章文件I/O
**考点UNIX IO、文件描述符共享、mmap、重定向**
- **UNIX IO函数**open/read/write/close/lseek
- **文件描述符表共享**
```
进程fd表 → 文件表(引用计数) → v-node表共享
fork后父子进程共享文件表引用计数+1
```
- **mmap内存映射**将文件映射到进程地址空间实现高效I/O
- **dup2重定向**实现I/O重定向的标准方法
- **stdio vs UNIX IO缓冲**
- stdio有用户缓冲区全缓冲/行缓冲/无缓冲)
- UNIX IO无用户缓冲区
---
### 第7章磁盘空间管理 ★★★★★必考
**考点分配方式、Ext2文件系统、inode混合索引**
- **三种分配方式**
- 连续分配:支持顺序/随机访问,有外部碎片
- 链接分配无外部碎片只支持顺序访问FAT是改进
- 索引分配:支持直接/间接访问inode是典型实现
- **FAT文件系统**FAT12/16/32链接分配的改进版本
- **NTFS**基于MFT主文件表B+树结构
- **Ext2文件系统**(重点):
```
超级块 → 块组描述符 → 块位图 → inode位图 → inode表 → 数据块
```
- **inode结构**15个地址项
- 0-11直接索引12个块
- 12一次间接索引256个块假设块大小1KB指针4字节
- 13二次间接索引256×256个块
- 14三次间接索引256³个块
- **最大文件计算**
```
块大小=1KB指针=4B则每块256个指针
直接12块
一次间接256块
二次间接256×256=65536块
三次间接256³=16777216块
总计12+256+65536+16777216 ≈ 16GB+
```
- **HDFS**分布式文件系统NameNode+DataNode架构
- **空闲空间管理**:位图法、成组链接法
- **RAID**
- RAID0条带化无冗余
- RAID1镜像100%冗余
- RAID3位交叉+专用校验盘
- RAID5块交叉+分布式校验
---
### 第8章进程控制 ★★★★★必考
**考点fork/exec/wait/exit、僵尸进程、shell实现**
- **fork()**
- 调用一次返回两次父进程返回子进程PID子进程返回0
- **COW写时复制**:父子进程共享物理页,写时才复制
- fork后文件描述符共享引用计数+1
- **exec系列函数**:替换进程映像,不创建新进程
- **wait/waitpid**
- 阻塞等待子进程状态变化
- 回收子进程资源,防止僵尸进程
- **exit/_exit**
- exit执行清理刷新缓冲区、调用atexit处理函数
- _exit直接退出不执行清理
- **僵尸进程**
- 子进程exit但父进程未wait
- 解决方法父进程调用wait/waitpid或SIGCHLD信号处理
- **shell实现**
```c
// 基本框架
while (1) {
读取命令行
解析命令
if (内置命令) 直接执行
else {
pid = fork()
if (pid == 0) execvp(...) // 子进程执行
else wait(NULL) // 父进程等待
}
}
```
- **守护进程daemon创建5步**
1. fork()创建子进程父进程exit
2. setsid()创建新会话
3. fork()再次fork父进程exit防止重新获得控制终端
4. chdir("/")改变工作目录
5. umask(0)重设文件权限掩码
---
### 第9章多线程 ★★★★
**考点pthread API、竞态条件、互斥锁、信号量、生产者消费者**
- **pthread API**
```c
pthread_create() // 创建线程
pthread_join() // 等待线程结束
pthread_exit() // 退出线程
pthread_detach() // 分离线程
```
- **竞态条件Race Condition**
- 多线程并发访问共享数据,结果取决于执行顺序
- 解决:互斥锁、信号量
- **互斥锁Mutex**
```c
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex); // 加锁
// 临界区
pthread_mutex_unlock(&mutex); // 解锁
```
- **信号量Semaphore**
- P操作waitS--若S<0则阻塞
- V操作signalS++,若有等待者则唤醒
- **实现同步和互斥**
- **生产者消费者模型**
```
信号量:
mutex = 1 // 互斥访问缓冲区
empty = N // 空闲缓冲区数量
full = 0 // 满缓冲区数量
生产者: 消费者:
P(empty) P(full)
P(mutex) P(mutex)
放入产品 取出产品
V(mutex) V(mutex)
V(full) V(empty)
```
- **并行计算**
- 加速比 S = T_serial / T_parallel
- 效率 E = S / PP为处理器数量
- Amdahl定律S = 1 / ((1-f) + f/P)
---
### 第10章进程间通信IPC
**考点:管道、消息队列、共享内存、信号**
- **管道**
- 匿名管道:只能用于父子进程,单向通信
- 命名管道FIFO可用于无亲缘关系进程
- **消息队列**:内核中的链表,按消息类型读取
- **共享内存**最快的IPC方式需要同步机制保护
- **信号**异步通知机制SIGINT/SIGTERM/SIGCHLD等
---
### 第11章网络编程
**考点Socket API、TCP客户端服务器模型**
- **Socket API**
```c
// 服务器
socket() → bind() → listen() → accept() → read/write → close()
// 客户端
socket() → connect() → read/write → close()
```
- **字节序转换**htonl/htons/ntohl/ntohs
---
### 第12章并发服务器
**考点:多进程/多线程模型、I/O多路复用、线程池**
- **多进程模型**fork per request简单但开销大
- **多线程模型**pthread_create per request开销较小
- **I/O多路复用select**
```c
fd_set read_set;
FD_ZERO(&read_set);
FD_SET(fd, &read_set);
select(maxfd+1, &read_set, NULL, NULL, NULL);
```
- **线程池**:预先创建线程,减少创建/销毁开销
---
### 第13章CPU调度 ★★★★
**考点调度算法计算、优先级反转、CFS**
- **三级调度**:高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)
- **调度算法**
- **FCFS**(先来先服务):简单,对长作业有利
- **SJF/SRTF**(最短作业优先/最短剩余时间优先):平均等待时间最短,但可能饥饿
- **HRRF**(最高响应比优先):响应比 = 1 + 等待时间/运行时间
- **RR**时间片轮转时间片太大退化为FCFS太小上下文切换开销大
- **MFQ**(多级反馈队列):综合了多种算法优点
- **优先级调度**:可能导致低优先级饥饿
- **优先级反转**:高优先级进程等待低优先级进程持有的资源
- 解决方案:优先级继承协议
- **EDF**(最早截止时间优先):实时调度
- **LLF**(最低松弛度优先):松弛度 = 截止时间 - 剩余执行时间
- **CFS**完全公平调度Linux默认
- vruntime虚拟运行时间
- 红黑树组织运行队列
- **调度公式**
```
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 运行时间
平均周转时间 = Σ周转时间 / n
```
---
### 第14章死锁 ★★★
**考点:必要条件、资源分配图、银行家算法**
- **四个必要条件**
1. 互斥条件
2. 请求和保持条件
3. 不可抢占条件
4. 循环等待条件
- **资源分配图**:检测死锁的图形化方法
- **银行家算法**
```
Available: 系统可用资源向量
Max: 进程最大需求矩阵
Allocation: 已分配矩阵
Need = Max - Allocation: 还需要矩阵
安全性检查:
1. Work = Available, Finish = false
2. 找一个 Need ≤ Work 且 Finish=false 的进程
3. Work += Allocation, Finish = true
4. 重复直到所有 Finish=true安全或找不到不安全
```
- **死锁处理**
- 预防:破坏四个必要条件之一
- 避免:银行家算法
- 检测:资源分配图
- 恢夺:终止进程或资源抢占
---
### 第15章内存管理 ★★★★
**考点地址转换、页表、TLB、多级页表、段页式**
- **逻辑地址 vs 物理地址**
- **分页管理**
- 虚拟页号(VPN) + 页内偏移(VPO)
- 物理帧号(PPN) + 帧内偏移(PPO)
- 页表项有效位、脏位、引用位、R/W位、U/S位
- **缺页处理**
```
访问页表 → 有效位=0 → 缺页异常
→ 选择牺牲页(若修改过则写回磁盘)
→ 从磁盘调入新页
→ 更新页表 → 重新执行指令
```
- **TLB快表**
```
有效访问时间 EAT = λ + t + (1-a)·t
λ: TLB访问时间
t: 内存访问时间
a: TLB命中率
```
- **多级页表**:减少页表占用的连续内存
- 二级页表VPN分为两部分第一级索引页目录第二级索引页表
- **倒排页表**:按物理帧组织,减少内存占用但查找慢
- **段页式**:三维地址(段号 + 页号 + 页内偏移)
---
### 第16章虚拟内存 ★★★★★必考
**考点:页面置换算法、工作集、抖动**
- **请求调页**:访问时才调入页面
- **局部性原理**
- 时间局部性:最近访问的数据可能再次访问
- 空间局部性:相邻地址可能被访问
- **页面置换算法**(重点中的重点):
- **OPT**(最优算法):替换将来最长时间不使用的页面,理论最优但不可实现
- **FIFO**(先进先出):可能产生**Belady异常**(增加页框数反而增加缺页次数)
- **LRU**最近最久未使用替换最长时间未使用的页面无Belady异常
- **Clock算法**LRU的近似检查引用位
- **LFU**(最不经常使用):替换访问次数最少的页面
- **抖动Thrashing**
- 分配的页框数太少,频繁缺页
- 工作集 > 分配的页框数
- **工作集模型**
```
工作集 W(t, Δ) = 在时刻t前Δ时间窗口内访问的页面集合
Δ: 工作集窗口大小
```
- 若 W(t,Δ) > 分配页框数 → 抖动
- **内存分配策略**
- 固定分配 vs 可变分配
- 全局置换 vs 局部置换
---
### 第17章I/O系统 ★★★
**考点I/O控制方式、缓冲、磁盘调度**
- **四种I/O控制方式**
1. **程序直接控制**CPU忙等效率最低
2. **中断驱动**CPU不必忙等但每次传输一个字
3. **DMA**:直接内存访问,以块为单位传输
4. **通道**独立的I/O处理器执行通道程序
- **I/O软件层次**
```
用户层I/O软件
设备独立性软件
设备驱动程序
中断处理程序
硬件
```
- **缓冲**
- 单缓冲、双缓冲、循环缓冲、缓冲池
- **SPOOLing**:假脱机技术,将独占设备改为共享设备
- **磁盘调度算法**(必考):
- **FCFS**:简单但移动距离长
- **SSTF**(最短寻道时间优先):可能饥饿
- **SCAN**(电梯算法):双向扫描到边界
- **C-SCAN**:单向扫描,返回时快速移动
- **LOOK/C-LOOK**:改进版,不到达边界
- **磁盘访问时间**
```
访问时间 = 寻道时间 + 旋转延迟 + 传输时间
```
---
### 第18章代码优化
**考点CPE、代码移动、消除别名、循环展开**
- **CPE**(每元素周期数):衡量循环性能
- **优化技术**
1. **代码移动**:将循环不变量移到循环外
2. **消除过程调用**:用内联代码替代函数调用
3. **减少内存引用**:使用局部变量累积,最后写回
4. **消除指针别名**使用restrict关键字或引入局部变量
5. **循环展开**:减少循环控制开销
6. **SIMD**:单指令多数据流
- **指针别名问题**
```c
void twiddle1(int *xp, int *yp) {
*xp += *yp;
*xp += *yp;
}
// 若xp==yp结果是4倍否则是2倍
// 引入局部变量可消除别名影响
```
---
## 三、高频计算题型总结
### 1. 磁盘调度计算(每年必考)
**题型**:给定磁道请求序列和磁头初始位置,计算各算法的磁头移动总道数
**解题模板**
```
请求序列98,183,37,122,14,124,65,67
初始位置53
FCFS: 53→98→183→37→122→14→124→65→67
SSTF: 53→65→67→37→14→98→122→124→183
SCAN: 53→37→14→0→65→67→98→122→124→183
C-SCAN: 53→65→67→98→122→124→183→0→14→37
```
---
### 2. 虚拟内存页面置换(每年必考)
**题型**:给定页面访问序列和页框数,计算各算法的缺页次数
**解题模板**
```
访问序列7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
页框数3
OPT: 替换将来最长时间不用的
FIFO: 替换最早进入的
LRU: 替换最长时间未使用的
```
---
### 3. fork进程树分析每年必考
**题型**分析fork()调用序列,画出进程树
**关键规则**
- fork()创建子进程子进程从fork处继续执行
- 进程总数 = 2^nn为fork调用次数假设无嵌套
- 嵌套fork需仔细跟踪每个进程的执行路径
---
### 4. CPU调度计算
**题型**:给定进程到达时间和运行时间,计算各算法的周转时间
**公式**
```
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 运行时间
```
---
### 5. Ext2 inode最大文件计算
**题型**给定块大小和指针大小计算单个inode支持的最大文件
**公式**
```
每块指针数 = 块大小 / 指针大小
直接索引12块
一次间接:块指针数
二次间接:块指针数²
三次间接:块指针数³
```
---
### 6. TLB有效访问时间计算
**题型**给定TLB访问时间、内存访问时间、TLB命中率计算EAT
**公式**
```
EAT = λ + t + (1-a)·t
```
---
### 7. 银行家算法
**题型**:给定资源分配状态,判断是否安全
**步骤**
1. 计算Need矩阵 = Max - Allocation
2. 执行安全性检查算法
3. 判断是否存在安全序列
---
## 四、2026年考试预测
### 必考题型(概率>90%
1. 磁盘调度算法计算SSTF/SCAN/C-SCAN
2. 虚拟内存页面置换OPT/FIFO/LRU
3. fork进程树分析
4. 文件系统inode计算或Ext2结构分析
### 高概率题型概率60-90%
5. CPU调度算法HRRF或SJF
6. I/O控制方式比较
7. 段页式地址转换
### 可能题型概率30-60%
8. 银行家算法安全性检查
9. 代码优化(别名问题、循环展开)
10. 工作集模型与抖动分析
11. 多线程同步(生产者消费者)
---
## 五、复习建议
1. **重点掌握计算题**磁盘调度、页面置换、CPU调度、inode计算必考
2. **理解fork机制**:画进程树是每年必考题型
3. **掌握基本概念**I/O控制方式、死锁条件、虚拟内存原理
4. **练习画图**:进程树、资源分配图、地址转换过程
5. **熟悉公式**EAT、CPI、周转时间、响应比等