12464 字
62 分钟

Introduction

What Operating Systems Do#

Interface Between Users and Hardware#

操作系统(Operating System,OS) 是管理计算机硬件、为应用程序提供运行环境,并在用户与硬件之间起中介作用的系统软件。

三个目标:执行用户程序、使计算机便于使用、有效利用硬件资源。

用户提出的任务操作系统需要处理的事情
保存一张图片组织文件、分配存储空间、通过设备完成读写
启动一个程序建立执行环境、分配内存、安排 CPU 执行
按下键盘或移动鼠标接收设备事件,把输入交给相应程序

应用提出任务,操作系统提供机制并协调资源,硬件完成实际计算与数据传输。

Four Components of a Computer System#

用户:人、其他机器或其他计算机
↓
系统程序与应用程序:编译器、编辑器、浏览器、数据库等
↓
操作系统:控制、协调硬件资源的使用
↓
硬件:CPU、内存、I/O 设备
层次主要作用概念
硬件提供基本计算、存储与输入输出能力硬件资源本身不决定所有应用之间的分配策略
操作系统控制和协调多个应用、多个用户对硬件的使用关注公共机制与资源管理
系统程序与应用程序利用资源完成具体任务编译器、浏览器等不等同于操作系统内核
用户提出计算或服务需求用户不一定是直接操作键盘的人

数据库会自行管理一部分内存和存储。

Resource Allocator and Control Program#

从系统角度,操作系统有两个互补的角色。

角色核心问题典型职责
资源分配者(Resource Allocator)多个请求发生冲突时,资源分给谁?管理 CPU 时间、内存、存储空间和 I/O 设备,兼顾效率与公平
控制程序(Control Program)程序怎样运行,才能避免错误使用或相互破坏?控制程序执行与 I/O,限制越权行为,处理运行错误

例如,多个程序同时要求 CPU,就需要调度;一个程序陷入死循环,系统需要有办法重新取得控制;一个程序试图修改其他程序的数据,系统需要检查并限制访问。

什么时候可以“浪费”一部分硬件资源?

个人交互系统可以为更方便的界面、更及时的响应付出额外 CPU 时间和内存。表面上,这些资源没有直接用于用户的计算任务;从完成任务所需的人力、等待时间和使用体验看,这种投入可能是合理的。

因此,评价“浪费”要先明确系统目标。最大化硬件利用率并非每一种系统的唯一目标。 同样,保留一定余量以应对交互请求,也不能仅凭资源未满载就判定设计低效。

Kernel, System Programs, and Applications#

操作系统的边界没有一个适用于所有产品的统一定义。

内核(Kernel) 是操作系统的核心部分。“计算机运行期间始终存在的那个程序”。

核心职责 :管理进程、内存和设备,以及提供受保护的服务入口。

概念理解
内核支撑系统基本运行与资源管理的核心代码
系统程序随系统提供、辅助系统使用和管理的软件
应用程序直接完成用户具体任务的软件

内核一直存在,不表示 CPU 每一刻都在执行内核指令。 CPU 执行应用代码时,内核仍保留在系统中;出现中断、异常或服务请求时,控制可以转入内核。

Firmware and Booting#

Firmware and Operating Systems#

固件(Firmware) 是与设备或平台紧密结合的底层软件。

嵌入式设备可以运行操作系统,也可以由专用控制代码直接完成任务

Boot Process#

引导程序(Bootstrap Program) 负责让计算机从刚上电的状态进入能够运行操作系统的状态。

上电或重启
↓
执行初始引导代码
↓
初始化 CPU 寄存器、设备控制器、内存等
↓
找到并装入操作系统内核
↓
开始执行内核,建立系统服务
↓
启动用户环境与应用程序

内核运行之前,需要已有代码把它装入并开始执行。 最初的引导代码不能依赖尚未启动的操作系统服务。

上述流程是本章的概念模型。

Computer-System Organization#

CPU, Memory, Devices, and Controllers#

一个基本组织模型:一个或多个 CPU、多个设备控制器,通过公共总线连接,共享对主存的访问。

设备控制器(Device Controller) 是管理某类设备的硬件部分;设备驱动程序(Device Driver) 是操作系统中与相应控制器交互的软件。

部分作用
CPU执行指令,运行应用代码与操作系统代码
主存保存正在使用的指令与数据
设备控制器接收控制命令,管理设备操作与局部缓冲区
设备驱动程序按具体设备的接口设置命令、处理状态,向系统提供访问能力
总线/互连在各硬件部分之间传送地址、数据与控制信息

CPU 与 I/O 设备可以并发工作。例如,磁盘传送数据时,CPU 可以执行其他计算;但它们也可能竞争总线或内存访问机会。

数据先在设备与控制器的局部缓冲区之间传输,再由 CPU 在局部缓冲区与主存之间搬移。后面的 DMA 改进了这一步的数据搬移方式。

Purpose of Interrupts#

中断(Interrupt) 使硬件能够通知 CPU:出现了需要处理的事件,例如 I/O 已经完成。

