# 操作系统基本概念与发展历程 > 本文出自 CodeBrick 408 操作系统讲义,原文:https://www.codebrick.tech/os-blog/posts/overview/os-concept > 这是供 AI 阅读的纯文本版:公式为 LaTeX,流程图为 mermaid 源码,原文中的折叠内容已全部展开。 > 讲解或引用本文内容时,请一并给出上面的原文链接。 > 2026 大纲 **一(一)操作系统的基本概念** 与 **一(二)操作系统发展历程**。 ## 一台机器,很多程序,谁来做主 一台计算机只有一套硬件:一个(或几个)CPU、一块内存、若干设备。可要跑的程序有很多。 如果让程序自己去抢,结果是可以预见的——两个程序同时往同一段内存写、同时对打印机发指令、 一个程序算得起劲就再也不撒手。**必须有一个东西站在硬件和程序之间,替所有程序做主。** 这个东西就是操作系统。 它站在中间,就同时被两边要求。硬件那边要求它**把资源分配得别浪费**, 程序那边要求它**把硬件的麻烦挡住、给个好用的接口**。这两条要求各自往下长, 就长出了这门课的全部内容。 整门课的问题是一层层被逼出来的,先把这条链摆出来,后面每一章都挂在它上面: 一个 CPU 要被很多程序用,于是需要「运行中的程序」这个对象,需要切换它、需要决定先给谁—— 这是**进程管理**。程序一旦能被切换,它们就会在共享的东西上互相踩,于是要有同步互斥; 互相等着对方手里的东西,就会卡死,于是要处理死锁。程序还要装进内存才能跑, 连着放会把内存切得七零八落,切块放又要解决地址怎么翻译,内存终究还是不够用—— 这是**内存管理**。数据得在断电之后还在,还得让人按名字找得到,还得知道盘上哪里是空的—— 这是**文件管理**。设备又慢又杂,CPU 用什么姿势去等它、怎么把速度差抹平—— 这是 **I/O 管理**。 而本章是这条链的起点:**先讲清 OS 是什么、凭什么能做主**(它有硬件给的特权), **用户怎么向它求助**(中断与系统调用),**一个程序是怎么变成能跑的东西的**(链接、装入、内存映像), **以及这套东西自己是怎么起来的**(结构、引导、虚拟机)。 ## 一、定义、身份与功能 操作系统是**一组能有效地组织和管理计算机硬件和软件资源、合理地对各类作业进行调度、 以及方便用户使用的程序的集合**。定义里的三个动词恰好对应它的三个身份。 **资源管理者**,管处理器、存储器、I/O 设备和文件。缺了它,多道程序会互相踩踏: 抢 CPU、覆盖内存、争设备——上面那三句"可以预见的结果"就是缺了它的样子。 **用户接口**,提供命令接口、程序接口(系统调用)和 GUI。缺了它,用户只能对着裸机写机器码。 **扩充机器**(也叫虚拟机器),把裸机接口**抬高一层**。这个身份最容易被当成一句空话, 所以要说清它扩充的到底是什么——**扩充的是接口的抽象层次**。裸机只提供**指令级**接口: 向某个端口写一个字节,然后循环读状态位直到它变成 1。OS 包了一层之后, 向上提供的是**系统调用级**接口:打开文件、读 100 字节。 $$ \text{裸机:指令级接口} \xrightarrow{\ \text{OS 包了一层}\ } \text{虚拟机器:系统调用级接口} $$ 结果是两条:复杂度被吸收,设备差异被抹平。所谓"虚拟机器", 说的就是"在用户看来,这台机器好像天生就能直接执行 `read`/`write` 这类操作"。 四大功能则对应四类资源,这张对应关系的组织逻辑很简单——**有几类资源就有几个功能**: | 功能 | 管理对象 | 典型机制 | |---|---|---| | 处理器管理 | CPU | 进程调度、进程同步与互斥 | | 存储器管理 | 内存 | 地址映射、内存分配与回收、内存保护、虚拟内存 | | 设备管理 | I/O 设备 | 缓冲管理、设备分配、设备处理(驱动程序)、虚拟设备 | | 文件管理 | 文件 | 目录管理、存储空间管理、文件保护 | ## 二、四个特征:从并发一路推下去 并发、共享、虚拟、异步这四个特征,**不是并列的四条,而是一条推导链**。 按链去理解,四条都不用背。 **并发是起点。** 多道程序同时驻留内存、交替执行,那它们就必须共用这一台机器的 CPU、内存和设备,于是**共享**成为必然。反过来看也成立:若资源根本不能被共享 (比如内存只能整块给一个程序),多道程序就装不进来,并发也就无从谈起。 **所以并发与共享互为存在条件,是四个特征里最基本的两个。** 后两条只有在并发与共享之上才谈得上。只有当一份物理资源被多个程序分着用, 才有必要让每个程序"以为"自己独占了一份,这是**虚拟**;只有当多个程序抢同一批资源、 走走停停,推进速度才会变得不可预知,这是**异步**。 ### 并发与并行的分界:看的是时间段还是时刻 这是本节最容易被记成半句话的地方。**并发**是同一**时间段**内交替执行, 宏观上同时推进、微观上轮流占用,**单核完全做得到**;**并行**是同一**时刻**真的同时在动。 所以"单核不能并发"是错的——单核不能的是让**两个进程**并行。 要紧的是后半句:**"并行必须多核"这句话也是错的**。多核是让**多个进程**真正同时执行的条件, 但并行的主体不止进程。单核机器上,CPU 在算,同时 DMA 控制器(或通道)正把数据从磁盘搬进内存, 这两件事**在同一时刻真的都在动**,这就是并行。多道程序设计之所以能提高 CPU 利用率, 靠的正是这一点——如果 CPU 和外设不能真正同时工作,"一道去做 I/O、另一道占着 CPU" 根本无从发生。 一句话收口:**并行不要求多核,要求的是同一时刻有两个执行部件真在动**; 多核只是"进程之间也能并行"的条件。 ### 虚拟只有两种复用方式 判据是**被切分的维度是时间还是空间**。**时分复用**把一份资源在时间上切成片轮流给, 虚拟处理器、SPOOLing 虚拟出来的打印机都是;**空分复用**把一份资源在空间上切成块分着占, 虚拟存储器、磁盘分区都是。 CPU **只能时分**——它无法被劈成两半同时执行两个进程。判断题里"虚拟处理器是空分复用"这类说法,就是拿它做的文章。 ### 异步的分量不在"速度不确定" 异步只是**现象**:进程以不可预知的速度向前推进。它真正的分量在于逼出一条底线—— 不论各进程实际以什么速度推进,**只要输入相同,计算结果就必须相同**, 这叫结果的**可再现性**。 只要程序之间存在未加保护的共享变量,异步就会把可再现性破坏掉。 [同步与互斥](/posts/process/sync-mutex-concept)那一整章存在的理由,就是守住这条底线。 ### 共享的两种方式 判据是**同一时刻是否允许第二个进程持有**。不允许是**互斥共享**,打印机是典型; 允许是**同时共享**,磁盘文件是典型。要注意"同时"是宏观口径,微观上仍可能是交替访问的。 ## 三、发展历程:每一代都被上一代的具体矛盾逼出来 这一节的价值不在于记住五个阶段的名字,而在于记住把它们推着往前走的那几条矛盾。 ```mermaid flowchart TD A["人工操作方式
用户独占全机;装带卸带时 CPU 空闲"] -->|"矛盾①:人机矛盾
矛盾②:CPU 与 I/O 速度不匹配"| B["脱机 I/O + 单道批处理
用监督程序让作业一个接一个自动运行"] B -->|"解决了:作业间的人工等待
没解决:内存中只有一道程序,
它一发 I/O,CPU 就干等"| C["多道批处理
多道程序同时驻留内存交替执行
中断与通道让 CPU 与 I/O 重叠"] C -->|"解决了:CPU 利用率与吞吐量
新问题:作业排队等待,周转时间长
且提交后完全无法干预"| D["分时系统
多终端 + 时间片轮转
换来人机交互能力"] D -->|"分时只保证「平均够快」
不保证任何一次响应的最坏时限"| E["实时系统
截止时间为第一目标
抢占式优先级调度"] ``` 图上说不清的补三处。 **脱机 I/O** 是先用外围机把纸带内容转到磁带上,主机再从高速磁带读入。好处有两条: 装带卸带不占用主机时间,且从磁带读入比从纸带快得多。**单道批处理还浪费内存**—— 为了能装下大作业配了大内存,可八成以上的作业都是中小型的。 **多道程序设计**指把多个作业同时调入内存共享资源,一道因 I/O 暂停就把 CPU 转去执行另一道。 它需要两项硬件技术才成立:**中断**,I/O 完成时主动通知 CPU,CPU 才不必轮询; **通道**,I/O 传输由通道独立完成,不占 CPU。**"中断与通道使 CPU 和 I/O 得以重叠" 就是多道程序的物理基础**,也正是上一节说的"单核上的并行"。它同时带来一张新问题清单: 处理机争用、内存分配与保护、I/O 设备分配、文件组织管理、作业管理、用户接口—— **现代操作系统的几乎全部主题都是从这张清单上长出来的**,本文开头那条链就是它。 **分时的动力与多道批处理完全不同**。后者是为了提高资源利用率和吞吐量; 前者是为了满足人机交互的需求——程序员写完新程序要上机调试,希望像早期一样独占全机 并直接控制它,而计算机昂贵又必须让很多人共享。分时用"每个人都稍微慢一点" 换来了"每个人都能随时插话"。 分时与实时的差别不在快慢,而在**优化的是平均值还是最坏值**: | 比较 | 分时系统 | 实时系统 | |---|---|---| | 设计目标 | 交互性好 | 在**截止时间**前响应 | | 核心指标 | 平均响应时间 | **最坏响应时间** | | 调度方式 | 时间片轮转 | 抢占式优先级调度(软实时可非抢占) | | 分类 | — | **硬实时**(超时不可接受,如导弹控制)/ **软实时**(偶尔超时可接受,如视频播放) | 有两处常被记反。**实时并非都用抢占式**:硬实时几乎必须抢占,软实时可以非抢占。 **分时的时间片并非越短越好**:太短则切换开销吃掉有效时间。 ## 四、多道程序:收益、代价,以及那个临界点 多道程序的四条性质是成对出现的,收益和代价来自同一个机制——排队与切换。 | | 具体表现 | 由什么带来 | |---|---|---| | **资源利用率高** | CPU 保持忙碌,内存与 I/O 设备利用率也提高 | 一道阻塞就切另一道,空档被填上 | | **系统吞吐量大** | 单位时间完成的作业变多 | CPU 与其他资源始终保持忙碌 | | **平均周转时间长** | 作业要排队依次处理,可能要几小时甚至几天 | 同样是"排队等待"这一机制的反面 | | **无交互能力** | 作业一旦提交直到完成都无法干预,改错调试极不方便 | 批处理没有终端这条回路 | 这里要钉死两处容易想反的。 **多道程序不加快任何单个作业。** 它只是把 CPU 原本空转的时间填给别的作业—— 分子(CPU 忙的时间)不变,分母(总时间)变小,利用率因此提高。 单个作业的周转时间不但没缩短,通常还变长了。 **多道程序的系统开销比单道大,而且大得多。** 进程切换、内存隔离、调度、同步互斥 都是单道不需要的成本。多道是**用额外的开销换利用率和吞吐量**——开销变大是代价, 不是优点。把"多道高效"顺手理解成"多道开销小",是这一节最反直觉的错法。 ### 临界点:进程数越多,利用率并不是越高 "一个进程等 I/O 时让另一个跑,所以进程越多利用率越高"——这句话只在曲线的上升段成立。 进程偏少时,每多一个进程都能填补一段 I/O 等待的空闲,利用率上升;到适中时接近峰值; 一旦**超过内存的承载能力**,利用率就开始**下降**:切换开销暴涨、内存装不下各进程的工作集、 缺页率飙升,最终进入**抖动**(thrashing)。抖动状态下 CPU 几乎全在等页面换入换出, 真正干活的时间反而越来越少。 "越多越高"错在把上升段当成了全部。这条曲线在[虚拟存储性能与改进](/posts/memory/virtual-memory-perf) 里会再出现一次,那时它有了名字和量化模型。 ### 多道下的时间怎么算:先找瓶颈资源 多道程序的时间计算题有两种问法,用的判据不一样。 **问 CPU 利用率**,排一条时间线,看 CPU 有几段是空的。 **〔原文中此段为可折叠内容〕两道作业在单道与多道下的完整时间线:利用率到底提高了多少(想看清哪一段真的重叠上了、哪一段 CPU 还空着时展开)** 两道作业,每道的执行序列都是「CPU 计算 20 ms → I/O 操作 40 ms → CPU 计算 10 ms」, 单 CPU,两道作业使用**各自独立的 I/O 设备**(互不争用),忽略切换开销。 **单道。** 内存中只有一道作业,作业 1 全部做完才轮到作业 2,不存在任何重叠的可能: 总时间 $=(20+40+10)\times 2=\textbf{140 ms}$。CPU 只在计算阶段忙:$(20+10)\times 2=60$ ms, 利用率 $=60/140=\textbf{42.9\%}$。I/O 期间 CPU 完全空转——这正是单道批处理的病根。 **多道。** 收益全部来自"一道在 I/O 时另一道占着 CPU",而重叠能发生多少取决于 两道作业各阶段的时长关系,所以必须排时间线,直接套公式会把两段空闲漏掉: | 时刻(ms) | CPU 在做 | 各作业状态 | |---|---|---| | 0 – 20 | 作业 1 计算 | 作业 2 就绪等 CPU | | 20 – 40 | **作业 2 计算** | 作业 1 转入 I/O(20–60) | | 40 – 60 | **空闲** | 作业 1 在 I/O,作业 2 也转入 I/O(40–80) | | 60 – 70 | 作业 1 第二段计算 | 作业 1 的 I/O 于 60 完成 | | 70 – 80 | **空闲** | 作业 1 已结束,作业 2 仍在 I/O | | 80 – 90 | 作业 2 第二段计算 | 作业 2 的 I/O 于 80 完成 | 总时间 $=\textbf{90 ms}$;CPU 忙的总时间没变,仍是 60 ms(作业的计算量不会因为并发而减少), 利用率 $=60/90=\textbf{66.7\%}$。 **对照**:总时间 140 → 90 ms,利用率 42.9% → 66.7%。收益完全来自 20–40 这一段重叠, 而这段重叠靠的正是中断与通道。若把作业数增加到三道、四道,空闲段会被进一步填满—— 这就是"多道"里那个"多"字的意义。 **问几个作业最少要多久跑完**,判据换成另一条:**先找出最忙的那种资源**。 每种资源各只有一台时,同一种资源上的各作业阶段必须串行,所以 $$ \text{最少总时间} = (\text{首个作业到达瓶颈资源的时刻}) + (\text{瓶颈资源被占用的总时长}) $$ 比如三个作业都按"输入 2 ms → 计算 3 ms → 输出 4 ms"的顺序走,输入设备、CPU、 输出设备各一台。输出设备最忙,$3\times 4=12$ ms,而第一个作业要到 $2+3=5$ ms 才可能开始输出,故最少 $5+12=17$ ms。 这里最容易犯的两种错:把它当成完全串行,算成 $3\times(2+3+4)=27$; 或者当成完全并行,算出 $9$ 这种忽略了设备只有一台的下界。 ## 考点速记 1. OS 扮演**资源管理者、用户接口、扩充机器**三个身份;"扩充机器"扩充的是**接口的抽象层次**——把指令级接口抬高到系统调用级。四大功能对应四类资源。 2. 四个特征是一条链:**并发与共享互为存在条件、最为基本**,虚拟与异步建立在它们之上。虚拟只有**时分/空分**两种复用方式且 CPU 只能时分;异步的底线是**结果的可再现性**。 3. **并发看时间段、并行看时刻**;单核能并发,也能并行——**CPU 与外设经 DMA/通道同时工作就是并行**,多核只是"进程之间也能并行"的条件。 4. 发展历程被矛盾推着走:人工操作(CPU 与 I/O 速度不匹配)→ 单道批处理(**监督程序**,但一道 I/O 就空转)→ 多道批处理(**中断 + 通道**换来利用率,代价是周转长、无交互)→ 分时(**时间片**换来交互,只保证平均够快)→ 实时(以**截止时间**为第一目标)。 5. 多道**用开销换利用率**:开销比单道**大**,单个作业不会变快,且进程数超过内存承载力后利用率**转而下降**(抖动)。 **这一节在真题里被考过的形式**: 这一节年年有题,且**几乎全部落在"概念的边界"上**——没有一道是问定义本身的, 问的都是"这句话在什么条件下不成立"。 - **判断多任务操作系统的三条叙述**(2018-23)。答**并发并行都有 + 需要保护共享资源,但不需要多 CPU**。这道题是"并行必须多核"这个说法的直接反例:单核靠时间片轮转就能多任务,而**单核 + 外设本来就能并行**。⚠️ 如果按"并行=多核"去判,第一条会被判错,整题就错了。 - **判断多道程序系统的四条叙述,选不正确的**(2022-23)。错项是**"进程数越多 CPU 利用率越高"**——越过内存承载力后会抖动,利用率下降。另三条都对,其中"不必支持虚拟存储管理"值得留意:早期多道批处理用固定/动态分区就能跑,**虚存是可选不是前提**。 - **比较单道与多道,挑出多道的优点**(2017-28)。答 CPU 利用率高、吞吐量大、I/O 设备利用率高三条;**"系统开销小"是错的**,多道的开销反而更大。这道题就是"用开销换利用率"这句话的选择题版本。 - **判断批处理系统的三条叙述**(2016-23)。答**分单道/多道 + 中断技术使 CPU 与 I/O 并行**两条成立;**"允许多个用户与计算机直接交互"不成立**,交互是分时系统的特征。⚠️ 这道题把中断和批处理放在一起考,若把中断当成 I/O 章的孤立知识点就会漏判。 - **算三个作业最少多久跑完**(2016-24)。输入/输出设备各一台,答 **17 ms**。用瓶颈资源公式:输出设备最忙共 12 ms,首作业 5 ms 时才到得了它,$5+12=17$。四个选项恰好把三种错法摆齐——27 是完全串行,15 与 22 是漏算了设备只有一台造成的串行。 **复习优先级**:这一节**必须拿满**,它是全科唯一一处"只考概念边界"的地方, 性价比极高。把上面五条速记里带⚠️的边界背清楚,选择题基本不会失分; 计算题只有瓶颈资源一个模型。 > **易错**:说"并行必须多核"。多核是**进程间**并行的条件;单核上 CPU 与外设(DMA/通道)同时工作已经是并行了。2018-23 的第一条就靠这一点。 > **易错**:说"进程数越多 CPU 利用率越高"。超过内存承载力后会抖动,利用率转而下降。 > **易错**:把"多道高效"理解成"多道开销小"。多道是用**更大的开销**换利用率和吞吐量。 > **易错**:认为多道程序能让单个作业跑得更快。它只填 CPU 的空档,单个作业的周转时间通常还变长。 > **易错**:认为多道程序必须有虚拟存储支持。早期多道批处理用固定/动态分区即可,虚存是可选项。 > **易错**:算多作业最少时间时按 $n\times(\text{各阶段之和})$ 算。那是单道的答案;多道要先找瓶颈资源。 > **易错**:认为 CPU 可以空分复用。CPU 只能时分——它没法劈成两半同时执行两个进程。 **〔原文中此段为可折叠内容〕教材出处** - 汤小丹《计算机操作系统》**1.2.1 未配置操作系统的计算机系统**(p5~p6):人工操作方式的两个缺点(用户独占全机、CPU 等待人工操作),以及"CPU 的速度在迅速提高,但 I/O 设备的速度却提高缓慢,这使 CPU 与 I/O 设备之间速度不匹配的矛盾更加突出";脱机 I/O 方式的两个优点。 - 同书 **1.2.2 单道批处理系统**(p6~p7):监督程序使作业一个接一个连续处理;"在内存中始终只保持一道作业";缺点是"每逢该程序在运行中发出 I/O 请求后,CPU 便处于等待状态"。 - 同书 **1.2.3 多道批处理系统**(p7~p8):多道程序设计的基本概念(多道作业调入内存共享资源、利用一道程序 I/O 的空档执行另一道);四条优缺点(资源利用率高、吞吐量大、**平均周转时间长**、**无交互能力**);以及多道批处理必须解决的六类问题,并由此给出操作系统的定义。 - 同书 **1.2.4 分时系统**(p8):"推动多道批处理系统形成和发展的主要动力是提高资源利用率和系统吞吐量,那么,推动分时系统形成和发展的主要动力,则是为了满足用户对人—机交互的需求。" ## 相关知识 [CPU运行模式(内核态与用户态)](/posts/overview/cpu-mode)|[操作系统结构](/posts/overview/os-structure)|[同步与互斥的基本概念](/posts/process/sync-mutex-concept) ## 真题练习 ## 本节对应的历年 408 真题 - 2016 年第 23 题:https://www.codebrick.tech/practice/q/os-2016-23 - 2016 年第 24 题:https://www.codebrick.tech/practice/q/os-2016-24 - 2017 年第 28 题:https://www.codebrick.tech/practice/q/os-2017-28 - 2018 年第 23 题:https://www.codebrick.tech/practice/q/os-2018-23 - 2022 年第 23 题:https://www.codebrick.tech/practice/q/os-2022-23