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,257 @@
# 2026年操作系统期末预测卷
## 考试信息
- **满分**100分
- **时间**120分钟
- **题型**7道大题与历年试卷格式一致
---
## 题目一进程控制与进程树分析15分
### 题目
阅读以下程序代码,回答问题:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid;
int status;
printf("A: pid=%d\n", getpid());
pid = fork();
if (pid == 0) {
printf("B: pid=%d, ppid=%d\n", getpid(), getppid());
pid = fork();
if (pid == 0) {
printf("C: pid=%d, ppid=%d\n", getpid(), getppid());
} else {
wait(&status);
printf("D: pid=%d\n", getpid());
}
} else {
printf("E: pid=%d\n", getpid());
pid = fork();
if (pid == 0) {
printf("F: pid=%d, ppid=%d\n", getpid(), getppid());
} else {
wait(&status);
wait(&status);
printf("G: pid=%d\n", getpid());
}
}
return 0;
}
```
**问题**
1. 6分画出完整的进程树标注每个进程执行的输出语句用字母A-G表示
2. 4分该程序共有多少个进程包括初始进程请列出所有进程的创建顺序
3. 3分输出语句D和G的执行顺序是否一定为什么
4. 2分如果将所有`wait(&status)`调用删除,进程输出结果会发生什么变化?
---
## 题目二磁盘调度算法计算15分
### 题目
某磁盘有200个磁道编号0-199磁盘请求队列中的磁道号依次为
**98, 183, 37, 122, 14, 124, 65, 67**
当前磁头位于磁道**53**,向磁道号**增大**的方向移动。
**问题**
1. 8分分别使用以下磁盘调度算法计算磁头移动的总磁道数
- FCFS先来先服务
- SSTF最短寻道时间优先
- SCAN电梯算法
- C-SCAN循环扫描算法
2. 4分在上述四种算法中哪种算法的磁头移动总磁道数最少哪种最多简要说明原因。
3. 3分如果磁头初始方向改为向磁道号减小的方向移动SCAN算法的结果会如何变化请计算新的磁头移动总磁道数。
---
## 题目三虚拟内存与页面置换15分
### 题目
某系统采用请求分页存储管理页面大小为4KB分配给某进程的物理页框数为**4**。该进程的页面访问序列为:
**1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5**
**问题**
1. 9分分别使用以下页面置换算法计算缺页次数和缺页率
- OPT最优算法
- FIFO先进先出算法
- LRU最近最久未使用算法
2. 3分如果将分配的物理页框数增加到5使用FIFO算法缺页次数是否会减少请验证并解释是否出现了Belady异常。
3. 3分假设页面大小改为8KB其他条件不变该进程的虚拟地址空间大小为32KB请问
- 进程共有多少个虚拟页?
- 页表需要多少个页表项?
- 虚拟地址`0x3A5F`对应的页号和页内偏移分别是多少?
---
## 题目四文件系统与inode计算15分
### 题目
某Unix文件系统采用Ext2结构文件系统的块大小为**4KB**,磁盘块号占**4字节**inode中包含**15个地址项**12个直接索引、1个一次间接、1个二次间接、1个三次间接
**问题**
1. 6分计算
- 每个磁盘块可以存放多少个磁盘块号?
- 一个inode支持的最大文件大小是多少请列出计算过程
2. 4分假设某文件大小为260KB请问
- 该文件占用多少个数据块?
- inode中的哪些地址项会被使用
- 是否需要使用间接索引块?如果需要,使用几个?
3. 5分假设要读取该文件偏移量为100KB处开始的4KB数据请描述完整的地址转换过程
- 如何确定使用inode中的哪个地址项
- 如何计算数据在磁盘上的具体位置?
- 需要访问几次磁盘?
---
## 题目五CPU调度算法计算15分
### 题目
某单处理器系统中有以下进程,按到达时间排序:
| 进程 | 到达时间 | 运行时间 |
|------|----------|----------|
| P1 | 0 | 8 |
| P2 | 1 | 4 |
| P3 | 2 | 9 |
| P4 | 3 | 5 |
| P5 | 4 | 2 |
**问题**
1. 9分分别使用以下调度算法计算各进程的完成时间、周转时间和带权周转时间并求平均周转时间和平均带权周转时间
- FCFS先来先服务
- SJF非抢占最短作业优先
- HRRF最高响应比优先
2. 3分在上述三种算法中
- 哪种算法的平均周转时间最短?
- 哪种算法可能产生"饥饿"现象?为什么?
3. 3分如果采用时间片轮转调度RR时间片大小为3请画出甘特图并计算P1和P2的周转时间。
---
## 题目六I/O控制方式与磁盘访问15分
### 题目
1. 6分比较以下四种I/O控制方式的特点填写下表
| 特性 | 程序直接控制 | 中断驱动I/O | DMA | 通道 |
|------|-------------|-------------|-----|------|
| CPU介入频率 | | | | |
| 数据传输单位 | | | | |
| CPU与I/O并行性 | | | | |
| 硬件复杂度 | | | | |
2. 4分某磁盘转速为7200 RPM平均寻道时间为8ms每个磁道500个扇区每个扇区512字节。
- 计算平均旋转延迟
- 计算读取一个扇区的平均访问时间
- 如果要连续读取100个扇区在同一磁道上总访问时间是多少
3. 5分某系统使用SPOOLing技术管理打印机
- 画出SPOOLing系统的组成结构图
- 解释SPOOLing如何将独占设备改造为共享设备
- 说明SPOOLing与缓冲技术的区别
---
## 题目七段页式存储管理与地址转换10分
### 题目
某系统采用段页式存储管理,地址结构如下:
- 段号8位
- 页号8位
- 页内偏移16位
系统参数:
- 页大小64KB
- 段表基址寄存器指向的段表如下:
| 段号 | 段长(页数) | 页表始址 |
|------|-------------|----------|
| 0 | 4 | 1000 |
| 1 | 6 | 2000 |
| 2 | 2 | 3000 |
页表(部分)如下:
| 页号 | 物理块号 |
|------|----------|
| 0 | 50 |
| 1 | 51 |
| 2 | 52 |
| 3 | 53 |
**问题**
1. 4分逻辑地址`0x00018000`对应的段号、页号、页内偏移分别是多少?该地址对应的物理地址是多少?(写出计算过程)
2. 3分逻辑地址`0x01028000`是否合法?为什么?如果合法,计算其物理地址。
3. 3分与纯分页和纯分段相比段页式存储管理有哪些优点和缺点
---
## 参考答案要点
### 题目一参考答案
1. 进程树A→(B, E)B→(C, D)E→(F, G)
2. 共7个进程创建顺序A→B→E→C→F→D→G
3. D和G的执行顺序不一定取决于哪个子进程先完成
4. 删除wait后输出顺序不确定可能出现孤儿进程
### 题目二参考答案
1. FCFS: 640道SSTF: 236道SCAN: 299道C-SCAN: 356道
2. SSTF最少贪心选择最近FCFS最多无优化
3. 反向SCAN53→37→14→0→65→67→98→122→124→183总移动359道
### 题目三参考答案
1. OPT: 8次(66.7%)FIFO: 10次(83.3%)LRU: 10次(83.3%)
2. 页框数=5时FIFO缺页仍为10次未出现Belady异常
3. 虚拟页数=4页表项=4地址0x3A5F页号=3偏移=0x2A5F
### 题目四参考答案
1. 每块1024个块号最大文件约16GB+
2. 65个数据块使用直接索引12个+一次间接索引1个不需要二次间接
3. 偏移100KB=第25块使用直接索引项2需2次磁盘访问
### 题目五参考答案
1. FCFS平均周转7.8SJF平均周转6.2HRRF平均周转7.0
2. SJF最短SJF可能饥饿长作业持续等待
3. RR甘特图0-3(P1),3-6(P2),6-8(P5),8-11(P1),11-14(P3),14-17(P4),17-20(P1),20-23(P3),23-25(P3)
P1周转=23P2周转=6
### 题目六参考答案
1. 表格填写(见知识点总结)
2. 旋转延迟4.17ms扇区访问12.21ms连续100扇区约12.5ms
3. SPOOLing由输入/输出井和预输入/缓输出程序组成
### 题目七参考答案
1. 段号=0页号=1偏移=0x8000物理地址=51×64KB+0x8000
2. 合法段号1页号2物理地址=52×64KB+0x8000
3. 优点:分段便于共享/保护+分页解决外部碎片缺点地址转换复杂需3次访存

View File

@@ -0,0 +1,688 @@
# 📖 操作系统复习与教学笔记
> **目标**:不仅能应付考试,更能真正理解操作系统的工作原理
> **定位**:这份笔记不是简单的知识点罗列,而是教你"怎么学、怎么记、怎么做题"
---
## 目录
1. [复习策略与时间规划](#一复习策略与时间规划)
2. [四大必考计算题 · 手把手教学](#二四大必考计算题--手把手教学)
3. [核心概念 · 快速记忆法](#三核心概念--快速记忆法)
4. [易混淆概念辨析](#四易混淆概念辨析)
5. [代码题考点精讲](#五代码题考点精讲)
6. [问答题高频考点](#六问答题高频考点)
7. [考前速查表](#七考前速查表)
---
## 一、复习策略与时间规划
### 1.1 按优先级分三层
| 层级 | 内容 | 建议投入时间 | 策略 |
|------|------|-------------|------|
| 🔴 **保命层** | 磁盘调度、页面置换、fork进程树、inode计算 | 60% | 必须能**独立默写**解题步骤 |
| 🟡 **进阶层** | CPU调度、I/O控制方式、段页式地址转换、死锁 | 30% | 理解原理 + 做2-3道题 |
| 🟢 **基础层** | 概念题、代码优化、工作集模型 | 10% | 多看几遍,有印象即可 |
### 1.2 复习三步法
```
第一步:看本笔记 → 建立知识框架和记忆锚点
第二步:做预测卷 → 实战演练,暴露薄弱点
第三步:复盘错题 → 针对性地回顾对应章节
```
### 1.3 考试时间分配建议120分钟
| 题型 | 建议用时 | 策略 |
|------|---------|------|
| 计算题(磁盘/页面置换/CPU调度/inode | 50-60min | 先做!这是拿分大头 |
| 代码分析题fork进程树 | 15-20min | 画图要清晰规范 |
| 简答/概念题 | 25-30min | 分点作答,关键词给分 |
| 地址转换题 | 10-15min | 按步骤写,不要跳步 |
| 检查 | 5-10min | 检查计算题的数字 |
---
## 二、四大必考计算题 · 手把手教学
### 2.1 磁盘调度算法计算(★★★★★ 每年必考)
#### 本质理解
磁盘调度就是在解决"磁头怎么走最省时间"的问题。可以把磁头想象成电梯,磁道就是楼层号。
#### 各算法的"人设"
| 算法 | 一句话人设 | 行为特征 |
|------|-----------|----------|
| **FCFS** | "先来后到"的耿直 boy | 来一个处理一个,不做任何优化 |
| **SSTF** | "贪心"的近视眼 | 每次都选最近的,但可能让远的永远等不到 |
| **SCAN** | "电梯"本梯 | 一直走到头再回头 |
| **C-SCAN** | 单向电梯 | 只往上走,到顶后直接回到底部重来 |
| **LOOK** | 智能电梯 | 走到最后一个请求就回头,不到边界 |
| **C-LOOK** | 智能单向电梯 | 只往上到最高请求,然后直接回最低请求 |
#### 📐 解题模板(以最难的 C-SCAN 为例)
```
题目磁道0-199磁头在53向增大方向移动
请求序列98, 183, 37, 122, 14, 124, 65, 67
Step 1: 将请求排序
排序14, 37, 65, 67, 98, 122, 124, 183
Step 2: 确定方向并依次服务
C-SCAN规则向增大方向走 → 到199边界→ 回到0 → 继续向增大方向
路径53 → 65 → 67 → 98 → 122 → 124 → 183 → 199到边界→ 0 → 14 → 37
移动距离12 + 2 + 31 + 24 + 2 + 59 + 16 + 199 + 14 + 23
Step 3: 求和
= 12+2+31+24+2+59+16+199+14+23 = 382道
```
#### ⚠️ 常见错误
| 错误 | 正确做法 |
|------|---------|
| SCAN/C-SCAN 忘记走到边界199或0 | **必须**走到边界,除非题目说用 LOOK |
| SSTF 选择了相等距离的两个磁道 | 通常选编号小的(题目可能会有说明) |
| 方向搞反 | 题目说"向增大方向"就从53往上走 |
| C-SCAN 往回时逐个服务 | C-SCAN 回头时**不服务**,到底后才重新开始 |
#### 💡 速算技巧
SSTF 的路径一定是最短的贪心嘛FCFS 通常是最长的。检查时如果 SSTF 比别的算法还长,肯定算错了。
---
### 2.2 页面置换算法(★★★★★ 每年必考)
#### 本质理解
内存满了要换掉哪个页面OPT 是"预言家"LRU 是"记仇本"FIFO 是"排队机"。
#### 各算法速记
| 算法 | 口诀 | 关键特征 |
|------|------|---------|
| **OPT** | "看未来,谁最晚用就换谁" | 理论最优,无法实现(但考试能算) |
| **FIFO** | "先来先走,排队淘汰" | 可能 Belady 异常(页框变多反而缺页更多) |
| **LRU** | "看过去,谁最久没用就换谁" | 无 Belady 异常,硬件开销大 |
| **Clock** | "转圈查,引用位=0就换" | LRU 的简化版 |
#### 📐 解题模板(以 LRU页框数=3 为例)
```
访问序列7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
画表格法:
-------------------------------------------------------------
访问 页框1 页框2 页框3 是否缺页 说明
-------------------------------------------------------------
7 7 - - ✓缺页 空,直接放入
0 7 0 - ✓缺页 空,直接放入
1 7 0 1 ✓缺页 空,直接放入
2 7 0 2 ✓缺页 换掉最久未用的11离上次最远
0 7 0 2 ✗命中 0已存在更新它的使用时间
3 3 0 2 ✓缺页 换掉最久未用的77离上次最远
0 3 0 2 ✗命中 0已存在
4 3 0 4 ✓缺页 换掉最久未用的22离上次最远
...以此类推
```
#### ⚠️ OPT 和 LRU 的区别(最容易混淆)
```
序列1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5页框数=4
OPT 在访问5时
当前页框1,2,3,4
看未来1还要用第5位2还要用第6位3还要用第10位4还要用第11位
最晚使用的是4第11位才用所以换4
LRU 在访问5时
当前页框1,2,3,4
看过去1最近在位置4用过2在位置5用过3在位置2用过4在位置3用过
最久未用的是3位置2之后就没用过所以换3
```
> **关键口诀**OPT 看**未来**LRU 看**过去**。OPT 是"预言"LRU 是"历史"。
#### 💡 Belady 异常
**只在 FIFO 中出现**。增加页框数反而缺页更多。LRU 和 OPT 都不会有这个问题。
---
### 2.3 fork 进程树分析(★★★★★ 每年必考)
#### 本质理解
`fork()` 就像细胞分裂 — 调用一次,变成两个进程,从同一行代码继续执行。
#### 黄金法则
```
法则1fork() 一次,返回两次
- 父进程返回值 = 子进程的 PID
- 子进程返回值 = 0
法则2子进程从 fork() 的下一行开始执行(不是从 main 开头)
法则3fork() 嵌套时,每个进程都要独立分析它的执行路径
法则4父进程总数 = 2^nn为fork调用次数无嵌套时
```
#### 📐 解题模板
```
程序:
fork() // fork1
if (pid == 0) {
fork() // fork2
}
fork() // fork3
Step 1: 画出进程树
P(初始)
╲ ← fork1
P(子1) P(父)
╲ ╲ ← fork2只有子1执行
P(孙1) P(子1续) P(父)
| | | ← fork3所有进程都执行
P(曾孙1) P(孙2) P(子2)
Step 2: 统计进程总数
2³ = 8个进程3次fork最外层没有if限制
Step 3: 分析每个进程的输出
按执行路径逐条跟踪...
```
#### ⚠️ 常见陷阱
| 陷阱 | 说明 |
|------|------|
| `if (pid == 0)` 内的 fork | 只有子进程执行,父进程跳过 |
| `wait(NULL)` | 父进程等待**任意**子进程结束 |
| 嵌套的 `wait` | 每个 `wait` 只能回收一个子进程 |
| 没有 wait | 子进程变成僵尸进程Zombie |
#### 💡 wait 的个数
父进程有几个子进程,就应该有几个 `wait()`,否则会产生僵尸进程。
---
### 2.4 Ext2 inode 最大文件计算(★★★★★ 每年必考)
#### 本质理解
inode 就像文件系统的"目录索引卡"有15个格子放地址。前12个直接指向数据块后3个是间接指向指向一个"指针块",指针块再指向数据块)。
#### 计算公式速记
```
块大小 = 4KB = 4096 字节
指针大小 = 4 字节
每块指针数 = 4096 / 4 = 1024 个
最大文件:
直接12 × 4KB = 48KB
一次间接1024 × 4KB = 4MB
二次间接1024² × 4KB = 4GB
三次间接1024³ × 4KB = 4TB
──────────────────────────────────
总计48KB + 4MB + 4GB + 4TB ≈ 4.004 TB
```
> **注意**:如果块大小是 1KB、指针 4B则每块 256 个指针,结果约 16GB+(你的知识点总结里那个)。
#### 📐 解题模板:给定文件大小,问需要哪些地址项
```
题目:块大小=4KB指针=4B文件=260KB
Step 1: 计算文件占多少数据块
260KB / 4KB = 65 块
Step 2: 检查直接索引能装多少
直接索引 = 12 块 → 只能装 48KB不够
Step 3: 一次间接能装多少
一次间接 = 1024 块 → 1024 × 4KB = 4MB
12 + 1024 = 1036 块65 ≤ 1036所以只需要一次间接
结论使用直接索引12个 + 一次间接1个其中用到 65-12=53 个指针)
```
#### ⚠️ 易错点
- 问"需要几次磁盘访问":直接索引=1次一次间接=2次先读指针块再读数据块二次间接=3次...
- 在计算最大文件时,**不要忘了加直接索引的12块**
---
## 三、核心概念 · 快速记忆法
### 3.1 操作系统四大特征
```
口诀:共、享、虚、异 → "恭喜虚拟"
- 共(并发):宏观并行,微观串行
- 享(共享):资源共享
- 虚(虚拟):物理实体变为逻辑多个
- 异(异步):进程走走停停
```
### 3.2 CPU 双模式
```
用户态 →→→ 中断/异常/系统调用 →→→ 内核态
内核态 →→→ PSW切换 →→→ 用户态
记忆:用户态进内核态叫"陷入"trap内核态回用户态叫"恢复"
```
### 3.3 中断分类速记
```
中断(Interrupt)
├── 硬中断(外部,异步)
│ ├── I/O中断键盘敲一下
│ └── 时钟中断OS拿回控制权的关键
└── 软中断/异常(内部,同步)
├── 故障Fault缺页异常可恢复
├── 陷阱Trap系统调用 int 0x80
└── 终止Abort除零错误不可恢复
```
> **必考提问**OS 如何获得 CPU 控制权?→ **时钟中断!** 时间片到了时钟中断触发OS 重新调度。
### 3.4 ELF 内存布局
```
从低地址到高地址:
┌─────────────────┐
│ .text 代码段 │ ← 只读,存放指令
│ .rodata 只读数据 │ ← 字符串常量等
│ .data 初始化数据 │ ← 已初始化全局变量
│ .bss 未初始化数据 │ ← 不占磁盘!只占内存
├─────────────────┤
│ heap↑ │ ← malloc 分配
├─────────────────┤
│ ↓ │
│ stack │ ← 局部变量、函数调用
└─────────────────┘
```
**记忆 trick**:堆向上长(像树往上),栈向下长(像水往下流)。
### 3.5 死锁四个必要条件
```
口诀:互、请、不、循 → "互请不循"(互相请求,不能循环)
1. 互斥Mutual exclusion
2. 请求和保持Hold and wait
3. 不可抢占No preemption
4. 循环等待Circular wait
破坏任意一个 → 死锁预防
```
### 3.6 页面置换算法特征速记
```
OPT → 看未来,最晚用的 → 不可能实现(除非能预知未来)
LRU → 看过去,最久没用 → 硬件开销大
FIFO → 看时间,最早进入 → 会有 Belady 异常
Clock→ 看引用位,转圈查 → 近似 LRU
LFU → 看次数,最少使用 → 可能被"热数据"刷掉
```
---
## 四、易混淆概念辨析
### 4.1 并发 vs 并行
| | 并发 | 并行 |
|--|------|------|
| 含义 | 同时**处理**多个任务 | 同时**执行**多个任务 |
| 核心 | 宏观上同时,微观上交替 | 真正的同一时刻都在运行 |
| 硬件 | 单核 CPU | 多核 CPU |
| 类比 | 一个人交替做几件事 | 几个人同时做各自的事 |
### 4.2 进程 vs 线程
| | 进程 | 线程 |
|--|------|------|
| 资源拥有 | 独立地址空间 | 共享进程资源 |
| 切换开销 | 大(需切换页表等) | 小(只需切换栈) |
| 通信方式 | IPC管道、共享内存等 | 直接读写共享数据 |
| 独立性 | 一个崩溃不影响其他 | 一个线程崩溃→整个进程崩溃 |
### 4.3 死锁 vs 饥饿
| | 死锁 | 饥饿 |
|--|------|------|
| 状态 | 多个进程**互相等待**,都无法前进 | 一个进程**一直等不到**资源 |
| 是否可以解除 | 必须外部干预(终止进程/抢占资源) | 其他进程释放资源后可自动解除 |
| 典型场景 | 银行家算法中不安全状态 | SJF 中长作业一直得不到 CPU |
### 4.4 静态链接 vs 动态链接
| | 静态链接 | 动态链接 |
|--|---------|---------|
| 时机 | 编译时 | 运行时 |
| 文件大小 | 大(包含所有库代码) | 小(运行时加载) |
| 更新库 | 需重新编译 | 直接替换库文件 |
| 依赖 | 无外部依赖 | 需要 .so/.dll 文件存在 |
### 4.5 全局置换 vs 局部置换
| | 全局置换 | 局部置换 |
|--|---------|---------|
| 范围 | 从所有进程中选页面换出 | 只从当前进程的页面中选 |
| 公平性 | 进程可能互相影响 | 每个进程独立管理 |
| 抖动控制 | 难控制 | 容易控制 |
### 4.6 固定分区 vs 动态分区 vs 分页
| | 固定分区 | 动态分区 | 分页 |
|--|---------|---------|------|
| 内部碎片 | ✓ | ✗ | ✓(最后一页) |
| 外部碎片 | ✗ | ✓ | ✗ |
| 管理复杂度 | 低 | 中 | 高 |
---
## 五、代码题考点精讲
### 5.1 fork 代码分析
#### 经典模式 1单次 fork
```c
pid_t pid = fork();
if (pid == 0) {
// 子进程代码
} else {
// 父进程代码pid 是子进程的 PID
}
```
**输出特点**
- 子进程和父进程的代码都会执行
- 子进程从 fork() 返回处开始执行(不是从 main 开始)
- "A\n" 只有一个进程输出,"B\n" 和 "C\n" 各输出一次(因为 fork 后两个进程都继续)
#### 经典模式 2嵌套 fork
```c
pid_t pid1 = fork(); // fork1
if (pid1 == 0) {
pid_t pid2 = fork(); // fork2 — 只在子进程中执行
if (pid2 == 0) {
// 孙进程
}
}
```
**进程树分析**
```
P初始
/ \ ← fork1
P(子1) P(父)
/ \ ← fork2仅在子1中执行
P(孙) P(父)
```
#### 经典模式 3fork + wait
```c
for (int i = 0; i < 3; i++) {
pid_t pid = fork();
if (pid == 0) {
// 子进程
exit(0);
}
}
// 父进程需要回收所有子进程
while (wait(NULL) > 0);
```
**重点**:循环中的 fork子进程 exit 后,父进程用 `wait` 回收。总计 `2³ = 8` 个进程。
### 5.2 生产者消费者(多线程同步)
```c
sem_t mutex, empty, full;
void *producer(void *arg) {
// 生产数据...
sem_wait(&empty); // 等空位
sem_wait(&mutex); // 加锁
// 放入缓冲区
sem_post(&mutex); // 解锁
sem_post(&full); // 通知消费者
}
void *consumer(void *arg) {
sem_wait(&full); // 等数据
sem_wait(&mutex); // 加锁
// 取出数据
sem_post(&mutex); // 解锁
sem_post(&empty); // 通知生产者
}
```
**⚠️ 注意顺序**P(empty) 必须在 P(mutex) 之前!否则可能死锁。
——如果先锁 mutex 再等 empty而缓冲区满了生产者拿不到 empty消费者进不来临界区拿数据死锁。
### 5.3 Shell 基本框架
```c
while (1) {
printf("$ ");
fgets(cmdline, MAXLINE, stdin);
pid_t pid = fork();
if (pid == 0) {
// 子进程执行命令
execvp(argv[0], argv);
exit(0);
}
// 父进程等待
wait(NULL);
}
```
### 5.4 守护进程创建5步法
```c
// 第1步fork + 父进程退出
pid_t pid = fork();
if (pid > 0) exit(0);
// 第2步创建新会话
setsid();
// 第3步再 fork 一次,防止重新获得控制终端
pid = fork();
if (pid > 0) exit(0);
// 第4步改变工作目录
chdir("/");
// 第5步重设文件权限掩码
umask(0);
```
**问**:为什么要 fork 两次?
**答**:第一次 fork 后 setsid() 创建新会话,但会话首进程可能重新获得控制终端。第二次 fork 的子进程不是会话首进程,**永远无法**获得控制终端。
---
## 六、问答题高频考点
### 6.1 什么是操作系统?它的四大特征是什么?
**答题模板**
1. 操作系统是管理计算机硬件和软件资源的系统软件
2. 四大特征:并发、共享、虚拟、异步(各用一句话解释)
### 6.2 中断在操作系统中的作用?
**核心要点**
- 中断是实现**并发执行**的基础
- **时钟中断**是操作系统**获得 CPU 控制权**的关键机制
- 中断使 CPU 能够**响应外部事件**I/O 完成、硬件故障等)
- 系统调用通过**软中断trap**实现用户态→内核态切换
### 6.3 比较几种 I/O 控制方式
| 方式 | CPU介入 | 传输单位 | 并行性 | 硬件 |
|------|---------|---------|--------|------|
| 程序直接控制 | 全程忙等 | 字 | 无 | 最简单 |
| 中断驱动 | 每个字中断一次 | 字 | 有 | 较简单 |
| DMA | 每块中断一次 | 块 | 高 | 较复杂 |
| 通道 | 程序级 | 块/组 | 极高 | 最复杂 |
**记忆线索**从上到下CPU 越来越省事,硬件越来越复杂,传输效率越来越高。
### 6.4 什么是抖动Thrashing如何解决
**定义**分配的页框数太少导致频繁缺页CPU 大部分时间花在页面置换上,利用率急剧下降。
**原因**:工作集 > 分配的页框数
**解决方案**
1. 增加分配页框数(工作集模型)
2. 采用局部置换(不让进程互相影响)
3. 降低多道程序度
### 6.5 SPOOLing 如何将独占设备改造为共享设备?
**原理**
```
输入井
用户进程1 ╲ 预输入程序
用户进程2 ╲── 磁盘存储 ─╱ (把磁盘当"大缓冲区"
用户进程3 (输入/输出井) ╲ 缓输出程序
输出井
```
**核心思想**:用磁盘(共享设备)做缓冲,把独占设备(打印机)的逻辑使用变成对磁盘文件的读写。用户觉得打印机是自己的,实际上是 SPOOLing 系统在排队管理。
### 6.6 段式 vs 分页 vs 段页式
| | 分段 | 分页 | 段页式 |
|--|------|------|--------|
| 出发点 | 用户视角,逻辑模块 | 系统视角,物理管理 | 兼具两者优点 |
| 大小 | 可变(由逻辑决定) | 固定4KB等 | 段可变,段内页固定 |
| 碎片 | 外部碎片 | 内部碎片(最后一页) | 无外部碎片 |
| 共享/保护 | 方便 | 不方便 | 方便 |
| 地址结构 | 段号+偏移 | 页号+偏移 | 段号+页号+偏移 |
| 访存次数 | 2次 | 2次有TLB可减 | 3次 |
### 6.7 优先级反转
**场景**高优先级进程H等待低优先级进程L持有的资源而中等优先级进程M抢占了 L 的 CPU导致 H 被 M 间接阻塞。
**解决方案**:优先级继承 — L 持有的资源被 H 需要时L 临时继承 H 的优先级,运行完释放资源后再降回去。
---
## 七、考前速查表
### 7.1 公式速查
| 公式 | 适用场景 |
|------|---------|
| 周转时间 = 完成时间 - 到达时间 | CPU 调度 |
| 带权周转时间 = 周转时间 / 运行时间 | CPU 调度 |
| 响应比 = 1 + 等待时间 / 运行时间 | HRRF 调度 |
| EAT = λ + t + (1-a)·t | TLB 有效访问时间 |
| 每块指针数 = 块大小 / 指针大小 | inode 计算 |
| 加速比 S = T串行 / T并行 | 并行计算 |
| Amdahl: S = 1 / ((1-f) + f/P) | 并行计算加速比上限 |
| 磁盘访问时间 = 寻道 + 旋转延迟 + 传输 | I/O 性能 |
| 平均旋转延迟 = 1/2 × 转一圈时间 | 磁盘性能 |
### 7.2 数值速查
| 场景 | 典型值 |
|------|--------|
| 页大小 | 4KB |
| 块大小Ext2 | 1KB 或 4KB |
| 指针大小(地址项) | 4B |
| 时间片RR | 几十 ms 级别 |
| 7200RPM 旋转延迟 | 4.17ms(半圈) |
### 7.3 算法时间复杂度速查
| 算法/机制 | 数据结构 | 复杂度 |
|-----------|---------|--------|
| FCFS 调度 | 队列 | O(1) |
| SJF 调度 | 最小堆 | O(log n) |
| CFSLinux | 红黑树 | O(log n) |
| 页表查找(无 TLB | 数组 | O(1) |
| 多级页表 | 树 | O(级数) |
| 倒排页表 | 哈希表 | O(1)平均 |
### 7.4 Linux 常用命令速查
```bash
chmod 755 file # rwxr-xr-x (7=4+2+1, 5=4+1)
chmod u+x file # 给所有者加执行权限
ps -ef # 查看所有进程
top # 动态查看进程
kill -9 PID # 强制终止进程SIGKILL
grep pattern file # 搜索文件内容
strace ./prog # 跟踪系统调用
gdb ./prog # 调试程序
```
---
## 附录:考前最后一天做什么
### 8小时冲刺计划
```
第1小时复习四大计算题模板本笔记 2.1-2.4
第2小时做预测卷的计算题部分
第3小时复习进程树分析和代码题第五部分
第4小时做预测卷的代码分析题
第5小时复习概念辨析和问答题第三、四、六部分
第6小时做预测卷的问答题
第7小时错题回顾 + 速查表记忆
第8小时放松早点休息
```
### 考场检查清单
- ✅ 计算题先做(分值高、确定性大)
- ✅ 画进程树时标注字母/输出
- ✅ 缺页次数计算时,初始空页框**算**缺页
- ✅ SCAN/C-SCAN 注意方向
- ✅ CPU 调度画甘特图辅助
- ✅ 地址转换要写出每一步的数值
- ✅ 简答题分点作答,关键词突出
---
> **最后的话**:操作系统不是死记硬背的科目,理解"为什么"比记住"是什么"重要得多。
> 遇到问题时,想想"如果是 Linux它会怎么做"——这是最好的学习方式。
>
> 祝考试顺利!🎯

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、周转时间、响应比等

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.