一个典型过程是:驱动程序启动设备操作后,CPU 继续执行其他工作;设备完成操作,控制器发出中断;CPU 转去执行处理程序,处理完成后恢复相应执行。

中断 让 CPU 不必在整个设备操作期间一直等待同一个完成状态。

事件来源术语例子
外部硬件事件硬件中断I/O 完成、定时器到期
当前指令执行出现问题异常/陷阱除零、非法指令、非法内存访问
程序主动请求操作系统服务系统调用,通过受控入口陷入内核请求文件读写、创建进程等

陷阱(Trap) 是软件引起的中断,可能来自错误,也可能来自用户服务请求。

系统调用(System Call) 强调“程序向操作系统请求服务”。它与设备发出的完成中断具有不同的来源和目的。

Interrupt Handling#

中断服务程序(Interrupt Service Routine,ISR) 是负责处理相应中断的代码。中断向量(Interrupt Vector) 用来定位相应处理入口,保存处理程序地址的表。

CPU 正在执行程序
↓ 发生中断
保存恢复执行所需的状态
↓
确定中断来源,找到处理入口
↓
执行相应中断服务程序
↓
恢复状态,继续相应执行

保存状态的重点是程序计数器(Program Counter,PC)与寄存器等执行现场。

硬件与操作系统分工完成这一过程。硬件提供中断检测和控制转移等机制;操作系统设置处理入口、保存和恢复必要状态,并执行具体处理逻辑。

Identifying Interrupt Sources#

方法做法特点
通用处理程序轮询进入处理程序后,依次检查可能的设备或状态通过检查找出需要服务的来源
向量中断利用中断信息定位相应处理入口减少逐个检查全部来源的需要

这里的“轮询来源”与“在 I/O 完成前不断检查设备是否准备好”用途不同:前者用于识别已到来的事件,后者用于等待事件发生。

处理中断时,是否必须禁止所有其他中断?

有可屏蔽中断、不可屏蔽中断和中断优先级:系统可以暂缓某些中断,也可以允许更高优先级的中断抢占较低优先级的处理程序。

因此,中断需要受控处理、关键状态需要保护;不是所有机器都不支持中断嵌套。

Example#

输出 Hello World 的执行路径

输出语句用如何使用操作系统服务。

用户程序调用 printf()
↓
标准 C 库处理相应调用
↓ 需要输出服务时
通过系统调用接口请求内核执行 write()
↓
内核完成相应服务,并返回结果
↓
库函数和用户程序继续执行
进入内核,是否就意味着切换到了另一个进程?

不一定。 一个进程请求系统服务,可以从用户态进入内核态,服务结束后再回到该进程的用户代码。这里改变的是 CPU 的执行权限与所执行的代码。

进程上下文切换还需要切换执行对象:保存原进程的状态,恢复另一个进程的状态。系统调用过程中可能因为等待 I/O 而触发调度,但系统调用本身不保证一定切换进程。

这一区别也适用于中断:执行一段中断处理代码,与决定改运行另一个进程,是可以关联、但需要分别判断的两件事。

Interrupt Timeline#

图中上方是 CPU,下方是 I/O 设备,时间从左向右。

发出请求之后,设备从空闲进入传输状态;CPU 仍可执行程序。传输完成之后,设备发出中断,CPU 短暂转入中断处理。处理结束,CPU 返回原来的执行路径。

图中最重要的是两段时间的区别:设备传输时间可以与 CPU 计算重叠,中断处理本身仍占用 CPU 时间。 图上的短暂下凹表示 CPU 处理完成事件,不能把整个 I/O 传输都算成 CPU 在处理中断。

I/O Structure#

Synchronous and Asynchronous I/O#

比较项同步 I/O(Synchronous I/O)异步 I/O(Asynchronous I/O)
调用何时返回等待所请求的操作完成后返回操作尚未完成时即可返回
返回后能否直接使用本次结果按完成状态判断,可以处理已返回的结果还需要等待该请求的完成通知与结果
调用者在等待期间当前执行路径停在等待位置可执行与结果无关的其他工作
编程方式较符合顺序执行的思路需要组织请求、完成事件和后续处理
多个请求顺序调用容易形成“一个完成后再发下一个”可以有多个未完成请求,完成顺序可能不同

两种简单等待方式:等待指令使 CPU 空闲直到出现中断;等待循环持续检查状态,会消耗 CPU 时间,并可能增加内存访问竞争。

Example#

读取 1 GB 数据为什么可能让界面卡住?

假设界面处理与读取文件都在同一条执行路径中,程序发出一个需要较长时间的同步读取请求。

展开分析:现象、原因与异步方式

同步读取完成之前,这条执行路径不能继续处理后续事件。如果它也负责界面交互,用户就可能看到“按钮无响应、页面不再滚动”。

异步方式先登记读取请求,随后返回。程序可继续响应与该读取无关的界面操作,等数据完成后,再执行相应后续处理。

