Skip to content

第一章 操作系统在做什么:三大抽象


1. 先破一个误区:操作系统不是"一堆名词"

很多人复习操作系统,是从背名词开始的:进程、线程、分页、信号量、死锁、SPOOLing……背了一大堆,做题时还是拿不准。原因很简单:这些名词不是孤立的知识点,而是同一套设计思路在不同资源上的反复应用。

这套思路可以用一句话概括:硬件是有限的、难用的、不安全的,操作系统把它们包装成无限的、好用的、安全的假象。这个"制造假象"的过程,教科书里叫抽象(abstraction,白话就是"把复杂细节藏起来,只露出一个简单的使用界面")。

抓住这条主线之后你会发现,整个专题其实只讲三件事:

  1. 虚拟化:把一块 CPU、一条内存"变出"很多份,让每个程序都以为自己独占机器。
  2. 并发:很多程序"同时"跑起来之后,如何避免互相踩踏。
  3. 持久化:断电之后数据不丢,靠文件系统把易失的内存世界接到磁盘上。

后面六章,全部挂在这三条主线上。本章先把地图画出来。

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,白话:应用程序调用操作系统预先提供的服务入口)。

一次系统调用的完整过程如下:

注意两个高频考点:

  1. 状态切换由一条专门的陷入指令触发,而不是用户程序"自己声明我要进内核"。切换的检查权在硬件和内核手里。
  2. 系统调用执行期间,程序处于内核态;返回后回到用户态。所以"读文件的过程发生在用户态"这种说法是错的。

一句话点透:特权级 + 系统调用 = 既让程序全速裸跑,又把所有危险操作收口到内核审批。这是性能与安全兼得的关键设计。

5. 中断与陷阱:内核靠什么"夺回控制权"

程序在 CPU 上裸跑时,内核其实并不在运行。那内核怎么保证一个死循环的程序不会永远霸占 CPU?答案是中断

中断(白话:硬件打给 CPU 的"插队电话",CPU 必须暂停手头的事去接)来自 CPU 外部:时钟到点了、磁盘读完了、键盘被按下了。其中最关键的是时钟中断——硬件时钟每隔几毫秒强制打断当前程序,把控制权交回内核,内核借机决定要不要换人运行。没有时钟中断,分时系统根本无法成立。

陷阱(trap,也叫内中断、异常)来自 CPU 内部正在执行的指令本身:除零、访问非法地址、或者主动执行系统调用指令。

对比项中断(外中断)陷阱 / 异常(内中断)
来源CPU 外部设备当前执行的指令
与当前指令的关系无关,随时可能来由当前指令直接引起
典型例子时钟中断、I/O 完成中断系统调用、缺页、除零错
是否可预期不可预期系统调用可预期,故障不可预期

两者的共同点是处理套路一致:保存现场 → 切入内核态 → 查中断向量表找处理程序 → 处理 → 恢复现场返回。这个套路第七章还会细讲。

一句话点透:中断是操作系统的心跳。内核平时"睡着",全靠中断把它唤醒来主持公道。

6. 操作系统的发展脉络:每一代都在解决上一代的浪费

发展史不用背年份,只要抓住"每一步在解决什么浪费":

三个里程碑各自的关键词:

  1. 多道程序设计:内存里同时装入多个作业,谁等 I/O 谁让出 CPU。关键词是提高资源利用率,但用户不能交互。
  2. 分时系统:把 CPU 时间切成小片轮流分给各终端用户。关键词是交互性及时响应
  3. 实时系统:在规定的截止时间内必须完成处理。关键词是及时性可靠性,而不是"跑得快"。

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. 做题提醒

  1. "系统调用可以在用户态完成"是错的:调用的发起在用户态,但服务的执行在内核态。
  2. 区分特权指令与非特权指令时,别背清单,问一句"让普通程序随便执行会不会危害他人"——设置时钟、清内存、开关中断都是特权指令;读时钟、取数、寄存器运算不是。
  3. 分时系统最主要的特征是交互性和及时性,批处理系统最主要的目标是系统吞吐量和资源利用率,两者常被出题者互换来挖坑。
  4. "多道程序设计一定需要多个 CPU"是错的:单 CPU 靠交替执行同样实现多道。
  5. 中断分类题:系统调用属于内中断(陷阱),不是外中断;时钟中断、I/O 完成中断才是外中断。
  6. 实时系统题目中出现"响应快"不等于正确选项,正确表述必须包含"规定时间/截止期限内完成"。