Files
obsidian/操作系统/期末知识点总结与考点分析.md

627 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 操作系统期末知识点总结与考点分析
## 一、历年试卷考点频率统计
| 考点 | 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、周转时间、响应比等