同步:提交读取 ── 等待完成 ── 处理结果 ── 继续处理界面
异步:提交读取 ── 继续处理界面 ──────────────┐
设备在后台完成数据传输 ── 完成通知 ── 处理结果

这个比较有一个重要前提:单一执行路径承担了读取和界面工作。

Example#

后提交的读取为什么可能先完成?

程序先请求读取数据块 A,再请求读取数据块 B;A 在一块正忙的磁盘上,B 在另一块空闲磁盘上。

展开分析:请求顺序与完成顺序

A 可能先进入队列等待;B 所在的设备能够立即处理,所以 B 可能先完成。

因此,提交顺序 A → B,不保证完成顺序也是 A → B。异步程序需要知道每个结果对应哪个请求,不能只把“第一个回来的结果”当成 A。

如果后续计算必须同时使用 A、B,就应确认两个请求都已成功完成,再执行该计算。只有与尚未完成的结果无关的工作,才适合提前推进。

异步 I/O 允许不同完成顺序,实际是否乱序还取决于设备状态、请求内容和调度;它也可能恰好按提交顺序完成。

回调函数(Callback) 是完成通知之后安排应用后续处理的一种方式。硬件中断首先由系统处理,系统再通过相应机制使应用获知完成;应用回调不应直接等同于硬件中断服务程序。

非阻塞调用与异步调用进一步区分
方式一次读取返回时表达什么
阻塞读取等待操作完成,再返回结果
非阻塞读取尽快返回当前可取得的数据;可能是全部、部分或没有数据
异步读取返回时请求可能仍未完成,以后再报告该请求的完成结果

Device-Status Tables and Request Queues#

异步执行后,系统需要记住哪些设备正在工作、有哪些请求还没有结束。

设备状态表(Device-Status Table) 为设备保存类型、地址、状态等信息,并关联相应请求。忙碌设备的后续请求可以先进入队列,设备完成后再安排下一项。

系统记录的既有设备状态,也有待完成操作的内容。如图中磁盘设备 3 处于忙碌状态,其请求链包含对文件 xxx 的读请求和对文件 yyy 的写请求。

新 I/O 请求
↓
查看相应设备状态
├─ 可开始执行:配置设备并启动操作
└─ 需要等待:登记请求,加入待处理队列
设备完成并产生中断
↓
记录完成状态,通知相应等待者
↓
按调度策略选择后续请求,更新设备状态
队列中的请求一定按先来先服务的顺序执行吗?

不一定。 队列用于记录等待中的请求,最终选择哪一个请求执行,还取决于调度策略。

磁盘访问说明:为了减少设备移动或提高效率,系统可能采用类似“电梯”的处理顺序,优先处理位置合适的请求。具体算法将在磁盘调度部分展开。

有两个细节需要关注:记录请求的数据结构与选择下一个请求的策略。

Direct Memory Access#

如果大量数据的搬移都需要 CPU 逐次参与,CPU 会花很多时间在搬数据及处理相关事件上。高速设备传送大块数据时,这种开销尤其明显。

直接内存访问(Direct Memory Access,DMA) 允许设备控制器在设备与主存之间直接传送一块数据,传送过程不需要 CPU 逐字节搬移。

阶段CPU/操作系统设备控制器/DMA 机制
准备配置缓冲区、源/目的地址、传输数量等接收传输配置
传输可以执行其他工作通过总线或互连完成数据块传送
完成处理完成事件、更新状态通常在相应传输块完成后发出中断

DMA 能够同时减少 CPU 搬运数据的工作和频繁处理完成事件的开销。

DMA 是否完全不需要 CPU?是否只是把中断攒到一起?

CPU 仍需要参与初始化、设置传输参数以及处理完成或错误状态。DMA 的关键在于传输主体由控制器直接完成,CPU 不再逐字节执行搬移。

同步/异步、中断、DMA 分别回答三个问题:调用者何时继续、CPU 怎样得知事件、数据由谁搬移。 它们可以组合使用。

Storage Structure and Caching#

Main Memory, Secondary Storage, and Disks#

主存(Main Memory) 保存 CPU 当前需要使用的指令与数据,是 CPU 可以直接寻址访问的大容量存储。主存通常使用 DRAM,断电后内容不能保留。

辅助存储(Secondary Storage) 提供更大的非易失性存储空间,用于保存程序和长期需要的数据。CPU 要处理磁盘中的数据,通常需要先通过 I/O 把它们送入主存。

对象结构或特点
主存可以按地址访问,速度较快;容量和成本限制了它可容纳的数据量
磁盘盘片表面覆盖磁性记录材料;表面划分为磁道,磁道再划分为扇区
磁盘控制器管理计算机与磁盘设备之间的交互
非易失性电子存储教材以闪存、SSD 等为例,断电后仍能保存内容
光盘、磁带可用于备份、归档等对访问速度要求较低的场景

磁道(Track) 与 扇区(Sector) 属于磁盘组织;不能直接把机械磁盘的结构套到所有存储介质上。

Storage Hierarchy#

理想存储希望同时满足:速度快、容量大、价格低、断电不丢失。实际设计需要在这些目标之间取舍,因此使用多层存储共同工作。

