主题
第一章 操作系统在做什么:三大抽象
1. 先破一个误区:操作系统不是"一堆名词"
很多人复习操作系统,是从背名词开始的:进程、线程、分页、信号量、死锁、SPOOLing……背了一大堆,做题时还是拿不准。原因很简单:这些名词不是孤立的知识点,而是同一套设计思路在不同资源上的反复应用。
这套思路可以用一句话概括:硬件是有限的、难用的、不安全的,操作系统把它们包装成无限的、好用的、安全的假象。这个"制造假象"的过程,教科书里叫抽象(abstraction,白话就是"把复杂细节藏起来,只露出一个简单的使用界面")。
抓住这条主线之后你会发现,整个专题其实只讲三件事:
- 虚拟化:把一块 CPU、一条内存"变出"很多份,让每个程序都以为自己独占机器。
- 并发:很多程序"同时"跑起来之后,如何避免互相踩踏。
- 持久化:断电之后数据不丢,靠文件系统把易失的内存世界接到磁盘上。
后面六章,全部挂在这三条主线上。本章先把地图画出来。
2. 操作系统的定位:硬件与应用之间的中间层
如果没有操作系统,每个应用程序都要自己直接操作硬件:自己给磁盘发命令、自己管理内存地址、自己处理键盘信号。这意味着每个程序员都要精通所有硬件型号,而且任何一个程序出错都可能毁掉整台机器上的所有数据。
操作系统的定位就是插在中间的一层"总管家":
从这张图能读出操作系统的两重身份,这也是选择题里最常考的表述:
| 视角 | 身份 | 白话解释 |
|---|---|---|
| 对下(面向硬件) | 资源的管理者 | 统一登记、分配、回收 CPU 时间、内存空间、设备使用权 |
| 对上(面向应用) | 抽象的提供者 | 把"磁盘扇区"包装成"文件",把"CPU 时间片"包装成"进程" |
一句话点透:应用程序看到的从来不是真实硬件,而是操作系统精心伪造的"虚拟机器"。文件、进程、虚拟地址,全是伪造出来的方便概念——但正是这些"假货",让编程从不可能变成了人人可为。
3. 全专题地图:虚拟化、并发、持久化
现在把三大主线和后面各章对应起来,建议把这张图当作整个专题的目录索引:
3.1 虚拟化:把"一个"变成"很多个"
机器上只有少数几个 CPU 核心,却能同时运行上百个程序。操作系统的做法是分时:让 CPU 在各程序之间快速轮流切换,每个程序都感觉自己拥有一个完整的 CPU——这就是 CPU 的虚拟化,产物叫进程。
内存同理:每个程序都以为自己独占一条从 0 开始编号的巨大内存,实际上操作系统在背后做地址翻译,把各程序的"假地址"映射到物理内存的不同角落——这就是内存的虚拟化,产物叫虚拟地址空间。
3.2 并发:假象带来的新麻烦
虚拟化让很多程序"同时"运行,但它们有时要共享数据。两个执行流交错着修改同一个变量,结果可能既不是 A 期望的、也不是 B 期望的。如何让共享既高效又正确,就是并发控制要解决的问题,工具包括锁、信号量、管程。
3.3 持久化:对抗断电
内存一断电就清空,所以重要数据必须写到磁盘等持久设备上。但磁盘只认"第几块"这种原始接口,操作系统用文件系统把它包装成"目录 + 文件名 + 读写接口"的友好世界。
4. 内核态与用户态:为什么必须有特权级
4.1 问题:既要让程序直接跑,又不能让它乱来
想让程序跑得快,最好的办法是让它直接在 CPU 上执行指令,操作系统别插手。但如果完全不插手,程序就可以为所欲为:读别人的内存、直接格式化磁盘、霸占 CPU 永不归还。
硬件给出的解法是特权级:CPU 提供至少两种运行模式。
| 对比项 | 用户态 | 内核态 |
|---|---|---|
| 谁在这个模式下运行 | 普通应用程序 | 操作系统内核 |
| 能否执行特权指令 | 不能 | 能 |
| 能访问的内存 | 只有自己的地址空间 | 全部内存 |
| 典型特权操作 | 无 | 设置时钟、操作设备、切换页表、开关中断 |
特权指令(白话:只有内核才被允许执行的危险指令,比如直接读写磁盘控制器)在用户态执行会立刻被 CPU 拦下并报告内核。考试常考"以下哪条必须在内核态执行",判断标准就一条:这件事如果让普通程序随便做,会不会危害其他程序或整个系统。会,就是特权指令。
4.2 系统调用:用户程序请内核办事的唯一正门
用户程序不能自己碰硬件,但它确实需要读文件、发网络包。怎么办?向内核申请代办——这就是系统调用(system call,白话:应用程序调用操作系统预先提供的服务入口)。
一次系统调用的完整过程如下:
注意两个高频考点:
- 状态切换由一条专门的陷入指令触发,而不是用户程序"自己声明我要进内核"。切换的检查权在硬件和内核手里。
- 系统调用执行期间,程序处于内核态;返回后回到用户态。所以"读文件的过程发生在用户态"这种说法是错的。
一句话点透:特权级 + 系统调用 = 既让程序全速裸跑,又把所有危险操作收口到内核审批。这是性能与安全兼得的关键设计。
5. 中断与陷阱:内核靠什么"夺回控制权"
程序在 CPU 上裸跑时,内核其实并不在运行。那内核怎么保证一个死循环的程序不会永远霸占 CPU?答案是中断。
中断(白话:硬件打给 CPU 的"插队电话",CPU 必须暂停手头的事去接)来自 CPU 外部:时钟到点了、磁盘读完了、键盘被按下了。其中最关键的是时钟中断——硬件时钟每隔几毫秒强制打断当前程序,把控制权交回内核,内核借机决定要不要换人运行。没有时钟中断,分时系统根本无法成立。
陷阱(trap,也叫内中断、异常)来自 CPU 内部正在执行的指令本身:除零、访问非法地址、或者主动执行系统调用指令。
| 对比项 | 中断(外中断) | 陷阱 / 异常(内中断) |
|---|---|---|
| 来源 | CPU 外部设备 | 当前执行的指令 |
| 与当前指令的关系 | 无关,随时可能来 | 由当前指令直接引起 |
| 典型例子 | 时钟中断、I/O 完成中断 | 系统调用、缺页、除零错 |
| 是否可预期 | 不可预期 | 系统调用可预期,故障不可预期 |
两者的共同点是处理套路一致:保存现场 → 切入内核态 → 查中断向量表找处理程序 → 处理 → 恢复现场返回。这个套路第七章还会细讲。
一句话点透:中断是操作系统的心跳。内核平时"睡着",全靠中断把它唤醒来主持公道。
6. 操作系统的发展脉络:每一代都在解决上一代的浪费
发展史不用背年份,只要抓住"每一步在解决什么浪费":
三个里程碑各自的关键词:
- 多道程序设计:内存里同时装入多个作业,谁等 I/O 谁让出 CPU。关键词是提高资源利用率,但用户不能交互。
- 分时系统:把 CPU 时间切成小片轮流分给各终端用户。关键词是交互性与及时响应。
- 实时系统:在规定的截止时间内必须完成处理。关键词是及时性与可靠性,而不是"跑得快"。
7. 常见操作系统分类对照
| 类型 | 追求目标 | 是否交互 | 典型场景 | 一句话记忆 |
|---|---|---|---|---|
| 批处理系统 | 吞吐量、资源利用率 | 无交互 | 早期工资单、报表作业 | 攒一批、自动跑、不理人 |
| 分时系统 | 响应时间、公平 | 强交互 | 多用户终端、现代桌面的前身 | 时间片轮流转,人人像独占 |
| 实时系统 | 截止时间内必须完成 | 视场景 | 飞控、工业控制、火车信号 | 迟到等于出错 |
| 嵌入式系统 | 体积小、资源省、够用 | 视场景 | 路由器、家电、车载设备 | 裁剪进设备里的小内核 |
| 分布式系统 | 多机协作、整体透明 | 视场景 | 集群、云计算 | 多台机器装成一台用 |
易错点:实时系统的"实时"不是"速度快",而是"截止时间有保证"。一个每次都在 10 毫秒内响应但偶尔超时的系统,不是合格的硬实时系统。
8. 常见 OS 家族一览
| 家族 | 代表 | 定位 |
|---|---|---|
| UNIX 系 | UNIX、Solaris、AIX | 分时多用户的鼻祖,本专题许多概念的源头 |
| 类 UNIX 开源 | Linux、各发行版 | 服务器与云的主力,考试常拿它举例 |
| BSD 衍生 | FreeBSD、macOS 内核部分 | UNIX 血统的另一分支 |
| Windows 系 | Windows 10/11、Windows Server | 桌面市场主流,NT 内核 |
| 移动端 | Android(Linux 内核)、iOS | 智能手机双雄 |
| 实时/嵌入式 | VxWorks、FreeRTOS、RT-Thread | 工控与设备领域 |
9. 传统教材的"四大管理"如何对应三大主线
国内教材常把操作系统的功能划分为四大管理,考试题干也常用这套话语。它和本专题的三大主线是一一对应的,不冲突:
| 传统四大管理 | 管什么 | 对应主线 | 对应章节 |
|---|---|---|---|
| 处理机管理 | 进程线程的创建、调度、同步 | CPU 虚拟化 + 并发 | 第二、三、四章 |
| 存储器管理 | 内存分配、地址转换、虚拟内存 | 内存虚拟化 | 第五章 |
| 文件管理 | 文件、目录、磁盘空间 | 持久化 | 第六章 |
| 设备管理 | I/O 控制、缓冲、驱动 | 持久化的通道 | 第七章 |
有的教材还会加上"作业管理"或"用户接口",指命令行、图形界面和系统调用这层对外的门面。遇到五分法不必慌,多出来的就是这一项。
学习顺序上,本专题坚持"先虚拟化、再并发、后持久化"的讲法,因为它符合因果:先有了进程(虚拟化),才有多个进程抢资源的问题(并发);解决了跑起来的问题,才轮到数据存下来的问题(持久化)。
10. 本章要点回顾
| 主题 | 必须记住的结论 |
|---|---|
| 操作系统定位 | 对下是资源管理者,对上是抽象提供者,处于应用与硬件之间 |
| 三大主线 | 虚拟化(CPU、内存)、并发、持久化,统领后面六章 |
| 用户态/内核态 | 特权指令只能在内核态执行;判断标准是"乱用是否危害全局" |
| 系统调用 | 用户程序请求内核服务的唯一正门,靠陷入指令切换状态 |
| 中断 | 外中断来自设备,内中断(陷阱)来自当前指令;时钟中断是分时的根基 |
| 发展脉络 | 手工→批处理→多道→分时→现代;每一步都在消灭一种浪费 |
| 实时系统 | 关键是截止时间有保证,不是运行速度快 |
11. 做题提醒
- "系统调用可以在用户态完成"是错的:调用的发起在用户态,但服务的执行在内核态。
- 区分特权指令与非特权指令时,别背清单,问一句"让普通程序随便执行会不会危害他人"——设置时钟、清内存、开关中断都是特权指令;读时钟、取数、寄存器运算不是。
- 分时系统最主要的特征是交互性和及时性,批处理系统最主要的目标是系统吞吐量和资源利用率,两者常被出题者互换来挖坑。
- "多道程序设计一定需要多个 CPU"是错的:单 CPU 靠交替执行同样实现多道。
- 中断分类题:系统调用属于内中断(陷阱),不是外中断;时钟中断、I/O 完成中断才是外中断。
- 实时系统题目中出现"响应快"不等于正确选项,正确表述必须包含"规定时间/截止期限内完成"。
