我最初啃《计算机操作系统》第一章操作系统引论时其实没有太大感觉。当时觉得这就是一堆概念并发、共享、虚拟、异步操作系统的发展历程从人工操作、批处理到分时系统背一背就过去了。直到学期末做课程设计被进程同步和虚拟内存折腾到怀疑人生再回头翻这章笔记才发现自己当初遗漏了太多关键线索。这份学习笔记就是想帮你把引论读厚。它不是概念的罗列而是整个操作系统的骨架操作系统解决什么问题、设计者做过哪些取舍、为什么今天的系统长成这个样子。无论你是正在准备考试还是刚接触操作系统想自学把这一章吃透后面的进程管理、内存管理、文件系统学起来都会顺畅得多。这篇文章会按我自己整理笔记的思路展开重点放在为什么上而不是单纯给你划考点。1. 在学完操作系统之后我为什么还要回头看第一章1.1 最初学引论一头扎进名词里丢了主线很多教材把第一章安排得比较友好先从概念说起然后讲操作系统的发展、特征、功能、结构。于是大家很容易陷入一种状态——每个名词都认识合在一起又说不出操作系统到底在干什么。我一开始也是这样。我当时的笔记里写满了操作系统是管理计算机硬件与软件资源的系统软件也标出了并发共享虚拟异步四大特征还能背出资源管理是核心功能。但如果你问我一个用户点开某个程序操作系统在中间到底做了哪些事我基本上回答不上来。问题出在哪里出在我把引论当成了考点清单而不是全局地图。引论里最关键的东西不是那些定义本身而是定义背后隐含的分析框架。操作系统不是平白无故出现的一层软件它出现的原因、它承担的矛盾、它不断演进的动力全部埋在这一章里。1.2 回头复盘时看到的骨架学完进程管理、内存管理、设备管理、文件系统之后再回头看我发现第一章节的几乎每个小标题都对应着后面某一章的灵魂问题操作系统的发展历史对应的是一台计算机从每次只能跑一个程序到同时跑很多程序的演进过程。批处理系统解决的是效率问题分时系统解决的是交互问题实时系统解决的是确定性响应问题。四大特征中的并发后面章节里直接表现为进程、线程、同步互斥机制共享对应资源分配与互斥访问虚拟对应虚拟内存、虚拟处理器异步对应进程状态转换和调度。操作系统的功能说白了就是管理四类资源处理器、内存、外部设备、文件信息。每一类资源的管理方式都是后面教材里至少一章的内容。内核态与用户态的划分、系统调用的存在是理解应用程序怎么使用操作系统能力的钥匙。所以我的建议是第一遍学引论可以快点过但一定要带着这里会对应后面哪一章的意识去读。学完后面章节之后再回来补一遍引论。两遍下来整个操作系统的体系就串起来了。1.3 这份笔记适合谁看这份笔记主要给两类人第一类是正在学《计算机操作系统》课程的学生。你可能觉得第一章内容简单但我会在笔记里把容易被忽略的细节逐个展开比如中断的分类、系统调用的执行流程、多道程序设计与并发的关系。第二类是自学操作系统的初学者。操作系统教材普遍比较厚直接上手容易迷路。这份笔记相当于一个地图导读帮你先把全局轮廓画出来再决定后续往哪个方向深入。如果你已经把操作系统学过一遍这份笔记也适合用来做复盘对照——看看你当初学第一章节时有没有和我一样漏掉关键思路。2. 从管理硬件到服务应用引论里藏着整门课的骨架2.1 分层视角为什么计算机需要操作系统这一层要理解操作系统先要理解一个底层矛盾硬件资源非常笨且稀缺而应用程序的需求非常花哨且多样。CPU只会执行指令内存只知道地址磁盘只知道读写扇区网卡只知道收发数据帧。应用程序呢它希望自己独占CPU希望内存大得像无限希望文件读写像在内存里操作一样快希望多个任务同时进行。如果让每个应用程序都直接面对硬件那每个程序都要自己处理CPU调度、内存布局、设备驱动、文件格式复杂度直接爆炸。操作系统就是夹在硬件和应用之间的一层协调者。它向上给应用程序提供简洁、统一、抽象的服务向下对硬件进行复杂的管理和调度。这句话听起来很抽象我用一个生活类比来解释。假设你是一个租客硬件就是这栋楼的水管、电路、电梯、燃气系统。你没有能力也不应该自己接管整栋楼的设施你的需求是开灯、用水、坐电梯。操作系统就是物业物业负责维护电梯、检修电路、处理水管爆裂你只需要按开关不需要懂楼宇电路图。更重要的是如果所有人都同时开大功率电器物业要保证总闸不跳这就是资源分配和冲突协调。2.2 操作系统的目标方便性、有效性、可扩展性与安全教材上通常会写操作系统的四个目标方便性、有效性、可扩展性、开放性。我用自己的话翻译一下方便性用户不用懂汇编、不用手动安排磁带和内存直接用高级语言、图形界面就能操作计算机。有效性两个角度——让CPU、内存、磁盘尽量不空闲让系统整体吞吐量更高。多道程序设计就是为了系统效率。可扩展性操作系统的功能不是一刀切死。今天能加一个文件系统驱动明天能支持一种新的设备后天能扩展新服务这些都依赖于架构的灵活性。开放性采用标准接口和协议让不同厂商的硬件、软件能协同工作。这四个目标里方便性和有效性往往存在矛盾。给用户更多方便通常需要系统做更多隐藏工作消耗更多资源而为了有效性又必须对用户行为做限制。操作系统的很多设计决策本质上是这对矛盾的平衡。提示学引论时不用死记“四大目标”但要能用自己的话解释为什么操作系统不是单纯变快而是追求方便与效率的平衡。考试题里出现为什么需要操作系统这类简答题答案的核心逻辑就在这里。2.3 资源管理者的身份五种核心资源如果给操作系统一个最小描述我认为是操作系统是计算机系统的资源管理者。它会管理以下五类资源处理器CPU资源决定哪个进程获得CPU、运行多久、何时切换。存储器资源内存的分配与回收、地址映射、内存保护、虚拟内存扩展。设备资源键盘、鼠标、显示器、磁盘、网卡的驱动、分配、调度。文件信息资源文件的组织、存储、共享、保护。用户与作业信息把用户的作业组织成系统中的进程并安排执行。有人会问用户与作业信息也算资源吗我的理解是从系统管理的角度看每个用户请求、每个作业都是需要操作系统维护状态的活动实体所以操作系统数据库、进程控制块、文件描述符等就都算这一类管理的物化表现。你可以把操作系统想象成一家酒店的中央管理系统前厅管入住用户作业、工程部管水电设备和存储、客房部管房间状态内存分配、档案室管客户资料文件系统。所有部门协同工作才能让酒店平稳运行。2.4 从管硬件到服务应用的完整链路我们要把操作系统做哪些事落实到一次完整的用户请求上才算是真的把这一层逻辑读懂了。假设你在终端输入一条命令请求运行某个程序。操作系统做的事情大致是接收命令识别这是一个新的作业为它创建一个进程分配进程控制块在新进程的虚拟地址空间里加载程序代码和数据在物理内存中申请空间建立页表等映射结构为进程设置初始状态放入就绪队列当CPU被调度给这个进程时完成上下文切换让程序从头开始执行程序执行过程中如果请求读取文件就通过系统调用进入内核内核访问文件系统、查询权限、操作磁盘设备再把数据复制到用户空间程序运行结束操作系统回收资源更新统计信息。这条链路里的每个环节几乎都对应着后续章节的一个主题。把引论中的资源管理落到这条链路上你后续学任何一章都会有目标感。3. 发展历程不是考背时间线四个阶段决定了操作系统的设计取舍3.1 手写时代与早期批处理效率压力的起点最早期的计算机没有操作系统。用户使用计算机的时候要先在纸带上打孔然后把纸带交给操作员由操作员把任务装入计算机。下一个用户要排队等待计算机在任务切换时完全空闲。这就是人工操作方式。它的致命缺陷有两点一是用户独占全机资源利用率低到令人发指二是CPU经常空闲人机交互速度远远赶不上机器速度。算一笔简单的账如果一次任务的人工准备时间需要5分钟任务本身的执行时间只有30秒那CPU的利用率就是30 /300 30大约9%。这种状态下谈计算机性能毫无意义。于是出现了批处理技术。核心思路是把一批作业事先输入到外存磁带或磁盘然后由监控程序逐个调入内存执行。这样减少了人工干预CPU的利用率大幅提升。但早期批处理系统仍然是单道的一个作业在内存里运行运行完毕再换下一个。CPU在等待输入输出时依然会空闲下来。3.2 多道程序设计拉开并发的序幕多道程序设计的出现是整个操作系统发展史上最关键的一次飞跃。它的思路是同时把多个作业放进内存当一个作业在等待输入输出时CPU立刻切换到另一个作业运行。这背后是CPU执行速度快、I/O设备速度慢的不匹配。如果只有一个程序CPU就必须等I/O而I/O时间通常是毫秒甚至秒级别CPU空闲浪费巨大。多道程序设计让CPU在I/O等待期间抢时间处理别的任务整体资源利用率立刻提高。但多道也带来了以前不存在的问题多个程序都在内存如何隔离和共享这推动了内存管理中的地址转换和保护机制。一个程序执行到一半如何切换成另一个程序这催生了进程概念、上下文切换、调度算法。多个程序同时访问磁盘、打印机等设备如何避免冲突这产生了设备分配与I/O调度。多个程序可能访问同一份文件如何保持数据一致这引出了文件共享与同步问题。所以你会发现多道程序设计不仅仅是一种技术它创造了操作系统后续所有章节要解决的核心问题。引论里把它放在发展历程中实际上它是进入操作系统真正内核的入场券。3.3 分时系统把时间切成片人人都有独占感多道虽然提升了效率但用户和程序之间几乎没有交互。试想你在纸带时代输错一个字符可能要等半小时后打印结果才能发现再重新提交一次。这种使用方式太不友好。分时系统的核心设计思想是时间片轮转。系统把CPU时间划分成很短的片比如几十毫秒轮流分配给各个终端用户。因为轮转速度足够快每个用户都感觉自己在独占计算机。分时系统带来的设计原则直到今天都统治着通用操作系统通用性支持不同任务、交互性响应足够快、多路性多用户同时在线和独立性用户互不干扰。现代Windows、Linux、macOS本质上都属于分时系统的后裔。分时系统的时间片轮转这一个策略就同时实现了并发共享虚拟异步四大特征。你看操作系统的基本特征不是凭空列出来的它是分时系统这一具体体的属性提炼。3.4 实时系统与操作系统发展脉络梳理实时系统的目标是在确定时间内对外部事件做出响应。它分为硬实时和软实时硬实时要求在严格时限内完成处理如导弹控制、工业机器人软实时容忍偶尔的时限超限如多媒体播放、在线游戏。要理解实时系统可以把握一个对比点分时系统追求公平和吞吐量实时系统追求确定性和最短响应时间。所以实时系统通常采用优先级抢占调度而不是时间片轮转。回顾整个发展历程操作系统设计的目标发生了明显偏移阶段核心追求代表技术为后续带来的核心问题人工操作可用性纸带、按钮资源利用率低批处理资源利用率监督程序、单道人机交互缺失多道程序CPU与I/O并行利用多道批处理并发、共享、虚拟、异步分时系统交互体验时间片轮转调度算法、交互机制实时系统确定性与时序优先级抢占实时任务管理网络/分布式资源共享与协作远程调用、分布式文件通信、一致性、容错这张表是我整理笔记时自己画的。不要背时间线但一定要理解每个阶段为了解决上一个阶段暴露的问题而出现。操作系统的发展本质上是效率、公平、交互、确定性这些目标在不同场景下互相博弈的过程。我建议你自己也画一张类似的表每学完一章回来补一行比如虚拟内存为了解决什么、“文件系统为了解决什么”你会发现整门课的逻辑都串在一起。4. 并发、共享、虚拟、异步四大特征如何逐一落到功能模块4.1 并发不是同时而是交替推进教材里的提法是并发性。它指的是多个事件在同一时间间隔内发生微观上只是交替使用CPU宏观上看起来在同时进行。与之相对的是并行多个事件在同一个时刻真正同时发生需要多核处理器作为硬件基础。我当年分不清并发和并行直到用了一个厨房类比才彻底弄清一个只有一个灶台的厨房厨师先做A菜切完菜、放到锅里炖利用炖煮时间再去切B菜……这是并发因为只有一个灶头但多个菜在同一段时间内都有进展。如果厨房有两个灶头两个厨师同时炒两个菜那就是并行。并发是操作系统最重要的特征也是最难实现的特征。因为它要求操作系统能在程序执行中途暂停、保存现场、切换到另一个程序之后还能准确恢复。这种能力在后续章节里叫上下文切换而它的数据结构基础就是进程控制块。4.2 共享互斥共享与同时访问共享共享性指系统中的资源可供多个并发执行的进程共同使用。但共同使用有两种截然不同的方式互斥共享资源在一段时间内只能由一个进程使用比如打印机、磁带机。你用打印机的时候别人不能同时往同一台打印机上输出必须排队。同时访问共享资源可以从宏观上让多个进程同时访问比如磁盘文件多个进程可以各自打开文件做读操作或者访问磁盘的不同分区。要注意的是同时访问在微观上仍然是交替的只不过交替非常快用户感觉不到。共享和并发的关系是并发必然导致资源共享而资源能否被正确共享又反过来约束并发能否成功推进。如果多个进程同时抢一块内存区域没有管理机制系统就乱了。所以后面的同步互斥章节实际上是在为共享这一特征落地。4.3 虚拟把一个物理资源变成多个逻辑资源虚拟性的理解是把一个物理实体映射为多个逻辑实体或者把多个物理实体映射为一个逻辑实体。最典型的例子是虚拟存储器。物理内存只有4GB但每个进程都认为自己拥有独立的地址空间甚至每个进程的逻辑空间可以超过物理内存。这是靠页面置换、按需调页等方式实现的。另一个经典例子是虚拟处理器多道环境下每个进程都以为自己独占CPU实际上操作系统在多个进程之间快速切换让大家轮流用物理CPU。我给朋友讲虚拟性时常用共享办公室来打比方。一间办公室一个物理资源通过分配不同座位和时间段让多个团队多个逻辑使用者都觉得自己有一间专用办公室这就是虚拟。同理通过虚拟化有限硬件被放大成了看起来无限的能力操作系统的很多设计难点也从这里产生。4.4 异步多道环境下的不确定性异步性指并发进程的执行是走走停停的每个进程的运行速度不可预知。进程可能在CPU上运行10毫秒也可能在等待I/O时停3秒何时被调度、何时被阻塞都不由进程本身决定而由操作系统决定。这听起来有点像麻烦但正是异步才让多道系统和并发成为现实。因为如果每个任务都按部就班同步执行那就意味着一次只能推进一个任务效率必然低下。异步带来的最大挑战是竞态条件如果两个进程都要修改同一个变量而它们的执行顺序不确定最终结果就不确定。为了让异步下的最终结果仍然正确操作系统需要提供进程同步机制。这是后续信号量管程条件变量等内容的来源。4.5 四大特征与五大功能的映射关系操作系统的五大功能——处理机管理、存储器管理、设备管理、文件管理、用户接口本质上就是为应对四大特征而设计的工作模块。我这里画过一张对应的表帮你理解为什么这章叫引论却埋了整个后续课程的种子操作系统面对的挑战对应特征对应功能模块后续关键内容举例多个程序抢CPU并发处理器管理进程调度、上下文切换、同步互斥多程序同时驻留内存共享互斥/同时存储器管理地址空间、分页、虚拟内存、内存保护让每个进程觉得独占资源虚拟存储管理、处理器管理虚拟内存、虚拟CPU、设备虚拟化并发执行顺序不可预测异步同步机制、调度信号量、死锁避免、中断处理对外提供统一使用界面-用户接口系统调用、命令解释器、GUI我强调一点四大特征不是并列记忆点而是一个连锁反应。多道程序导致并发 → 并发导致资源需要共享 → 共享和并发需要虚拟来隔离和抽象 → 并发执行天然异步 → 因此需要有同步机制。学到这里你应该能自己说出四个特征之间的因果关系了。5. 从用户态到内核态系统调用与中断是理解操作系统的钥匙5.1 为什么要分内核态和用户态一个重要的设计原则是保护。如果应用程序可以随便执行特权指令、随便访问所有内存地址、随便操作设备寄存器那么一个程序出bug就可能搞垮整个系统。所以操作系统把CPU的运行状态分为至少两级用户态目态应用程序运行时所处的状态。只能执行普通指令不能执行特权指令不能直接访问受保护的内存区域和设备。内核态管态操作系统内核运行时的状态。可以执行全部指令包括特权指令可以直接访问所有硬件资源。注意特权指令这个词它是这种区分的关键。比如修改程序状态字、设置时钟、启动I/O、切换内存映射等指令都只能在核心态执行。如果用户态程序胆敢尝试这类指令CPU会产生异常陷阱转交给操作系统处理通常结果就是程序被终止。5.2 中断和异常操作系统重新获得控制权的唯一途径你可能会有个疑问操作系统再怎么强大如果应用程序一直在用户态运行不主动让出CPU操作系统怎么能介入呢答案是中断和异常。操作系统重新获得控制权的时机本质上只有两类程序主动请求系统服务执行系统调用指令触发访管中断陷入内核态。程序运行过程中发生外部事件比如时钟中断、I/O完成中断或内部异常比如除零、缺页、非法指令CPU自动转向操作系统预设的中断处理程序。我当年学到这里突然明白了为什么很多教材把中断称为操作系统的灵魂。因为操作系统本质上是一个事件驱动的程序平时处于休眠或等待状态一旦有中断信号CPU就会跳转到内核的特定处理函数执行完之后再返回用户态继续运行。中断机制就是操作系统与外部世界之间的门铃。5.3 中断的分类和处理过程按触发来源中断通常分为外部中断硬件中断和内部中断异常、陷入。外部中断又可以分为可屏蔽中断和不可屏蔽中断。内部中断里最典型的访管中断其实就是指令之前的系统调用。典型的中断处理过程可以这样记忆CPU收到中断信号后保存当前程序的现场程序计数器、程序状态字、寄存器等。根据中断类型查找中断向量表找到对应的处理程序入口。切换到内核态执行中断处理程序。处理完毕恢复现场返回到被中断的程序的下一指令继续执行。这里要注意的是现场保护和现场恢复的概念它是后面进程切换的基础。中断处理过程中CPU不能响应同级的新中断有些需要开中断时延后处理这又牵涉到中断嵌套和中断屏蔽。如果你在考试里看到中断响应的全过程流程顺序基本就是上面四步的详细展开。5.4 系统调用应用程序请求服务的官方通道系统调用是操作系统提供给应用程序的接口。应用程序不能直接操作硬件也不能随意进入内核态它要访问文件、创建进程、申请内存、读取设备只能通过系统调用。一个常见误区是分不清系统调用和库函数。比如你在C语言里用malloc申请内存用printf打印输出这些是库函数但malloc底层会用到brk或mmap系统调用printf底层会调用write系统调用。库函数是用户态的封装系统调用是进入内核的那道门。系统调用的执行过程可以概括为五个步骤用户程序把系统调用号和参数放入指定寄存器或栈。执行陷入指令如x86上的int 0x80或syscall指令触发访管中断。CPU切换到内核态根据系统调用号在系统调用表中查找对应服务例程。内核执行服务例程完成权限检查、资源分配、数据拷贝等操作。返回用户态把结果放在指定位置程序继续执行。这里有一个很关键的为什么为什么系统调用有额外开销因为每次系统调用都要经历用户态到内核态的切换、参数的拷贝、上下文的保存与恢复。所以如果频繁进行系统调用比如每读一个字节就调用一次read性能会非常差。实际工程里我们才会引入用户缓冲区、批量读写、零拷贝等优化手段——理解了系统调用的代价你就能理解很多性能优化方案的原因。5.5 内核态与用户态切换的实际案例以一次最简单的磁盘文件读取为例把上面这些串起来用户程序调用read(fd, buf, 1024)看似一个库函数实际发生的事情是库函数把read的系统调用号、文件描述符fd、缓冲区地址buf和长度1024压入寄存器执行syscall指令陷入内核操作系统根据系统调用号找到文件系统中的read例程内核检查文件描述符是否有效、进程是否有权限内核发起磁盘I/O请求当前进程进入等待状态磁盘控制器完成读取后发出中断信号操作系统在中断处理中把数据从内核缓冲区复制到用户缓冲区恢复用户态read返回读到的字节数。你看这一天代码里根本没出现中断两个字但整个过程中至少经历了两次用户态与内核态的切换、一次中断处理。如果明白了这一切再遇到为什么read慢为什么需要DMA为什么有零拷贝这些问题时你就能自己推导出答案了。6. 学习笔记的收尾我在第一章踩过的理解误区和复盘方法6.1 误区一把并发和并行混为一谈这是最常见的一个坑我当年考试前还差点写错。并发是逻辑上同时发生是操作系统的特征并行是物理上同时发生是硬件多核的特性。哪怕只有一个CPU操作系统也能用并发把多个任务交替推进而并行必须有多个处理器同时工作才能实现。这里有个更深的点在单核时代操作系统谈并发在多核时代操作系统还要支持并行。多核给操作系统带来的新问题包括多个CPU同时访问同一数据结构需要锁缓存一致性怎么保证进程如何在多核间负载均衡。这些在后续章节中也会有影子。6.2 误区二背下系统调用的定义却不知道它为什么要陷入内核如果你问我什么是系统调用我可以背得很流利。但一开始我没有意识到系统调用的本质是一种受控的用户态到内核态的转换而这一转换的实现基础是访管指令与中断机制。不理解这一点后面学各种同步原语、文件操作、网络编程时只能记API没法理解它们为什么重。要给自己的理解做检查你可以闭上眼睛问三个问题用户程序能不能直接读磁盘不能必须通过系统调用进入内核。为什么不能直接读因为需要保护避免一个程序破坏整个系统。系统调用如何进入内核靠陷入指令触发中断完成状态切换。如果这三个问题都能清晰口头回答这一块就算过关了。6.3 误区三认为操作系统发展史只是背诵材料很多同学把发展史当作最早是人工操作、然后是批处理、多道、分时、实时这样一条时间线来背。其实这条线的每一环都是后面章节问题的导火索。比如多道程序设计的出现直接导致了进程管理实时系统的出现直接影响了调度算法设计。我的建议是在这个阶段就建立问题驱动式的复习方法。每学一个发展阶段就写两个问题它解决了什么痛点和它带来了什么新问题下面是我自己整理时的答案示例人工操作解决了能用计算机的问题带来了资源利用率低、人工干预多的问题。批处理解决了减少人工切换的问题带来作业调度、内存分配、I/O管理等新任务。多道程序解决了CPU与I/O速度不匹配、利用率低的问题带来并发执行时的安全、保护、同步问题。分时系统解决了交互性差的问题带来响应时间、公平性、时间片设置问题。实时系统解决了响应确定性要求的问题带来抢占调度、优先级反转等更复杂的调度问题。这样整理之后发展史就不再是时间线而是一条完整的问题链。6.4 我的复盘方法用讲给别人听检验掌握程度学完引论我给自己定了一个检验标准——能不能不用笔记把操作系统引论的基本逻辑讲给一个完全没学过的人听并且让他听懂我会这样讲假设你开了一家公司公司有各种硬件设备员工就是各种应用程序。如果没有行政部门操作系统来协调每个员工都直接用会议室、打印机和财务系统那这个公司一定乱套。行政部门负责排会议室CPU调度、管办公桌内存分配、管打印机排队设备管理、管档案有序存放文件系统还要给每个员工发访问权限安全机制。这个类比虽然粗糙但可以帮你建立整体画面细节再慢慢补。如果你愿意可以把这段讲给别人听的内容录下来或者写成一页纸的总结。写的时候除非必要不看教材。卡壳的地方就是你理解薄弱的地方。把卡壳点逐个击破比反复读十遍教材有效得多。6.5 给后续学习的一条主线建议第一章学完之后不要停接着先翻一遍进程管理的目录。你会发现很多引论里提到的词比如并发资源共享调度都会再次出现。我给自己的任务清单是这样的从操作系统是资源管理者出发梳理出它管理的四类资源。每一类资源对应一个后续章节处理器对应进程与处理器调度内存对应内存管理设备对应I/O系统文件对应文件系统。每学完一个后续章节回来更新一次本章笔记把引论中的概念与具体实现对应起来。这份笔记几经整理最终成了我复习时最高效的索引。操作系统这门课的难度不在于背而在于把一整个系统的运行逻辑串联起来。而串联的起点恰恰就是这个看起来最简单的第一章。希望这份学习笔记能帮你在起步阶段就把骨架搭好后面走起来会轻松很多。