2026-02-15 01:57:52 +08:00
|
|
|
|
# 操作系统(进程 / 内存 / 文件系统)
|
|
|
|
|
|
|
2026-02-18 15:52:55 +08:00
|
|
|
|
::: tip 🎯 核心问题
|
|
|
|
|
|
**操作系统是做什么的?** 你可能每天都在用 Windows、macOS 或 Linux,但你知道它到底在忙什么吗?为什么需要它?没有它电脑还能用吗?本章带你理解操作系统的三大核心职责:管理进程、管理内存、管理文件。
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 0. 全景图:操作系统的角色
|
|
|
|
|
|
|
|
|
|
|
|
想象你开了一家餐厅。你需要:
|
|
|
|
|
|
- **安排员工工作**:谁做菜、谁端盘子、谁收银(进程管理)
|
|
|
|
|
|
- **管理厨房空间**:冰箱放什么、操作台怎么分配(内存管理)
|
|
|
|
|
|
- **整理仓库物资**:食材怎么存放、怎么找(文件系统)
|
|
|
|
|
|
|
|
|
|
|
|
操作系统就是电脑的"餐厅经理",它负责协调所有资源,让程序能顺利运行。
|
|
|
|
|
|
|
|
|
|
|
|
**操作系统的三大核心职责:**
|
|
|
|
|
|
|
|
|
|
|
|
| 职责 | 管理对象 | 核心问题 | 类比 |
|
|
|
|
|
|
|------|---------|---------|------|
|
|
|
|
|
|
| **进程管理** | CPU 时间 | 谁先用 CPU?用多久? | 员工排班 |
|
|
|
|
|
|
| **内存管理** | 内存空间 | 程序放哪里?怎么不冲突? | 厨房空间分配 |
|
|
|
|
|
|
| **文件系统** | 磁盘数据 | 数据怎么存?怎么找? | 仓库物资管理 |
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 📊 逐行解读这张表
|
|
|
|
|
|
**进程管理**:CPU 是最宝贵的资源,操作系统要决定哪个程序先用、用多久。就像餐厅经理安排员工轮班,不能让所有人同时挤在厨房里。
|
|
|
|
|
|
|
|
|
|
|
|
**内存管理**:内存是程序的"工作台",操作系统要给每个程序分配空间,还要保证它们互不干扰。就像厨房空间有限,要合理分配给不同的厨师。
|
|
|
|
|
|
|
|
|
|
|
|
**文件系统**:磁盘是"仓库",操作系统要把数据有序地存进去,需要时能快速找到。就像仓库管理员整理货架,按类别、编号存放。
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 进程管理:程序的"分身术"
|
|
|
|
|
|
|
|
|
|
|
|
### 1.1 什么是进程?
|
|
|
|
|
|
|
|
|
|
|
|
<ProcessDemo />
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 程序 vs 进程
|
|
|
|
|
|
这是初学者最容易混淆的概念:
|
|
|
|
|
|
|
|
|
|
|
|
| 概念 | 定义 | 类比 | 特点 |
|
|
|
|
|
|
|------|------|------|------|
|
|
|
|
|
|
| **程序** | 静态的代码文件 | 菜谱 | 存在磁盘上,不会动 |
|
|
|
|
|
|
| **进程** | 程序的运行实例 | 正在按菜谱做菜 | 在内存中运行,会变化 |
|
|
|
|
|
|
|
|
|
|
|
|
**关键区别**:
|
|
|
|
|
|
- 一个程序可以启动多个进程(比如打开多个浏览器窗口)
|
|
|
|
|
|
- 每个进程有独立的内存空间,互不干扰
|
|
|
|
|
|
- 进程有生命周期:创建、运行、等待、终止
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
### 1.2 进程的状态
|
|
|
|
|
|
|
|
|
|
|
|
进程在运行过程中会在不同状态之间切换:
|
|
|
|
|
|
|
|
|
|
|
|
| 状态 | 含义 | 什么时候进入 | 类比 |
|
|
|
|
|
|
|------|------|-------------|------|
|
|
|
|
|
|
| **就绪 (Ready)** | 准备好运行,等 CPU | 进程刚创建,或从等待恢复 | 员工在休息室等排班 |
|
|
|
|
|
|
| **运行 (Running)** | 正在 CPU 上执行 | 被调度器选中 | 员工正在工作 |
|
|
|
|
|
|
| **等待 (Waiting)** | 等待 I/O 或其他资源 | 需要读磁盘、等网络 | 员工在等食材送达 |
|
|
|
|
|
|
| **终止 (Terminated)** | 运行结束 | 程序退出或出错 | 员工下班 |
|
|
|
|
|
|
|
|
|
|
|
|
### 1.3 进程调度:谁先用 CPU?
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 为什么需要调度?
|
|
|
|
|
|
CPU 核心数有限,但进程可能有几十上百个。操作系统需要决定:
|
|
|
|
|
|
- 哪个进程先运行?
|
|
|
|
|
|
- 运行多久?
|
|
|
|
|
|
- 什么时候切换?
|
|
|
|
|
|
|
|
|
|
|
|
这就是**进程调度**要解决的问题。
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
**常见调度算法:**
|
|
|
|
|
|
|
|
|
|
|
|
| 算法 | 思路 | 优点 | 缺点 |
|
|
|
|
|
|
|------|------|------|------|
|
|
|
|
|
|
| **先来先服务 (FCFS)** | 谁先到谁先运行 | 简单公平 | 短任务可能等很久 |
|
|
|
|
|
|
| **短作业优先 (SJF)** | 短任务优先 | 平均等待时间最短 | 需要预知任务长度 |
|
|
|
|
|
|
| **时间片轮转 (RR)** | 每人运行一小段时间 | 公平,响应快 | 切换开销大 |
|
|
|
|
|
|
| **优先级调度** | 重要任务优先 | 重要任务响应快 | 可能导致低优先级任务饿死 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 内存管理:程序的"工作台"
|
|
|
|
|
|
|
|
|
|
|
|
### 2.1 为什么需要内存管理?
|
|
|
|
|
|
|
|
|
|
|
|
<MemoryDemo />
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 如果没有内存管理会怎样?
|
|
|
|
|
|
想象一个没有管理的厨房:
|
|
|
|
|
|
|
|
|
|
|
|
- **冲突**:两个厨师同时用同一个灶台,菜都糊了
|
|
|
|
|
|
- **浪费**:有人占了整个厨房,其他人没地方做饭
|
|
|
|
|
|
- **安全问题**:有人偷吃了别人的食材
|
|
|
|
|
|
|
|
|
|
|
|
操作系统通过**内存管理**解决这些问题:
|
|
|
|
|
|
- 给每个进程分配独立的内存空间
|
|
|
|
|
|
- 防止进程互相干扰(内存保护)
|
|
|
|
|
|
- 高效利用有限的内存资源
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
### 2.2 虚拟内存:让每个进程都"以为"自己独占内存
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 什么是虚拟内存?
|
|
|
|
|
|
**虚拟内存**是操作系统的一个"魔术":
|
|
|
|
|
|
|
|
|
|
|
|
- 每个进程都以为自己有 4GB(或更多)的内存空间
|
|
|
|
|
|
- 实际上物理内存可能只有 8GB、16GB
|
|
|
|
|
|
- 操作系统通过"映射"把虚拟地址转换成物理地址
|
|
|
|
|
|
|
|
|
|
|
|
**生活类比**:想象一个酒店:
|
|
|
|
|
|
- 每个客人都以为自己独占整个酒店(虚拟空间)
|
|
|
|
|
|
- 实际上酒店只有 100 间房(物理内存)
|
|
|
|
|
|
- 前台(操作系统)负责分配房间、记录谁住哪里
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
**虚拟内存的好处:**
|
|
|
|
|
|
|
|
|
|
|
|
| 好处 | 说明 | 为什么重要 |
|
|
|
|
|
|
|------|------|-----------|
|
|
|
|
|
|
| **隔离保护** | 进程间内存互不干扰 | 一个崩溃不影响其他 |
|
|
|
|
|
|
| **内存扩展** | 用磁盘当内存用 | 可以运行比物理内存大的程序 |
|
|
|
|
|
|
| **简化编程** | 不用关心物理地址 | 程序员写代码更简单 |
|
|
|
|
|
|
|
|
|
|
|
|
### 2.3 内存分配策略
|
|
|
|
|
|
|
|
|
|
|
|
当进程需要内存时,操作系统如何分配?
|
|
|
|
|
|
|
|
|
|
|
|
| 策略 | 思路 | 特点 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| **首次适应** | 找到第一个够大的空闲块 | 速度快 |
|
|
|
|
|
|
| **最佳适应** | 找最小的够大的空闲块 | 内存利用率高 |
|
|
|
|
|
|
| **最坏适应** | 找最大的空闲块 | 减少小碎片 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 文件系统:数据的"档案柜"
|
|
|
|
|
|
|
|
|
|
|
|
### 3.1 什么是文件系统?
|
|
|
|
|
|
|
|
|
|
|
|
<FilesystemDemo />
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 文件系统是什么?
|
|
|
|
|
|
**文件系统**是操作系统管理磁盘数据的方式。
|
|
|
|
|
|
|
|
|
|
|
|
**生活类比**:想象一个图书馆:
|
|
|
|
|
|
- 书架 = 磁盘
|
|
|
|
|
|
- 书 = 文件
|
|
|
|
|
|
- 目录卡片 = inode
|
|
|
|
|
|
- 分类编号 = 路径
|
|
|
|
|
|
|
|
|
|
|
|
没有文件系统,磁盘就是一堆杂乱的数据。有了文件系统,我们可以:
|
|
|
|
|
|
- 用"路径"找到文件(如 `/home/user/document.txt`)
|
|
|
|
|
|
- 创建、删除、修改文件
|
|
|
|
|
|
- 控制谁能访问哪些文件
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
### 3.2 inode:文件的"身份证"
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 inode 是什么?
|
|
|
|
|
|
每个文件都有一个 **inode**(索引节点),记录了文件的元数据:
|
|
|
|
|
|
|
|
|
|
|
|
| 信息 | 说明 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| inode 编号 | 文件的唯一标识 |
|
|
|
|
|
|
| 文件大小 | 多少字节 |
|
|
|
|
|
|
| 权限 | 谁能读写 |
|
|
|
|
|
|
| 时间戳 | 创建、修改、访问时间 |
|
|
|
|
|
|
| 数据块位置 | 文件内容存在哪些磁盘块 |
|
|
|
|
|
|
|
|
|
|
|
|
**关键理解**:
|
|
|
|
|
|
- 文件名不在 inode 里!文件名只是目录中的一个条目
|
|
|
|
|
|
- 一个文件可以有多个名字(硬链接)
|
|
|
|
|
|
- 删除文件只是删除目录项,inode 可能还在
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
### 3.3 常见文件系统
|
|
|
|
|
|
|
|
|
|
|
|
| 文件系统 | 操作系统 | 特点 |
|
|
|
|
|
|
|---------|---------|------|
|
|
|
|
|
|
| **NTFS** | Windows | 支持大文件、权限控制 |
|
|
|
|
|
|
| **APFS** | macOS | 加密、快照、高效 |
|
|
|
|
|
|
| **ext4** | Linux | 稳定、高效、广泛使用 |
|
|
|
|
|
|
| **FAT32** | 通用 | 兼容性好,但单文件最大 4GB |
|
|
|
|
|
|
| **exFAT** | 通用 | 支持大文件,适合 U 盘 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 4. 进程、内存、文件系统的协作
|
|
|
|
|
|
|
|
|
|
|
|
这三个子系统是如何配合工作的?让我们看一个完整的例子:
|
|
|
|
|
|
|
|
|
|
|
|
**场景:打开一个文档文件**
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
1. 用户双击文件
|
|
|
|
|
|
↓
|
|
|
|
|
|
2. 文件系统:根据路径找到 inode,读取文件内容
|
|
|
|
|
|
↓
|
|
|
|
|
|
3. 进程管理:创建新进程(文档编辑器),分配 PID
|
|
|
|
|
|
↓
|
|
|
|
|
|
4. 内存管理:为新进程分配内存,加载程序代码和数据
|
|
|
|
|
|
↓
|
|
|
|
|
|
5. 进程运行:编辑器进程读取文件内容,显示在屏幕上
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 理解这个流程
|
|
|
|
|
|
每一步都涉及操作系统的核心功能:
|
|
|
|
|
|
|
|
|
|
|
|
1. **文件系统**:负责"找到文件"
|
|
|
|
|
|
2. **进程管理**:负责"启动程序"
|
|
|
|
|
|
3. **内存管理**:负责"给程序分配空间"
|
|
|
|
|
|
|
|
|
|
|
|
这三者紧密协作,才能完成一个看似简单的"打开文件"操作。
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 5. 总结:操作系统是"大管家"
|
|
|
|
|
|
|
|
|
|
|
|
让我们用一个比喻总结操作系统的三大职责:
|
|
|
|
|
|
|
|
|
|
|
|
| 职责 | 比喻 | 核心任务 |
|
|
|
|
|
|
|------|------|---------|
|
|
|
|
|
|
| **进程管理** | 餐厅排班员 | 安排谁先工作、工作多久 |
|
|
|
|
|
|
| **内存管理** | 厨房管理员 | 分配工作台、防止冲突 |
|
|
|
|
|
|
| **文件系统** | 仓库管理员 | 整理物资、快速查找 |
|
|
|
|
|
|
|
|
|
|
|
|
::: tip 💡 核心启示
|
|
|
|
|
|
**操作系统的本质是"资源管理"**。
|
|
|
|
|
|
|
|
|
|
|
|
- CPU 时间是资源 → 进程管理
|
|
|
|
|
|
- 内存空间是资源 → 内存管理
|
|
|
|
|
|
- 磁盘空间是资源 → 文件系统
|
|
|
|
|
|
|
|
|
|
|
|
理解了这一点,你就会明白:
|
|
|
|
|
|
- 为什么电脑会变慢(进程太多、内存不足)
|
|
|
|
|
|
- 为什么需要重启(清理资源、释放内存)
|
|
|
|
|
|
- 为什么文件要整理(提高查找效率)
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 延伸阅读
|
|
|
|
|
|
|
|
|
|
|
|
- **操作系统原理**:深入学习进程调度、内存分页、文件系统实现
|
|
|
|
|
|
- **Linux 系统编程**:学习如何与操作系统交互(系统调用)
|
|
|
|
|
|
- **并发编程**:学习多进程、多线程编程
|
|
|
|
|
|
- **系统监控**:学习使用 top、htop、vmstat 等工具监控系统状态
|