# 附录C 学习路径指南

> 根据不同背景和目标，定制个性化的操作系统课程学习方案。

---

## 按基础水平定制

### 方案一：有 C 语言基础，无 Linux 经验

**推荐路径：**

```
第01讲 Linux 简介与使用（重点：命令行操作、文件系统）
    |
第02讲 Linux 环境 C 编程（重点：GCC 编译、GDB 调试）
    |
第03讲 文件 I/O 编程（重点：open/read/write、标准 I/O）
    |
第04讲 进程控制（重点：fork/exec/wait）
    |
第05讲 进程间通信（重点：管道、消息队列）
    |
第06讲 多线程编程（重点：pthread、信号量）
    |
第07讲 网络编程基础（重点：Socket API、TCP 模型）
    |
第08讲 并发网络服务器（重点：多线程服务器）
    |
第09讲 操作系统原理（结合实验理解理论）
```

**学习建议：**

- 花 1~2 周熟悉 Linux 命令行，重点掌握 `ls`、`cd`、`mkdir`、`chmod`、`gcc`、`gdb`
- 实验一（I/O 编程）是基础中的基础，务必扎实掌握
- 每个实验先读懂示例代码，再自己动手修改

---

### 方案二：有 Linux 经验，C 语言基础一般

**推荐路径：**

```
第01讲 C 语言回顾（重点：指针、结构体、动态内存）
    |
第02讲 文件 I/O（重点：系统调用 vs 库函数）
    |
第03讲 进程控制（重点：fork 的理解）
    |
第04讲 进程间通信
    |
第05讲 多线程编程（重点：同步机制）
    |
第06讲 网络编程
    |
第07讲 并发服务器
    |
第08讲 操作系统原理
```

**学习建议：**

- 重点补强 C 语言指针和内存管理
- 实验中遇到的 C 语言问题及时查阅资料
- 可以跳过 Linux 基础操作部分，直接进入编程实验

---

### 方案三：有 C 语言 + Linux 经验

**推荐路径：**

```
快速浏览第01~03讲，直接进入实验
    |
第04讲 进程控制（重点：shell 实现、daemon）
    |
第05讲 进程间通信（重点：共享内存 + 信号量）
    |
第06讲 多线程编程（重点：竞态条件、生产者-消费者）
    |
第07讲 网络编程（重点：HTTP 协议、文件传输）
    |
第08讲 并发服务器（重点：预线程化、I/O 多路复用）
    |
第09讲 操作系统原理（深入理解调度、内存管理）
```

**学习建议：**

- 可以直接做选做题（task43、task54、task66、task67 等）
- 重点理解操作系统原理，将实验经验与理论结合
- 尝试优化代码性能，如并行求和的加速比分析

---

## 按学习目标定制

### 目标一：通过课程考试

**重点内容：**

| 章节 | 考试重点 | 权重 |
|------|----------|------|
| 进程管理 | fork/exec/wait 的工作原理、僵尸进程 | 高 |
| 调度算法 | FCFS、SJF、RR、优先级调度的对比 | 高 |
| 同步互斥 | 信号量、互斥锁、生产者-消费者问题 | 高 |
| 死锁 | 四个必要条件、银行家算法 | 中 |
| 存储管理 | 页式存储、缺页中断、页面置换算法 | 高 |
| 文件系统 | inode、目录结构、磁盘调度 | 中 |
| 网络编程 | TCP 三次握手/四次挥手、Socket 编程流程 | 中 |

**复习策略：**

- 理解概念 > 死记硬背
- 能用代码演示的概念（如 fork、信号量）通过实验加深理解
- 算法题要会手动模拟执行过程
- 整理每个章节的核心知识点和易混淆概念

---

### 目标二：提升编程能力

**重点内容：**

| 实验 | 核心技能 | 难度 |
|------|----------|------|
| 实验01 I/O 编程 | 文件读写、结构体序列化 | ★★ |
| 实验02 进程控制 | fork/exec/wait、shell 实现 | ★★★ |
| 实验03 多线程 | pthread、信号量同步 | ★★★★ |
| 实验04 进程间通信 | 管道、消息队列、共享内存 | ★★★ |
| 实验05 网络通信 | Socket 编程、HTTP 协议 | ★★★ |
| 实验06 并发服务器 | 多进程/多线程/预线程化 | ★★★★ |

**练习建议：**