从上到下可以概括为:

寄存器
↓
高速缓存
↓
主存
↓
非易失性电子存储
↓
磁盘
↓
光盘、磁带等归档存储
比较维度靠近上层时的一般特点靠近下层时的一般特点
访问速度较快较慢
单位容量成本较高较低
典型容量较小较大
断电保持能力寄存器、通常的缓存和主存具有易失性常用辅助与归档存储具有非易失性

这是理解层次的总体取舍,不能代替具体设备参数比较。易失性(Volatility) 只描述断电后能否保留数据,也不能由它单独判断访问速度。

Caching Basics#

缓存(Caching) 把暂时需要的信息从较慢的存储复制到较快的存储,以缓解不同层之间的速度差距。

需要某项数据
↓
先查缓存
├─ 命中:直接使用缓存中的数据
└─ 未命中:访问较慢层,取得数据,并按策略放入缓存

缓存命中(Cache Hit) 表示请求的信息已经在缓存中;缓存未命中(Cache Miss) 表示还需要到较慢的层次取得信息。

缓存通常比被缓存的数据集合小,所以系统必须决定保留哪些数据,以及空间不足时替换哪些数据。缓存容量与替换策略是重要设计问题。

缓存并不限于某一个硬件部件:处理器有硬件缓存,操作系统和应用也可以维护缓存。从磁盘的角度看,保存部分磁盘数据的主存也起到了更快一层缓存的作用。

Example#

少量热点数据为什么值得放进缓存

展开分析:热点、容量与命中机会

假设大部分访问集中在一小部分数据上。若缓存能够容纳并保留这些热点,后续大量请求就可以在快存储中完成;即使缓存只占全部数据的一小部分,也可能覆盖相当多的访问。

反过来,如果每次都访问此前没有使用过的数据,或者热点远大于缓存、不断被替换出去,那么缓存的收益就可能下降。

因此,缓存效果取决于实际访问模式、容量和替换策略。

经常使用的数据可以放在较快的层,长期不活跃的数据放在成本较低的层,需要时再调入。这里保留的是冷热分层的设计思路;

Storage Performance and Management#

缓存不仅涉及“数据放在哪里”,还涉及各层有多快、由谁管理,以及数据怎样在层次之间移动。

存储层次访问时间(ns)带宽(MB/s)主要管理者后备存储
寄存器0.25–0.520,000–100,000编译器缓存
高速缓存0.5–255,000–10,000硬件主存
主存80–2501,000–5,000操作系统磁盘
磁盘5,000,00020–150操作系统光盘或磁带

访问时间关注完成一次访问要等多久;带宽关注单位时间内能传送多少数据。二者不能只看数字大小直接比较。

Explicit and Implicit Data Movement#

方式说明
显式组织的数据移动磁盘与主存之间的数据传输通常由操作系统控制,通过 I/O 完成
硬件自动完成的数据移动缓存、CPU 与寄存器之间的数据传送通常由硬件完成,不需要操作系统逐次介入

编译器决定哪些值保存在寄存器、何时替换;硬件管理相应的处理器缓存;操作系统管理主存和辅助存储。存储层次中的数据都需要协调,但不意味着每次数据移动都执行一段内核代码。

一次磁盘访问,大约相当于多少次主存访问时间?

根据课件参数作数量级计算 从主存访问时间范围中取 100 ns100\,\text{ns},磁盘访问取 5,000,000 ns5{,}000{,}000\,\text{ns}:

5,000,000100=50,000.\frac{5{,}000{,}000}{100}=50{,}000.

按这组参数,一次磁盘访问时间约为一次主存访问的 5 万倍。因此,缓存命中所避免的慢速访问可能带来很大收益。

这里比较的是访问时间,不是 CPU 指令条数,也不是所有设备都具有这一比值。

Multiple Data Copies#

层次结构提高了速度,但也使同一份数据可能同时出现在磁盘、主存、缓存和寄存器中。一处修改后,其他副本不一定已经同步更新。

Example#

整数 A 从磁盘到寄存器

设整数 AA 保存在磁盘文件 BB 中,现在需要执行 A←A+1A\leftarrow A+1。

磁盘中包含 A 的数据块
↓ I/O:读入主存
主存中的 A
↓
缓存中的 A
↓
寄存器中的 A → 执行加一
分析:寄存器已经加一,磁盘里的值也改变了吗?

不一定。 首先把包含 AA 的磁盘块读入主存,再将 AA 复制到缓存和寄存器。执行加一时,先改变的是寄存器中的副本。

若用 A=5A=5 具体化这一过程:

阶段磁盘副本主存副本缓存副本寄存器副本
各层复制完成、尚未加一5555
寄存器刚完成加一、尚未向下写回5556
新值已传播并写回磁盘6666

所以,计算结果已在寄存器中生效,与磁盘上的数据已更新,是不同阶段。

Cache Coherency#

多个执行者共享数据时,需要保证它们使用正确的新值。

