chore: save local history restorations from accidental git restore

This commit is contained in:
sanbuphy
2026-02-23 01:40:56 +08:00
parent 780be69b99
commit 2a0fdd3392
27 changed files with 5971 additions and 2743 deletions
@@ -1,255 +1,99 @@
# 操作系统(进程 / 内存 / 文件系统)
# 操作系统:给电脑请个"大管家"
::: tip 🎯 核心问题
**操作系统是做什么的?** 你可能每天都在用 Windows、macOS 或 Linux,但你知道它到底在忙什么吗?为什么需要它?没有它电脑还能用吗?本章带你理解操作系统的三大核心职责:管理进程、管理内存、管理文件。
**有了完美的 CPU 和无限的内存,电脑就能直接用了吗?**
在上一章,我们见证了晶体管如何组合成强大的 CPU。但其实,如果直接使用这些冷冰冰的硬件,哪怕只是想在屏幕上打出一个字母,你都需要手写几百行晦涩的机器指令。
为了不让大家在每次用电脑时都被逼疯,前辈们创造了一个夹在“硬件”和“你”之间的超级管家——**操作系统(Operating System, 简称 OS)**。本章我们不谈深奥的理论,只聊聊这个大管家是怎么通过三大“障眼法”,把复杂的硬件调教得服服帖帖的。
:::
---
## 0. 全景图:操作系统的角色
## 0. 承上启下:如果没有操作系统会怎样?
想象你开了一家餐厅。你需要:
- **安排员工工作**:谁做菜、谁端盘子、谁收银(进程管理)
- **管理厨房空间**:冰箱放什么、操作台怎么分配(内存管理)
- **整理仓库物资**:食材怎么存放、怎么找(文件系统)
上一章我们提到,CPU 是一个不知疲倦的无情计算机器,通电后就会一行一行地执行指令。
操作系统就是电脑的"餐厅经理",它负责协调所有资源,让程序能顺利运行。
但这带来了几个现实的灾难:
1. **CPU 独占危机**:CPU 一次只能干一件事。如果你正在听歌,想切出去看个网页?抱歉,没有操作系统的调度,你的电脑必须停下音乐,才能去加载网页。
2. **内存踩踏事故**:微信和游戏都在使用内存。如果没有保安管理,游戏一不小心把数据写到了微信的内存地盘,微信当场崩溃。
3. **硬盘迷宫**:硬盘本质上只是一张密密麻麻刻满 0 和 1 的巨大光盘。要想找到你昨天存的照片,你必须准确记住它存放在第 12345 圈磁道的第 678 个扇区。
**操作系统的三大核心职责:**
| 职责 | 管理对象 | 核心问题 | 类比 |
|------|---------|---------|------|
| **进程管理** | CPU 时间 | 谁先用 CPU?用多久? | 员工排班 |
| **内存管理** | 内存空间 | 程序放哪里?怎么不冲突? | 厨房空间分配 |
| **文件系统** | 磁盘数据 | 数据怎么存?怎么找? | 仓库物资管理 |
::: tip 📊 逐行解读这张表
**进程管理**:CPU 是最宝贵的资源,操作系统要决定哪个程序先用、用多久。就像餐厅经理安排员工轮班,不能让所有人同时挤在厨房里。
**内存管理**:内存是程序的"工作台",操作系统要给每个程序分配空间,还要保证它们互不干扰。就像厨房空间有限,要合理分配给不同的厨师。
**文件系统**:磁盘是"仓库",操作系统要把数据有序地存进去,需要时能快速找到。就像仓库管理员整理货架,按类别、编号存放。
:::
为了解决这些噩梦,操作系统诞生了。它对外提供了一套优雅的“幻觉”,这就是它的三大核心魔法:**进程(管理 CPU)**、**虚拟内存(管理内存)** 和 **文件系统(管理硬盘)**
---
## 1. 进程管理:程序的"分身术"
## 1. 进程管理:制造“同时运行”的幻觉
### 1.1 什么是进程
你平时用电脑,常常是一边挂着微信,一边听着音乐,还能一边打字。但如果你买的电脑其实只有一个 CPU 核心,它是怎么同时做这三件事的
答案是:**它并没有同时做**。是操作系统在进行疯狂的“时间管理”。
<ProcessDemo />
::: tip 💡 程序 vs 进程
这是初学者最容易混淆的概念:
::: tip 💡 核心原理解析:时间片轮转(Time Slicing
操作系统把 CPU 的时间切成了极其微小的片段(比如 10 毫秒)。
- 第 1-10 毫秒:让 CPU 去执行**微信**的接收消息逻辑。
- 第 11-20 毫秒:把微信强制暂停,让 CPU 去执行**音乐**的播放逻辑。
- 第 21-30 毫秒:把音乐暂停,让 CPU 去响应你的**键盘打字**。
| 概念 | 定义 | 类比 | 特点 |
|------|------|------|------|
| **程序** | 静态的代码文件 | 菜谱 | 存在磁盘上,不会动 |
| **进程** | 程序的运行实例 | 正在按菜谱做菜 | 在内存中运行,会变化 |
因为切换的速度实在太快了(一秒钟切换成百上千次),在人类迟钝的感知中,就觉得这三个软件是“同时”在运行的。
**关键区别**
- 一个程序可以启动多个进程(比如打开多个浏览器窗口)
- 每个进程有独立的内存空间,互不干扰
- 进程有生命周期:创建、运行、等待、终止
在操作系统的术语里,运行中的程序就被称为**进程(Process)**。操作系统就是这群进程的冷酷无情的排班经理。
:::
### 1.2 进程的状态
进程在运行过程中会在不同状态之间切换:
| 状态 | 含义 | 什么时候进入 | 类比 |
|------|------|-------------|------|
| **就绪 (Ready)** | 准备好运行,等 CPU | 进程刚创建,或从等待恢复 | 员工在休息室等排班 |
| **运行 (Running)** | 正在 CPU 上执行 | 被调度器选中 | 员工正在工作 |
| **等待 (Waiting)** | 等待 I/O 或其他资源 | 需要读磁盘、等网络 | 员工在等食材送达 |
| **终止 (Terminated)** | 运行结束 | 程序退出或出错 | 员工下班 |
### 1.3 进程调度:谁先用 CPU
::: tip 💡 为什么需要调度?
CPU 核心数有限,但进程可能有几十上百个。操作系统需要决定:
- 哪个进程先运行?
- 运行多久?
- 什么时候切换?
这就是**进程调度**要解决的问题。
:::
**常见调度算法:**
| 算法 | 思路 | 优点 | 缺点 |
|------|------|------|------|
| **先来先服务 (FCFS)** | 谁先到谁先运行 | 简单公平 | 短任务可能等很久 |
| **短作业优先 (SJF)** | 短任务优先 | 平均等待时间最短 | 需要预知任务长度 |
| **时间片轮转 (RR)** | 每人运行一小段时间 | 公平,响应快 | 切换开销大 |
| **优先级调度** | 重要任务优先 | 重要任务响应快 | 可能导致低优先级任务饿死 |
---
## 2. 内存管理:程序的"工作台"
## 2. 内存管理:给每个程序画个“海市蜃楼”
### 2.1 为什么需要内存管理?
解决了 CPU 轮流用的问题,接下来是存放数据的内存。如果所有的进程都挤在同一块物理内存里,很容易发生互相干扰和偷看数据的危险。
操作系统的第二大魔法,叫作**虚拟内存(Virtual Memory**。
<MemoryDemo />
::: tip 💡 如果没有内存管理会怎样?
想象一个没有管理的厨房:
::: tip 💡 核心原理解析:内存映射
操作系统对每一个启动的进程撒了一个弥天大谎:“嘿,你独占了整整 4GB 的纯净内存空间,随便用!”(这就是**虚拟内存**)。
- **冲突**:两个厨师同时用同一个灶台,菜都糊了
- **浪费**:有人占了整个厨房,其他人没地方做饭
- **安全问题**:有人偷吃了别人的食材
但实际上,当进程往这个“虚拟空间”里放东西时,操作系统的底层会拿出一个**映射表(页表)**,偷偷把数据塞进**真实物理内存(Physical Memory)**中各种零碎、不连续的角落里。
操作系统通过**内存管理**解决这些问题:
- 给每个进程分配独立的内存空间
- 防止进程互相干扰(内存保护)
- 高效利用有限的内存资源
**这么做有两个巨大的好处:**
1. **绝对安全**:微信永远只能看到自己的虚拟空间,它根本不知道音乐的数据在物理内存的哪个角落,自然就不会发生“踩踏”。
2. **碎片利用**:物理内存就算被用得像狗皮膏药一样稀碎,映射给进程的虚拟空间依然是连续且整齐的。
:::
### 2.2 虚拟内存:让每个进程都"以为"自己独占内存
::: tip 💡 什么是虚拟内存?
**虚拟内存**是操作系统的一个"魔术":
- 每个进程都以为自己有 4GB(或更多)的内存空间
- 实际上物理内存可能只有 8GB、16GB
- 操作系统通过"映射"把虚拟地址转换成物理地址
**生活类比**:想象一个酒店:
- 每个客人都以为自己独占整个酒店(虚拟空间)
- 实际上酒店只有 100 间房(物理内存)
- 前台(操作系统)负责分配房间、记录谁住哪里
:::
**虚拟内存的好处:**
| 好处 | 说明 | 为什么重要 |
|------|------|-----------|
| **隔离保护** | 进程间内存互不干扰 | 一个崩溃不影响其他 |
| **内存扩展** | 用磁盘当内存用 | 可以运行比物理内存大的程序 |
| **简化编程** | 不用关心物理地址 | 程序员写代码更简单 |
### 2.3 内存分配策略
当进程需要内存时,操作系统如何分配?
| 策略 | 思路 | 特点 |
|------|------|------|
| **首次适应** | 找到第一个够大的空闲块 | 速度快 |
| **最佳适应** | 找最小的够大的空闲块 | 内存利用率高 |
| **最坏适应** | 找最大的空闲块 | 减少小碎片 |
---
## 3. 文件系统:数据的"档案柜"
## 3. 文件系统:把“荒地”变成“档案馆”
### 3.1 什么是文件系统?
如果你买了一块崭新的硬盘,它里面其实是一片荒芜的存储单元。如果你想存一张照片,硬盘硬件只会问你:“请告诉我你要存在第几个字节地址?”这显然反人类。
操作系统的第三大魔法是**文件系统(File System)**,它为你构建了我们最熟悉的:文件夹(目录)和文件的概念。
<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. **内存管理**:负责"给程序分配空间"
这三者紧密协作,才能完成一个看似简单的"打开文件"操作。
::: tip 💡 核心原理解析:从地址到路径
文件系统本质上是一个超级大型的“翻译官”加“账本”:
1. **账本功能**:它悄悄地把硬盘切分成无数个小块(Block),然后用一个账本记录下来“哪几个小块现在是空的可以存数据,哪几个小块已经存了东西”。
2. **翻译功能**当你双击一层层文件夹,打开 `D盘/照片/宠物.jpg` 时,并不是硬盘真的长出了树枝一样的结构。而是文件系统在它的账本里疯狂翻阅,最终翻译出:哦,这个路径其实对应的是硬盘上的第 1056、1057 和 998 块小地方,然后把数据取出来交给你。
:::
---
## 5. 总结:操作系统是"大管家"
## 4. 总结:伟大的幕后英雄
让我们用一个比喻总结操作系统的三大职责:
让我们通过一个你每天都在经历的场景,串联起今天学到的知识。当你**双击鼠标打开一个游戏**时,为了伺候你,大管家做了什么?
| 职责 | 比喻 | 核心任务 |
|------|------|---------|
| **进程管理** | 餐厅排班员 | 安排谁先工作、工作多久 |
| **内存管理** | 厨房管理员 | 分配工作台、防止冲突 |
| **文件系统** | 仓库管理员 | 整理物资、快速查找 |
1. **文件系统**:立刻从底层硬盘的杂乱数据块中,拼凑出游戏的执行文件和美术资产。
2. **内存管理**:为你分配一个巨大的虚拟内存空间,制造出“这台电脑只有这一个游戏”的幻觉,并把刚才找到的文件放进物理内存的空隙里。
3. **进程管理**:在它的名册上新建一个“游戏进程”,并在下一个瞬间,立刻剥夺其他正在运行软件的 CPU 权利,把 CPU 的计算力全盘移交给你的游戏。
::: tip 💡 核心启示
**操作系统的本质是"资源管理"**
- CPU 时间是资源 → 进程管理
- 内存空间是资源 → 内存管理
- 磁盘空间是资源 → 文件系统
理解了这一点,你就会明白:
- 为什么电脑会变慢(进程太多、内存不足)
- 为什么需要重启(清理资源、释放内存)
- 为什么文件要整理(提高查找效率)
:::
我们之所以能那么轻松、优雅地在数字世界里冲浪,全都是因为底层的操作系统在替我们负重前行。
---
## 延伸阅读
- **操作系统原理**:深入学习进程调度、内存分页、文件系统实现
- **Linux 系统编程**:学习如何与操作系统交互(系统调用
- **并发编程**:学习多进程、多线程编程
- **系统监控**:学习使用 top、htop、vmstat 等工具监控系统状态
如果你觉得操作系统的各种“管理学”十分有趣,你可以看看这些进阶话题:
- **进程与线程的区别**:除了进程,还有一种叫作“线程”的东西,它们是干什么用的?(为什么 Google Chrome 那么吃内存?
- **页面置换算法**:当物理内存全都塞满了,但你又打开了一个新软件,操作系统该把谁的数据临时踢到硬盘里?(LRU 算法)
- **操作系统的多态**Windows 和 macOS 会在底层实现上有什么不同?为什么有些软件只能在特定系统上运行?