- 每个实验至少完整实现一遍
- 尝试扩展功能（如给 shell 加上后台执行、给服务器加上日志）
- 阅读课程提供的源代码，学习代码风格和错误处理
- 做完必做题后挑战选做题

---

### 目标三：考研准备

**重点理论知识：**

| 主题 | 考点 | 对应章节 |
|------|------|----------|
| 进程与线程 | PCB、进程状态转换、线程模型 | 第04讲 |
| 处理机调度 | 调度算法、周转时间计算 | 第04讲 |
| 进程同步 | 信号量机制、经典同步问题 | 第06讲 |
| 死锁 | 必要条件、预防/避免/检测 | 第04讲 |
| 内存管理 | 分页、分段、虚拟内存、页面置换 | 第05讲 |
| 文件系统 | 目录结构、磁盘调度算法 | 第05讲 |
| I/O 管理 | I/O 控制方式、缓冲技术 | 第03讲 |

**复习策略：**

- 理论与实验结合：用 fork 理解进程创建，用信号量理解同步
- 做历年真题，重点练习算法模拟题（如银行家算法、页面置换）
- 整理易混淆概念对比表（如进程 vs 线程、互斥 vs 同步）
- 用思维导图梳理每章知识结构

---

### 目标四：就业/工程实践

**重点技能：**

| 技能 | 对应内容 | 实用性 |
|------|----------|--------|
| Linux 系统编程 | fork、exec、信号、I/O | 极高 |
| 多线程编程 | pthread、锁、条件变量、线程池 | 极高 |
| 网络编程 | Socket、TCP/UDP、HTTP | 极高 |
| 并发服务器 | 多进程/多线程/事件驱动 | 高 |
| 性能优化 | 加速比分析、I/O 优化 | 中 |
| 系统调试 | GDB、strace、valgrind | 高 |

**实践建议：**

- 所有实验的选做题都值得完成
- 尝试用 epoll 替代 select 实现高性能服务器
- 学习使用 strace 跟踪系统调用，理解程序行为
- 阅读开源项目（如 Nginx、Redis）的并发模型

---

## 学习节奏建议

### 16 周学期安排

| 周次 | 内容 | 任务 |
|------|------|------|
| 1~2 | Linux 基础 + C 语言环境 | 熟悉命令行、GCC、GDB |
| 3~4 | I/O 编程 | 完成实验01（task41~44） |
| 5~6 | 进程控制 | 完成实验02（task51~53） |
| 7~8 | 进程间通信 | 完成实验04（task71~73） |
| 9~10 | 多线程编程 | 完成实验03（task61~64） |
| 11~12 | 网络编程 | 完成实验05（task83~84） |
| 13~14 | 并发服务器 | 完成实验06（task92~94） |
| 15~16 | 复习 + 选做实验 | 查漏补缺、挑战选做题 |

### 每周学习建议

- **理论学习（2~3 小时）：** 阅读课件、理解概念
- **实验编程（3~4 小时）：** 完成实验任务
- **总结复习（1 小时）：** 整理笔记、记录疑问
- **总投入：** 每周约 6~8 小时

---

## 常见学习误区

| 误区 | 正确做法 |
|------|----------|
| 只看不写代码 | 动手敲代码，遇到问题再查资料 |
| 直接抄示例代码 | 先理解思路，再自己实现，最后对比优化 |
| 忽略错误处理 | 养成检查返回值、使用 perror 的习惯 |
| 不理解就死记 | fork 的返回值为什么要分两种？理解了就不容易忘 |
| 忽略编译选项 | 理解 `-Wall`、`-g`、`-lpthread` 的作用 |
| 不做实验报告 | 写报告的过程就是整理思路的过程 |
| 孤立学习各章节 | 注意知识关联：进程->线程->同步->网络->并发 |

---

## 推荐参考资料

| 类型 | 资源 | 说明 |
|------|------|------|
| 教材 | 《深入理解计算机系统》(CS:APP) | 实验来源，强烈推荐 |
| 教材 | 《Operating System Concepts》 | 操作系统经典教材 |
| 教材 | 《UNIX 环境高级编程》(APUE) | UNIX 编程权威参考 |
| 在线 | CS:APP 官网实验 | CMU 配套实验 |
| 工具 | `man` 手册 | `man 2 fork`、`man 3 printf` |
| 工具 | `strace` | 跟踪系统调用 |
| 工具 | `valgrind` | 内存泄漏检测 |