环境问题
多任务CPU 在不同进程之间切换,访问同一数据的进程不能继续使用过时值
多处理器各 CPU 有本地缓存,同一个数据项可能同时保存在多个缓存中
分布式系统同一文件或数据的副本还可能分散在不同计算机上,访问与更新的协调更复杂

缓存一致性(Cache Coherency) 处理多个缓存中同一数据副本的协调问题。本章指出,多处理器的缓存一致性通常由硬件机制处理;分布式副本更新则还需要相应系统机制。

缓存解决什么问题,又带来什么问题?为什么不直接用同样大的缓存替代磁盘?

收益:保留经常使用数据的快速副本,减少慢速访问;在快慢部件之间缓解速度不匹配,减少等待。

代价:空间有限,需要选择装入和替换策略;同一数据存在多个副本,更新时需要处理一致性。

容量不能脱离介质性质讨论:高速存储通常有更高的单位容量成本,且寄存器、通常的缓存和主存具有易失性。即使某种缓存能做得与磁盘一样大,也不能因此推断它在成本、容量和掉电保存能力上都能替代磁盘。

层次结构保留不同介质的优势,并让数据在需要时进入较快层次。

Operating-System Structure#

Multiprogramming#

多道程序设计(Multiprogramming) 将多个作业组织起来,使一个作业等待 I/O 等事件时,CPU 可以执行另一个已经准备好的作业。主要目标是提高 CPU 利用率。

作业包含代码和数据。系统通常只将全部作业中的一部分保存在内存中,选择其中的作业执行;当前作业需要等待时,再切换到其他作业。

作业 A 使用 CPU
↓ A 等待 I/O
CPU 执行已准备好的作业 B;设备处理 A 的 I/O
↓ A 的 I/O 完成
A 可以重新参与调度,等待下一次执行机会

A 在等待,不意味着 CPU 也必须等待。 不过,只有仍有可运行的作业,系统才能继续利用 CPU;所有作业都在等待时,CPU 仍可能空闲。

Time Sharing#

分时(Time Sharing)/多任务(Multitasking) 是多道程序的延伸:CPU 频繁地在任务之间切换,使用户能够在任务运行期间与它交互。

比较项多道程序分时
主要目标提高 CPU 利用率提供及时的交互响应
典型情形一个作业等待时,执行另一个作业多个任务轮流获得 CPU,用户不必等一个任务全部结束
共同基础多个作业共存,系统协调资源和执行机会同左,并强调较快的切换与响应

当多个任务都已准备好时,需要 CPU 调度(CPU Scheduling) 决定下一个运行谁。多个任务同时驻留又要求内存管理,并且需要限制任务之间的不当干扰。

Concurrency and Parallelism#

并发(Concurrency):在同一段时间内推进多个任务,例如多个进程在一个 CPU 核心上交替运行。

并行(Parallelism):多个任务在多个 CPU 核心上同时执行。

因此,多个程序同时驻留内存,并不等于它们的指令正在同一时刻执行。 多道程序不要求一定有多个 CPU 核心。

Operating-System Operations#

Hardware Protection#

共享机器时,系统必须应对程序陷入无限循环、执行非法操作、修改其他程序或操作系统数据等问题。仅依靠用户程序自觉遵守规则不够,需要硬件提供受保护的执行机制。

双模式运行(Dual-Mode Operation) 区分用户态(User Mode)与内核态(Kernel Mode)。硬件中的模式位标记当前执行权限。

项目用户态内核态
执行内容用户程序代码操作系统的相应服务和管理代码
权限不能执行被限制的特权指令可以执行相应特权操作
模式位10
请求受保护服务通过系统调用进入指定服务入口检查并执行请求

特权指令(Privileged Instruction) 是只允许在相应特权模式下执行的指令,例如对 I/O、定时器和中断的某些控制操作。用户态直接执行这些指令时,硬件会将违规操作交给系统处理。

User-to-Kernel Mode Transition#

用户程序执行
↓ 发起系统调用
进入指定的内核服务,切换为内核态
↓
检查请求类型、参数与合法性,执行服务
↓
恢复用户态,返回用户程序

中断或异常也可以使正在执行用户代码的 CPU 转入内核处理。进入内核的路径受系统控制,用户程序不能借一次调用任意执行所有特权操作。

前文已经区分:执行模式切换关注权限与代码路径,进程切换关注执行对象。 进入内核不必然意味着运行了另一个进程。

Timer and CPU Control#

若程序一直循环而不发起系统调用,操作系统仍须有办法收回 CPU。定时器(Timer) 可在指定时间后产生中断,使控制权自动返回系统。

操作系统设置定时器
↓
让用户程序运行
↓ 规定时间到达
产生定时器中断
↓
操作系统重新取得控制权
↓
决定继续给予执行时间,或处理超时、安排其他任务

修改定时器的操作必须受特权保护,否则用户程序可以不断修改它,使系统失去收回控制权的保证。

Example#

哪些指令应是特权指令?

