如果你刚开始啃王道操作系统的第1集,也就是1.1.1到1.3.3这七个小节,大概率会有一种错觉:这些东西好像都听说过,不用太仔细。操作系统的概念、特征、发展史、中断、系统调用,听上去都很“常识”。但等你做真题就会发现,第一章的选择题正确率经常比第三章还低,因为第一章考的不是记忆,而是概念之间的边界。比如“并发”和“并行”,“中断”和“异常”,“系统调用”和“库函数”,每一对都长得像,但考法完全不同。下面我就顺着王道第1集的目录,把这七个小节里的核心考点、易错点,以及我当年复习时踩过的坑,一次性说清楚。
1. 1.1.1节的价值不在“背定义”,而在于看懂操作系统的三重角色
1.1 官方定义拆开看:资源管理、资源分配、接口环境
王道教材对操作系统的定义是:操作系统是指控制和管理整个计算机系统的硬件与软件资源,合理地组织调度计算机的工作和资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。
这句话至少透出三层意思。第一,“控制和管理硬件与软件资源”,对应的是资源管理者视角:CPU、内存、磁盘、文件、设备,全都归操作系统管。第二,“合理地组织调度计算机的工作和资源的分配”,强调的是操作系统作为资源分配者,要决定“哪个进程用CPU、哪个进程拿内存、哪个进程先访问磁盘”。第三,“为用户和其他软件提供方便接口与环境”,对应的是接口视角:用户和应用程序靠操作系统提供的接口来使用硬件资源。
真题里最喜欢拿“接口”做文章。请记住一句准确的话:操作系统是用户和计算机硬件系统之间的接口。有人会改写成“操作系统是硬件和软件之间的接口”,这是错的。为什么错?因为从层次结构看,操作系统是覆盖在裸机上的第一层软件,其他所有的系统软件和应用软件都建立在操作系统之上。硬件和软件之间确实是靠操作系统来衔接的,但“接口”这个术语在教材里有严格指向——命令接口和程序接口是面向用户的,不是面向“软件”的。
这里还要区分三个容易搞混的概念:
- 命令接口:用户直接使用。分联机命令接口(交互式终端里敲命令)和脱机命令接口(用作业控制语言写说明书)。
- 程序接口:也就是系统调用,供用户程序在代码中请求操作系统服务。
- 图形用户界面GUI:严格说,它不属于操作系统内核的必要组成,更像一种基于命令接口或程序接口实现的交互外壳。
选择题如果问“哪些属于操作系统提供的用户接口”,通常答命令接口和程序接口;如果问“操作系统是软件还是硬件”,答案很明确——操作系统是最基本的系统软件,不是应用软件。QQ、浏览器、Office是应用软件;编译器、数据库管理系统虽然也归在系统软件大类里,但它们本身不是操作系统。真题偶尔会出归类题,比如“下列哪些属于操作系统的主要功能”,处理机管理、存储器管理、文件管理、设备管理、接口这五块都要能对上。
1.2 目标与功能的区别:考功能题要按照框架展开
操作系统的设计目标有四个:方便性、有效性、可扩充性、开放性。选择题偶尔考“下列哪个不是操作系统的设计目标”,比如混入“安全性”——安全性当然重要,但它不在这个目标清单里,属于后面的章节内容。
功能部分要注意别只记一个词。存储器管理不只是“做内存分配”,还包括地址映射、内存保护与共享、内存扩充;文件管理不只是“读文件”,还包括文件存储空间管理、目录管理、文件读写管理与保护;设备管理包括缓冲管理、设备分配、设备处理、虚拟设备。现在不需要展开细节,但记忆这个框架很有用,因为后面第四章、第五章、第六章会反复用到这套分类。
我当年复习时,在这一页画了一张六宫格框架:三重视角、四大目标、五大功能。后来越复习越觉得,第一章那页纸几乎就是整本操作系统的目录。先把地图记住,再往里填充内容,效率高很多。
2. 1.1.2节的四个特征:并发与共享互为条件,虚拟与异步都是引申产物
2.1 并发和并行:一字之差,至少值一道真题
并发和并行是这门课第一个真正的“坑点”。并发的定义是:两个或多个事件在同一时间间隔内发生。注意,是“时间间隔”,不是一个时间点。并行才是“同一时刻”真正同时发生。
为什么操作系统天天讲并发而不是并行?因为传统单核CPU上,任何时刻只能执行一条指令。程序之间只能交替运行:A跑一会儿,B跑一会儿,宏观上它们同时存在、同时推进,微观上彼此轮流占用CPU。只有多核处理器上,两个进程才能分别在不同核对上同时执行,那才是并行。
这个考点的题目一般长这样:单核CPU上有进程A、B交替执行,问A和B的关系。答案当然是并发。408里还会出现更绕的描述,比如“多核环境下两个进程在不同核上同时运行”,答案就是并行。本质都是考这两个词的定义。
我见过不少同学在这里栽跟头,不是不会,是粗心。题目故意写“同一时间间隔内”,选项说这是并行,一眼看过去觉得对就选了。做题时把“间隔”和“时刻”圈出来,能少丢好多分。
2.2 互斥共享与同时访问:别被“同时”两个字骗了
共享的定义是:系统中的资源可供多个并发执行的进程共同使用。它分两种方式:
- 互斥共享:资源在一段时间内只能由一个进程访问,用完后释放,另一个进程才能用。打印机、磁带机这类临界资源都属于互斥共享。
- 同时访问:资源允许在宏观上被多个进程“同时”使用,但微观上它们可能是交替访问或分时使用。磁盘、可重入代码、共享文件、内存中的共享数据段都属于这一类。
注意,“同时访问”并不是真正的同一瞬间读写同一个物理位置。磁盘请求在硬件层面就是排队、寻道、交错处理;可重入代码是只读的,多个进程可以各自执行同一份代码段,互相不干扰。所以如果选项说“同时访问意味着多个进程在同一时刻访问同一资源的同一数据区”,这个说法是错的。这也是选择题的经典陷阱。
2.3 虚拟和异步:一个靠复用,一个靠不确定性
虚拟:通过时分复用或空分复用,把一个物理实体变成若干个逻辑上的对应物。CPU通过时分复用被虚拟成多个虚拟处理器,每个进程都觉得自己独占一个CPU;内存通过空分复用被虚拟成大内存,一个物理内存条在逻辑上可以容纳远大于实际物理内存的地址空间。虚拟技术的本质是“掩盖资源数量的不足”,但代价是增加系统开销。
异步:在多道程序环境下,进程以不可预知的速度向前推进,走走停停。为什么会这样?因为进程之间要竞争CPU、内存、I/O资源,谁先谁后由调度策略和当前资源状态决定,执行序列无法事先确定。
这里有个易错结论:“异步导致进程的执行结果不可预知”是错的。结果由程序和输入决定,可变的只是推进速度和执行顺序。这个点经常作为迷惑项出现。
2.4 四个特征的关系怎么答才不丢分
并发和共享是操作系统最基本的两个特征,二者互为存在条件。并发需要共享:多个进程同时推进,必然要访问同一批硬件资源。共享需要并发:如果系统没有并发,一个进程独占全部资源,共享就没有意义。虚拟是并发和共享的产物:资源不够分,只好把物理资源虚拟成多份来满足各方需求。异步也是并发和共享的必然结果:多个进程抢资源,推进速度自然不可预知。
简答题如果问“操作系统的四个特征及其关系”,标准答法就是先写四个特征的定义,再写这条逻辑链。别漏异步,也别把虚拟和异步的关系搞反。
提示:做题时看到“下列哪项不是操作系统的特征”,先背出“并发、共享、虚拟、异步”四个词,再逐项排除,基本不会错。
3. 1.1.3节发展史怎么背:按“痛点→方案→新痛点”推导,别硬记时间线
3.1 从手工操作到单道批处理:核心矛盾是人机速度不匹配
最早的程序员在纸带上打孔,把纸带通过读卡机装入内存,然后在控制台拨开关、按按键。这时候没有操作系统,整个机器一个时刻只能被一个人占用,CPU大部分时间在等人工操作,利用率低得可怜。人机速度不匹配,是所有矛盾的开端。
解决方案是批处理。最先出现的是脱机输入/输出技术:先用一台外围机,把慢速设备上的数据读到磁带上,再把磁带交给主机处理;主机处理完把结果写回磁带,再由外围机负责打印输出。脱机的核心思路,是把慢速I/O和高速计算在时间上错开,主机不必等读卡机一张一张地读纸带。
单道批处理时期,内存里只有一道程序。监督程序负责把一个作业读入、运行、算出结果、再读入下一个作业。问题是:程序一旦请求I/O,CPU就只能空等,内存里又没有其他程序可以切换上去运行,所以CPU仍然大量空闲。
3.2 单道到多道批处理:为什么必须引入中断
多道批处理的改进很直观:把多道程序同时装入内存,当一道程序等待I/O时,CPU立即切换去执行另一道程序。A进程在等磁盘,B进程就用CPU做计算,CPU和I/O得以并行工作,资源利用率大幅提升,系统吞吐量也上去了。
但这件事不是白来的,它有两个重要前提:一是计算机必须具备中断和通道技术,否则操作系统没有机会在程序执行到一半时重新夺回CPU;二是系统中出现了复杂的调度算法,要决定哪道程序先用CPU、用多久。
多道批处理的致命缺点是没有交互性。用户把作业交上去之后只能等结果,中途不能修改、不能调试,作业平均周转时间长得离谱。正是这个痛点催生了下一阶段的分时系统。所以学习发展史,关键不是记年份,而是理解“上一代解决了什么问题、又暴露了什么新问题”。
3.3 分时与实时:一个保交互,一个保可靠
分时系统解决的是交互性问题:把CPU时间切成很短的时间片,轮流分配给各个终端用户。时间片一到,不管当前程序执行到哪一步,都强制切换到下一个用户。于是多个用户感觉自己是“独占”终端,响应速度也足够快。
分时系统的四个特性:多路性(多个用户同时在线)、独立性(用户之间互不感知)、及时性(时间片短,响应及时)、交互性(用户可以会话式地调试程序)。注意,分时系统的及时性是“用户能接受的程度”,不是严格的截止期限。
实时系统的目标是另一回事:它要在规定时间内对外部事件做出响应,并可靠地完成处理。实时系统分硬实时和软实时:硬实时必须保证任务在截止时间前完成,比如导弹飞行控制、工业过程控制;软实时允许偶尔超时,比如视频通话、订票系统。
平时做比较题,记住这一组对立关系:
| 对比维度 | 分时系统 | 实时系统 |
|---|---|---|
| 首要目标 | 交互性和多路性 | 及时性和可靠性 |
| 时间约束 | 用户可接受的响应时间 | 必须在截止时间内完成 |
| 交互要求 | 强交互 | 不强调丰富交互 |
| 典型例子 | 多用户终端UNIX | 工业控制、导弹系统 |
3.4 网络OS、分布式OS、嵌入式OS,各记一个鉴别点
- 网络操作系统:把多台独立计算机连接成网络,每台机器有自己的操作系统,可以相互通信、共享资源,但各自独立管理自己。
- 分布式操作系统:多台机器在用户看来就是一台统一的计算机。资源调度、文件管理都是全局透明的。和网络OS的区别就是“整体是否对用户透明”。
- 嵌入式操作系统:运行在嵌入式设备上,小型、可裁剪、实时性要求高,比如车机、机顶盒、工业控制器里的系统。
选择题遇到“下列哪种操作系统将多台机器组织成一个对用户透明的统一系统”,答案就是分布式操作系统。这类题不算难,关键是别被网络OS干扰。
4. 1.3.1节运行机制:用户态和内核态之间的那道门,只有三种方式能打开
4.1 为什么要隔离:机长室不能对乘客开放
如果用户程序可以随意执行所有指令,那它可以随便改写内存里的操作系统代码、随时关闭中断、直接指挥硬件做奇怪的事,系统很快就会崩溃,更不用说防病毒之类的问题了。所以CPU被划分成两种状态:内核态(也叫管态、核心态)和用户态(也叫目态)。内核态能执行特权指令和非特权指令,用户态只能执行非特权指令。
我用一个生活化类比:内核态相当于机长室,只有机组人员能进;用户态是乘客舱,乘客不能进驾驶舱动操纵杆。用户程序要“动操纵杆”,比如发一条I/O指令,只能按铃呼叫机组人员——也就是发起系统调用,由内核替他操作。
4.2 特权指令和非特权指令怎么判断
需要重点区分几组:
- 特权指令:I/O指令、关中断指令、停机指令、修改程序状态字PSW、设置时钟、内存保护、状态切换等。
- 非特权指令:算术运算、逻辑运算、取数、访存(访问自己的合法地址空间)、普通寄存器读写等。
判断技巧很简单:一条指令如果会影响整个系统的全局控制、外部设备或中断状态,那它一定是特权指令;如果只影响当前程序自身的数据计算和逻辑流程,就是非特权指令。
这里有一个高频易错点:“访管指令”也叫陷入指令trap,它是特殊的。访管指令在用户态可以执行,它本身不是特权指令,但它执行后会产生一个内部异常,从而把CPU切换到内核态。它相当于乘客舱里的“呼叫按钮”,按下去不是自己操作飞机,而是把机组人员叫过来。
用户态下执行特权指令会怎样?CPU会拒绝执行,并触发一个异常(一般归为非法指令类故障),然后操作系统捕获这个异常,进入内核态做处理。这正好衔接下一节内容:异常是切换状态的大门之一。
4.3 内核到底包含什么
操作系统内核是运行在内核态的核心部分,主要包含四块:
- 时钟管理:给进程计时、提供时间片、维护系统时间,是分时和调度的重要基础。
- 中断机制:检测中断信号、响应中断、调用中断处理程序。
- 原语:原子操作,执行期间不可被中断。“阻塞”“唤醒”“进程切换”这些最敏感的操作必须以原语形式实现,防止并发环境下数据被撕成两半。
- 系统控制的数据结构及处理:进程控制块、内存管理表、设备管理表等核心数据,以及针对这些数据的处理逻辑。
“原语”是王道第一章的常考名词之一,重点记住它“一气呵成、不可分割”的特点。
4.4 状态切换的唯一路径
从用户态进入内核态,唯一途径是中断、异常或陷入。这三者可以概括为“广义中断”,系统调用属于陷入的一种。所以“只有系统调用才能进入内核态”这个说法是错的——硬件中断、时钟中断、除零异常也都能进入内核态。
从内核态回到用户态,则是通过中断返回指令等机制,恢复现场的PSW和PC,把CPU状态字切回用户态。整个过程在下一节的中断处理流程里会完整出现。
提示:做题时只要看到“用户态切换到内核态的唯一途径”,就选“中断/异常/陷入”;看到“唯一途径是系统调用”,直接判错。
5. 1.3.2节中断与异常:为什么分类题总做错,以及处理流程的套路
5.1 先分清“中断”和“异常”这对名字
在考研教材里,广义的中断包括外中断和内中断。外中断通常直接叫“中断”,内中断也叫“异常”。
我建议用三个维度区分:
- 看来源:外中断来自CPU外部,比如I/O设备完成信号、时钟脉冲;内中断来自CPU内部,是执行指令时发现的问题。
- 看是否异步:外中断是异步的,它随时可能来,跟当前执行的指令没有固定关系;内中断是同步的,由某条具体指令触发,同样的条件下可以复现。
- 看是否可屏蔽:外中断里有可屏蔽中断(INTR)和不可屏蔽中断(NMI);内中断一般不可屏蔽,因为它是CPU自身运行状态的直接反应。
内中断还能再细分三类:
- 陷入(trap):用户程序主动请求,最具代表性的是系统调用。它是有意为之,相当于主动按铃。
- 故障(fault):程序执行中出现的可修复问题,比如缺页、除零、非法操作码。CPU转入内核处理后,如果修复成功就继续执行,修复不了就终止进程。
- 终止(abort):不可修复的严重错误,比如硬件故障、CRC校验错,只能终止进程。
这里要特别强调:缺页是故障,属于内中断,不是外中断。很多同学看到“缺页”里带个“页”字,就以为和磁盘有关,想当然归成外中断,每年都有人丢分。
5.2 分类题的实战判断顺序
我的做题方法是三步走。第一步,看信号来自CPU外部还是内部,外部一律归外中断。第二步,内部信号里,用户主动按铃的是陷入,被动发现错误的是故障或终止。第三步,判断程序能不能修复:能修复是故障,不能修复是终止。
把常见考点整理成表:
| 事件 | 类型 | 关键理由 |
|---|---|---|
| I/O完成 | 外中断 | 来自设备,异步,可屏蔽 |
| 时钟中断 | 外中断 | 来自定时器,异步 |
| 电源掉电 | 外中断(NMI) | 不可屏蔽,必须立即处理 |
| 系统调用 | 内中断(陷入) | 用户主动请求内核服务 |
| 除零 | 内中断(故障) | 指令执行时错误 |
| 缺页 | 内中断(故障) | 可修复,处理完重新执行指令 |
| 非法指令 | 内中断(故障) | 可捕获并终止进程 |
| 校验错/硬件故障 | 内中断(终止) | 不可修复 |
这张表如果能自己默写出来,1.3.2的选择题基本稳了。
5.3 中断处理流程:顺序不能被口糊
中断处理流程王道教材一般写为:关中断、保存现场、中断服务程序、恢复现场、开中断、中断返回。
为什么要先关中断?因为中断处理过程本身不能再被另一个中断打断,否则现场一团乱。高优先级中断可以打断低优先级处理,这属于中断优先级和中断嵌套,第一章先不用展开。保存现场保存的是程序状态字PSW、程序计数器PC,可能还包括通用寄存器,这些数据压入内核栈。执行完服务程序后,从栈里恢复现场,再开中断,最后通过中断返回指令回到用户态继续执行。
选择题喜欢考顺序,比如“中断处理的第一步是什么”,答案是关中断。也有题问“哪一项不是中断处理必需的环节”,比如“检查时间片是否用完”这种就不算。
5.4 为什么说中断是并发的基础
操作系统能实现并发,全依赖中断赋予它“控制权回收”的能力。设想没有中断,一个死循环程序就能永久霸占CPU,操作系统永远等不到机会介入。有了时钟中断,操作系统每过一个时间片就被唤醒一次,强制切换进程——这是分时和并发的前提。有了I/O中断,进程等待的磁盘数据一到,OS马上知道并唤醒它——这是资源共享和异步机制成立的基础。所以1.1.2的并发、共享、异步,最终都指向1.3.2的中断机制。
6. 1.3.3节系统调用:它和普通函数调用的本质差别,以及完整调用路径
6.1 库函数与系统调用:别用“用了库函数就是系统调用”来理解
系统调用是操作系统提供给用户的程序接口,是运行在用户态的程序请求内核服务的正规方式。很多人以为“库函数就是系统调用”,这是错的。库函数是运行库提供的封装,可能在内部调用系统调用,也可能完全不调用。
拿C语言举例:printf是库函数,它内部会调用write系统调用把数据输出;malloc分配大块内存时可能调用brk或mmap,但malloc本身是库函数;strlen、strcmp、memcpy这些字符串和内存操作纯在用户态完成,不触发系统调用。所以判断标准不是“它是不是库函数”,而是“它是否请求了内核服务”。
经典选择题里,read、write、open、close、fork、exit、getpid一般算系统调用;printf、scanf、strlen不算。注意,printf在真正执行时底层会触发write,但题目问“下列哪个是系统调用”时,通常不会把printf作为正确选项。
6.2 调用路径拆成七步
一次系统调用的完整旅程大致是这样:
- 用户程序把系统调用号和参数准备好,放入寄存器或内存指定位置。
- 执行陷入指令(访管指令)。这是用户态程序请求进入内核态的方式。
- CPU切换到内核态,保存用户程序现场。
- 内核根据系统调用号查系统调用表,找到对应的内核处理函数。
- 在内核态执行真正的服务程序,比如读写文件、创建进程、分配内存。
- 把结果写入返回值寄存器或指定内存位置。
- 恢复现场,切回用户态,程序继续执行下一条指令。
这里有个易错点:陷入指令本身不是特权指令,它能在用户态执行。真正在内核态执行的是特权操作。陷入指令的作用是主动触发一次异常,把CPU带进内核态。
Linux里常见的系统调用有read、write、open、close、fork、exit、wait、mmap,这些在第四章进程管理之后会反复出现。现在不用硬记,但要建立意识:每一个进程管理操作、每一个文件读写,背后几乎都对应一个系统调用。
6.3 参数传递的三种方式
系统调用需要把参数从用户态传给内核,有三种常用方式:
- 寄存器传参:把参数直接放进寄存器,简单快速,适合参数较少的情况。
- 内存块传参:参数很多时,先放在用户内存的一个表或结构体里,再把表地址传给内核。大数据量I/O场景很常见。
- 栈传参:通过用户栈压栈传递,内核从栈里取参数。
选择题如果考“系统调用怎么传参”,这三种方式都能选。实际Linux里往往混合使用:普通参数放寄存器,大规模数据传地址。
6.4 为什么系统调用开销远大于普通函数调用
普通函数调用就是一条call指令、压栈、跳转、返回,全程留在用户态。系统调用则有明显额外成本:执行陷入指令,CPU要从用户态切到内核态,要保存和恢复完整现场,要查系统调用表,还可能涉及上下文切换。所以系统调用虽然安全、功能强大,但不能当普通函数频繁使用。这也是为什么很多高性能程序会把多次小规模I/O合并成一次大块I/O,目的就是减少系统调用次数。
7. 把1.1.1~1.3.3串成考场得分能力:典型题解法与后续复习衔接
7.1 第一章选题最容易出题的位置
把整章考点压缩成一张清单,平时复习按着自检:
- 操作系统的定义里,“接口”指用户和硬件之间的接口;命令接口和程序接口要分清。
- 并发和并行:一个看时间间隔,一个看时间点;单核只能并发。
- 互斥共享和同时访问的区分,“同时访问”不等于同一瞬间同址访问同一数据。
- 四个特征之间的逻辑链:并发和共享互为条件,虚拟与异步是产物。
- 发展史:多道批处理无交互性、分时系统强交互、实时系统保可靠。
- 特权指令判断:I/O、停机、关中断、改PSW是特权;算术运算和访管指令不是。
- 中断异常分类表:缺页是故障,系统调用是陷入,I/O完成是外中断。
- 用户态到内核态的唯一路径是广义中断,不是只有系统调用。
- 中断处理流程的第一步是关中断。
- 系统调用vs库函数:printf是库函数,write是系统调用。
这些点几乎每一条都能在真题或模拟题里找到对应选项。我建议把它们抄成卡片,零散时间刷一遍,比反复翻教材效率高得多。
7.2 简答题想拿满分,关键是“框架完整再补血”
很多同学答简答题喜欢想到哪写到哪,分数低不是因为不会,而是漏了要点。操作系统阅卷通常按点给分,所以要先写框架。
以“简述操作系统的特征及相互关系”为例,标准答题结构:
第一层,写出操作系统的四个特征:并发、共享、虚拟、异步。
第二层,分别用一句话定义每个特征。
第三层,指出并发和共享互为存在条件,虚拟和异步是引申结果。
第四层,有余力就补一个具体例子,比如CPU时分复用实现虚拟处理器。
这样答出来,即使定义写得不完美,框架也拿到了大半分数。第一章简答题虽然不多,但“特征及关系”“为什么要分用户态和内核态”“系统调用过程”是反复出现的考点,值得提前写好标准模板。
7.3 这讲学完,应该能自问自答的三个问题
学完1.1.1到1.3.3,可以拿这三个问题自测:
- 操作系统在计算机系统中的位置和角色是什么?——覆盖裸机的第一层系统软件,既是资源管理者,又是用户接口。
- 为什么中断是并发得以实现的基础?——没有中断,操作系统永远无法夺回CPU,无法切换进程。
- 从用户态进入内核态的路径有哪些?——外中断、异常(含系统调用),三者广义上都是中断。
这三个问题能用自己的话讲明白,这一讲就算过关,可以放心进入第二章进程管理了。第二章的进程概念、状态转换、调度算法,本质上都是在第一章的运行机制和中断机制之上盖楼。
7.4 一个个人经验
二刷这一讲时,我干过一件蠢事:把发展史的时间节点背得滚瓜烂熟,结果考到“多道批处理系统的缺点”,反而愣住了。后来我总结出规律:第一章凡是能回答“为什么”的内容,都不需要硬背;必须背的,基本只有定义和分类。所以复习策略应该是“理解推导为主,表格整理为辅”。中断异常分类表、发展阶段对比表、特征关系链,这三张表做完,比把教材抄三遍都管用。
最后再分享一个小技巧:做题遇到“下列哪项不是操作系统特征”,先想“并发、共享、虚拟、异步”,再逐项排除;遇到“用户态不能执行哪条指令”,先判断这条指令是否影响全局。这套思路在后续进程、内存章节同样适用。