设置定时器、读取时钟、清空内存、发出陷阱指令、关闭中断、修改设备状态表、从用户态切换到内核态、访问 I/O 设备,哪些应受特权保护?

展开解答:按操作可能影响的范围判断

按双模式保护模型整理解答。

操作判断原因
a. 设置定时器应受保护不能让用户程序任意改变系统收回 CPU 的时机
b. 读取时钟不必仅因“读时间”而设为特权操作读取时间与修改定时器不同
c. 清空内存对任意内存的清空应受保护不能允许覆盖内核或其他程序的内存
d. 发出陷阱指令受控陷阱入口可由用户态使用用户程序需要通过这一机制请求系统服务
e. 关闭中断应受保护防止用户阻止系统处理事件或重新取得控制
f. 修改设备状态表应受保护这是系统管理设备的重要状态
g. 从用户态切换到内核态任意改变权限的操作应受保护不能让用户自行取消权限限制
h. 访问 I/O 设备直接控制受保护设备应受保护避免绕过设备管理和访问控制

按题目的上述含义,应选 a、c、e、f、g、h。

如何用定时器计算当前时间?

以下用固定周期定时器给出一种解答。

假定启动计时时已知参考时刻 t0t_0,每隔 Δt\Delta t 产生一次定时器中断。系统累计已发生的节拍数 nn,便可以估计:

t=t0+nΔt.t=t_0+n\Delta t.

例如,周期为 1 ms1\,\text{ms},经过 2,500 个节拍,对应过去了 2.5 s2.5\,\text{s}。

这里假设节拍计数正确,并且已有参考时刻。仅从开机后累计节拍,只能得到经过的时间;精度也受到周期与时钟误差的限制。

Process Management#

Programs and Processes#

进程(Process) 是执行中的程序,是系统中的一个工作单位。程序是被动的代码与数据描述,进程是带有执行状态的活动实体。[^os1-process]

比较项程序进程
观察对象磁盘文件等介质中的程序内容一次正在进行的执行
是否具有当前执行位置程序本身没有“现在运行到哪一步”需要记录下一条指令等执行状态
所需资源静态描述本身不代表正在使用执行资源运行中需要 CPU 时间、内存、文件与 I/O 等
数量关系同一程序可被多次运行对应的多个进程是不同执行序列

进程还可能接收初始化数据。教材以浏览器为例:网址作为输入,进程通过指令和系统调用获取、显示网页。进程结束时,操作系统回收可复用的资源。

Single and Multiple Threads#

单线程进程只有一条执行流,用一个程序计数器记录下一条指令;多线程进程则每个线程都有自己的程序计数器。

线程(Thread) 为 CPU 利用的基本单位,包含线程标识、程序计数器、寄存器集合和栈;同一进程内的线程共享代码、数据和打开的文件等资源。

同一进程内共享的内容每个线程分别保存的内容
代码段、数据段程序计数器与寄存器状态
打开的文件等进程资源线程标识与自己的执行栈

进程描述一次执行及其资源环境,线程描述其中的一条执行流。 有多个线程,不要求为每个线程各建立一套完全独立的代码和数据。

文字处理器为什么可以一边响应输入,一边检查拼写?

一个线程显示图形,一个线程响应用户按键,另一个线程在后台进行拼写和语法检查。

这些线程可以共享进程中的文档数据,但分别保留自己的执行位置与中间状态。因此,交互工作与后台检查不必全部塞进同一条顺序执行流。

单核心上可以通过交替运行实现并发;多核心上还可能并行执行。共享数据方便协作,但访问共享内容仍需要相应协调机制,这也是后面学习同步的原因。

Process Management Activities#

管理活动需要解决的问题
创建与删除建立用户进程、系统进程,结束后回收资源
调度进程与线程多个执行者准备好时,如何分配 CPU 机会?
挂起与恢复怎样暂停执行,并在需要时恢复?
同步怎样协调执行顺序与共享资源访问?
通信进程之间怎样交换信息?
死锁处理多个进程相互等待而无法继续时,系统怎样应对?

From Processes to Agent Tasks#

进程关注“程序正在执行”,智能体任务关注“正在完成什么目标”。

进程智能体任务
进程标识与身份模型与指令
地址空间目标、计划和当前上下文
线程与程序计数器当前任务进度及后续行动
打开的文件、网络连接等可调用的工具与外部服务
短期或长期的执行状态跨多次交互保存的记忆

智能体还可能产生子任务或其他智能体。由此会遇到调度、检查点与恢复、隔离、资源计量等系统问题。

一个智能体任务的执行可以跨越多个进程和服务。

Memory Management#

Memory Residency#

CPU 使用的指令与数据需要进入可访问的内存体系。系统中有多个进程时,**内存管理(Memory Management)**决定哪些内容在何时驻留,以提高 CPU 利用率并改善响应。

职责要回答的问题
跟踪使用情况哪些内存正在使用?分别由谁使用?
分配与回收新需求从哪里获得空间?不再需要的空间如何释放?
决定移入与移出哪些进程、进程的一部分或数据,应进入或离开主存?

前面的多道程序要求多个进程共存于内存;内存管理则负责为这种共存提供空间与状态管理。

Swapping and Virtual Memory#

当进程不能都容纳在内存中时,引入两种相关机制。

交换(Swapping):将进程移入、移出内存,使有限的内存能被不同进程使用。

虚拟内存(Virtual Memory):允许一个进程在没有全部装入物理内存时执行。

“指令要在内存中才能执行”与“进程不必全部在内存中”矛盾吗?

不矛盾。前者关注当前要执行、使用的内容;后者关注整个进程的全部内容。

程序运行到某一阶段,只需要这一阶段所需的部分能够被访问,并不要求其他所有代码和数据同时驻留。虚拟内存可以支持大于实际物理内存的程序。

Memory and Context Management#

操作系统内存管理智能体上下文管理
CPU 缓存当前活动上下文
主存中的页面KV 缓存中的状态
SSD 与文件检索出的记忆、文件或数据库内容
哪些字节、页面应该驻留?哪些信息应该进入当前上下文?

共同问题是:快速、直接可用的空间有限,哪些内容应该留在其中?

Storage Management#

File Systems#

不同介质的容量、访问速度、传输率、顺序/随机访问方式不同。操作系统通过**文件(File)**这一逻辑存储单位隐藏这些物理差异,再把文件映射到实际存储介质。

文件保存相关的信息,既可以是程序,也可以是数据;文件通常组织在目录中,访问控制决定谁可以读取、写入或执行相应操作。

文件系统管理活动含义
创建与删除文件、目录建立或移除逻辑存储对象,组织文件
提供操作原语提供操作文件和目录的基本接口
映射到辅助存储确定文件内容对应哪些实际存储位置
备份将需要保留的文件备份到稳定的非易失性介质

应用使用的是文件这一抽象,系统还要落实它在介质上的存储和访问。

Mass Storage#

主存放不下的数据,以及需要长期保存的数据,需要辅助存储。存储子系统及其管理算法可能成为整机性能的重要限制。

三项职责:

职责核心问题
空闲空间管理哪些存储空间还可使用?
存储分配把哪些可用空间分给某个文件或其他数据?
磁盘调度多个读写请求应按什么顺序服务?

第三级存储(Tertiary Storage) 包括光盘、磁带等,适合备份、较少使用的数据和长期归档。并非所有存储都必须很快,但仍需管理介质、使用权和数据迁移。

其中,WORM 表示一次写入、多次读取;RW 表示可读写。它们描述允许的操作方式,与存储层次的速度高低不同。

I/O Subsystem#

I/O 子系统为系统提供通用的设备驱动接口,再由针对具体硬件的驱动处理设备差异,使应用和系统其他部分不必逐项了解每种设备的细节。其职责还包括用于 I/O 的缓冲、缓存和假脱机。

机制主要作用理解重点
缓冲(Buffering)暂存正在传输的数据协调传输双方的速度、数据传送单位等差异
缓存在较快存储中保留数据副本再次访问时减少慢速访问
假脱机(Spooling)先保存设备任务,再安排实际输出协调多个作业与设备之间的执行,使相关工作可以重叠

缓冲区可能保存某数据的唯一副本,缓存则保存位于其他位置的数据的快速副本。两者功能不同,但同一块内存可以兼作缓冲与缓存。

多个应用同时打印,为什么输出不会混在一起?

打印机一次处理一个作业,不适合将多个输出流随意交错。系统先把各应用的输出分别保存到辅助存储上的假脱机文件,再把这些文件排队,逐个交给打印机。

应用 A → 假脱机文件 A ─┐
应用 B → 假脱机文件 B ─┼→ 输出队列 → 打印机依次处理
应用 C → 假脱机文件 C ─┘

应用提交输出与设备实际输出被分开。多个应用可以提交任务,不要求打印机同时打印多个作业;系统还可以提供查看队列、删除尚未打印的任务、暂停打印等操作。

Coordinating Storage Management#

一次文件读写中的职责区分为:

文件系统管理:要操作哪个文件,允许什么操作,文件映射到哪里?
↓
大容量存储管理:使用哪些存储空间,请求按什么次序服务?
↓
I/O 子系统与驱动:怎样通过具体控制器完成传输与状态处理?

每个系统不是都必须采用同样的模块调用顺序。中断、DMA 和设备队列,属于实现这类工作的重要机制。

Protection and Security#

Access Control and Threat Defense#

保护(Protection) 控制进程和用户对系统资源的访问;安全(Security) 防御来自系统内部和外部的攻击。两者相关,但关注点不同。

概念核心问题例子
保护哪个执行者可以对哪个资源进行什么操作?地址空间限制、设备控制权限、文件读写权限
安全怎样防止系统被恶意利用或破坏?防御拒绝服务、病毒、蠕虫、身份盗用、服务盗用

地址空间保护、定时器和设备控制寄存器的访问限制都是保护机制的例子。它们分别限制程序能访问哪里、能否一直占有 CPU,以及能否直接控制设备。

文件权限检查正常,数据为什么仍可能被窃取?

假设合法用户的认证信息被盗。攻击者可能使用这一身份复制或删除数据,即使文件和内存保护机制仍然按原有规则运行。

因此,访问检查是否执行正确,与访问者是否冒用了身份,需要分别解决。有保护机制,并不意味着所有安全问题都已消失。

Users, Groups, and Effective Identity#

系统通常先确定用户身份,再根据身份判断允许的操作。

标识或机制作用
用户标识(User ID)区分用户,与相应进程、文件等对象的访问控制关联
组标识(Group ID)把一组用户作为管理对象,统一设置相应权限
有效身份与权限提升在系统允许的条件下,以不同的有效身份执行需要额外权限的活动

文件所有者可以拥有完整操作权限,而某一组用户只拥有读取权限。

权限提升不等于用户自行改变 CPU 模式位。 这里讨论的是访问资源时采用什么身份和权限;前面的用户态/内核态讨论的是硬件执行模式。

Computing Environments#

大型机 → 小型机 → 个人计算机 → 桌面互联网 → 移动互联网

Distributed Systems#

分布式系统(Distributed System) 由物理上分离、可能异构的计算机通过网络连接,向用户提供对共享资源的访问。

系统形式区别
网络操作系统提供跨机器文件共享、进程通信等能力,各计算机仍保持相对自主
分布式操作系统各计算机紧密协作,试图向用户呈现由一个系统统一控制的视图

下文的客户端—服务器与 P2P,是组织分布式服务的两种模型。

Client–Server Computing#

客户端—服务器(Client–Server,C/S) 模型中,服务器响应客户端发出的请求。

服务器类型提供的服务例子
计算服务器接收操作请求,执行后返回结果数据库查询
文件服务器提供存储、读取、更新等文件操作接口远程文件访问
客户端 ── 请求 ──→ 服务器
客户端 ←─ 结果 ─── 服务器

Peer-to-Peer Computing#

对等计算(Peer-to-Peer,P2P) 不固定区分客户端和服务器。节点作为对等参与者,既可以请求服务,也可以提供服务。

节点加入网络后,还需要知道“谁能提供所需服务”。

方式发现与访问过程例子
中央查找服务提供者先登记服务;请求者查询提供者,再与其通信Napster 的文件索引
服务发现协议请求者广播服务请求,能够提供服务的节点响应Gnutella 的文件发现

存在中央查找服务,不代表服务内容必须由中央服务器提供。 查找“谁有文件”和实际“把文件传给对方”,可以由不同节点完成。

C/S 与 P2P 的主要区别是什么?

C/S 模型具有明确的请求者和服务提供者角色,多个客户端请求服务器提供服务;P2P 的节点角色不固定,同一节点可以在不同交互中请求或提供服务。

集中服务器可能成为瓶颈;P2P 则可以由分散的多个节点提供服务。但 P2P 不等于完全没有中心组件,因为它仍可使用中央查找服务。

判断时先看服务由谁提供、节点如何承担角色,再区分服务发现方式。

Web-Based Computing#

越来越多的设备通过网络访问 Web 服务,办公软件也可以通过 Web 提供,例如 Google Docs。

负载均衡器(Load Balancer) 在提供相似服务的多台服务器之间分配请求,管理到达服务器的 Web 流量。

客户端请求 → 负载均衡器 → 多台提供相似服务的服务器

客户端、服务器描述服务关系中的角色,不是简单依靠操作系统名称区分。

云计算与实时嵌入式环境

云计算(Cloud Computing):将计算、存储和应用作为经网络提供的服务。

分类维度类型
使用与部署范围公有云向外部用户提供服务;私有云供组织自身使用;混合云结合两者
提供的服务层次软件即服务(SaaS)提供应用;平台即服务(PaaS)提供可供应用使用的软件栈;基础设施即服务(IaaS)提供服务器、存储等资源

这两组分类可以组合,例如同一个公有云提供不同层次的服务。

实时嵌入式系统:嵌入式系统通常针对特定设备和任务;实现可以采用通用操作系统加专用应用、专用嵌入式操作系统,也可以是无需操作系统的专用硬件。

实时系统(Real-Time System) 要求在明确的时间约束内完成处理。正确性同时包括结果正确和按时完成。

AI and OS Boundaries#

From User Intent to Action#

层次接收什么主要负责什么
智能体层用户目标与任务上下文理解意图、拆分任务、选择工具、观察结果并重新规划
操作系统程序的服务请求与硬件事件管理进程、内存、文件、I/O,并实施保护与隔离
用户目标
↓
智能体:理解目标 → 规划 → 调用工具 → 观察结果 → 必要时重新规划
↓
应用与工具
↓
操作系统:执行与资源管理、权限检查、隔离
↓
硬件

智能体隐藏完成目标所需的软件操作细节;操作系统提供完成软件操作所需的资源管理与受保护机制。 两层都涉及调度、状态和资源管理,但管理对象与权限层次不同。

评论

Lazysheep