资源管理(HL 拓展)学习笔记
各位计算机科学家好!欢迎来到主题 6:资源管理。本章对于理解操作系统 (OS) 的底层运作至关重要——它是机器背后的“大脑”,负责决定谁能获得什么,以及何时获得。
可以将操作系统想象成一家极其繁忙的工厂(计算机)的经理。工厂的机器(资源)有限,但工人(进程)众多且都在抢占资源。如果经理不能高效、公平地分配资源,工厂就会陷入混乱!
我们将深入剖析操作系统如何管理 CPU(调度)、内存(RAM),以及如何预防死锁等棘手问题。如果起初觉得这些概念比较抽象,别担心;我们会通过清晰的类比来揭开这些复杂系统的面纱。
1. 操作系统 (OS) 在资源管理中的角色
资源是指进程执行时所需的任何硬件或软件组件。由于系统通常同时运行多个进程,操作系统必须管理这些资源,以确保系统的稳定性、效率和公平性。
资源类型
- 处理器 (CPU): 中央计算单元。
- 内存 (RAM): 运行程序和存储数据的地方。
- I/O 设备: 打印机、硬盘、网卡、屏幕等。
- 文件/数据: 共享信息或数据库访问权限。
资源管理的目标
操作系统同时追求三个核心目标:
- 效率: 让资源保持忙碌(例如:提高 CPU 的利用率)。
- 公平: 确保每个进程都能获得合理的运行时间和资源份额。
- 安全/保护: 防止一个进程干扰另一个进程(例如:禁止访问或修改其他进程的内存空间)。
2. 处理器管理:调度算法
CPU 调度是一种功能,用于确定就绪队列中的哪个进程接下来获得 CPU 使用权以及使用时长。其主要目标是优化系统性能指标,如吞吐量(单位时间内完成的任务量)和响应时间(系统对输入做出反应的速度)。
调度算法的关键分类
我们将调度分为两类:
- 非抢占式: 一旦进程开始运行,它就会持续运行直到完成或主动释放 CPU(就像一场不能被打断的演讲)。
- 抢占式: 操作系统可以中断正在运行的进程,将 CPU 分配给更高优先级的任务(就像主管打断员工的工作)。
a) 先来先服务 (FCFS)
这是最简单的非抢占式算法。
- 原理: 严格按照进程到达的顺序进行服务。本质上是一个简单的队列 (FIFO)。
- 类比: 超市结账处的排队。
- 缺点: 容易产生护航效应 (Convoy Effect)。如果一个耗时很长的作业先到达,后续的所有短作业都必须等待很长时间,从而导致整体效率低下,平均等待时间长。
b) 最短作业优先 (SJN/SJF)
这是最小化平均等待时间的最佳算法。
- 原理: 调度程序挑选预计执行时间(突发时间)最短的作业。可以是非抢占式的,也可以是抢占式的(称为“最短剩余时间优先” - SRTF)。
- 类比: 先做完所有 5 分钟的小任务,再去处理那项需要 3 小时的大工程。
- 缺点: 需要“预知未来”(确切知道执行时间),这在实际系统中是不可能的。此外,它存在饥饿 (Starvation) 风险(如果小任务不断涌入,长任务可能永远无法运行)。
c) 优先级调度
根据指定的优先级执行作业。
- 原理: 每个进程被分配一个优先级数值(通常数值越小优先级越高)。CPU 分配给准备运行的最高优先级进程。
- 风险:饥饿。 如果高优先级任务源源不断地到来,低优先级进程可能会无限期等待。
- 解决方案:老化 (Aging)。 这是一种逐渐提高长时间排队进程优先级的方法。就像给排队已久的人发放一张“快速通行证”。
d) 轮询调度 (RR)
这是一种专为分时系统设计,旨在提供快速响应时间的抢占式算法。
- 原理: 每个进程被分配一小段 CPU 时间,称为时间片 (time quantum)(例如 10 毫秒)。如果进程未能在该时间内完成,它会被抢占并移动到就绪队列的末尾。
- 类比: 车道间快速切换的高速交通信号灯。每个人都有机会通行,即使时间很短。
- 关键考量: 时间片的大小至关重要。如果太大,RR 就退化为 FCFS;如果太小,进程切换(上下文切换)会消耗过多时间。
3. 内存管理技术
操作系统负责管理主内存 (RAM)。它必须跟踪内存的哪些部分正在被使用,向进程分配空间,并保护一个进程的内存免受其他进程的干扰。
a) 分页 (Paging)
分页是一种避免外部碎片(已分配内存块之间产生的浪费空间)的内存管理方案。
- 原理: 物理内存 (RAM) 被划分为大小固定的块,称为页帧 (frames)。逻辑内存(进程地址空间)被划分为同样大小的块,称为页 (pages)。
- 进程运行时,它的各个页会被映射到 RAM 中可用的页帧中。关键在于,这些页帧不需要在物理上连续。
- 地址转换: 操作系统使用页表 (Page Table) 将进程的逻辑地址(页号 + 偏移量)转换为物理地址(页帧号 + 偏移量)。
b) 分段 (Segmentation)
分段是基于程序逻辑结构来映射内存的方案。
- 原理: 程序被划分为大小不一的逻辑单元(段),对应于主代码、数据区、栈或子程序等组件。
- 这更符合程序员的管理习惯,但会导致外部碎片,因为段的大小各不相同,当它们结束时会在内存中留下不均匀的空洞。
c) 虚拟内存 (Virtual Memory)
虚拟内存是一项革命性的技术,即使程序只有一部分装入物理内存,也能正常运行。它创造了一种计算机拥有比实际物理内存更大 RAM 的假象。
- 原理: 它利用二级存储(磁盘空间)来保存当前未使用的程序部分。磁盘上的这部分区域通常被称为交换空间 (swap space)。
- 交换 (Swapping): 当进程请求一个目前在磁盘上的页/段时,操作系统会触发缺页中断 (page fault),将 RAM 中未使用的页换出到磁盘,并将所需的页调入 RAM。这个过程称为交换。
- 类比: 你的桌面(RAM)空间有限,只能放几本书(页)。虚拟内存就像你旁边有一个巨大的文件柜(磁盘),你可以随时根据需要交换书籍。感觉像是有无限的桌面空间,但交换过程比较慢!
- 冷知识: 过度的交换(系统大部分时间都在换页而非执行指令)被称为抖动 (thrashing),这会使计算机速度大幅下降。
4. 并发与死锁
当多个进程同时运行时(并发),它们经常需要共享资源。这种共享访问带来了操作系统必须处理的潜在问题。
a) 竞争条件与临界区
竞争条件 (Race Condition) 发生在当多个独立进程对共享资源的访问顺序或时机影响了执行结果时。
- 例子: 进程 A 和 B 同时试图增加共享变量 \(X\)。如果执行序列是:A 读取、B 读取、A 增加、B 增加,最终结果是错误的(只增加了 1 次,而不是 2 次)。
- 为了防止竞争条件,访问共享资源的代码段必须被视为临界区 (critical section)。
互斥 (Mutual exclusion) 是解决竞争条件的方案。它确保如果一个进程正在执行其临界区代码,则使用同一共享资源的其他进程不能同时执行其临界区。
b) 死锁 (Deadlock)
死锁是一种永久性的等待状态,其中两个或多个竞争进程在等待被对方持有的资源。它们谁也无法继续执行。
- 类比: 经典的“交通堵塞”,车辆陷入循环,每辆车都在等前面的车移动。
产生死锁的四个必要条件
只有当这四个条件同时成立时,才会发生死锁。打破其中任何一个条件都能防止死锁。
记忆口诀 (M-H-N-C):
- M: 互斥 (Mutual Exclusion): 涉及的资源必须是不可共享的(同一时间只有一个进程能使用)。(例如:打印机,而非只读数据)。
- H: 持有并等待 (Hold and Wait): 进程必须已经持有一个资源,同时又在等待获取其他进程持有的额外资源。
- N: 不可抢占 (No Preemption): 资源不能被强制从持有的进程中剥夺;必须由进程自愿释放。
- C: 循环等待 (Circular Wait): 必须存在一组进程 \(\{P_0, P_1, ..., P_n\}\),使得 \(P_0\) 等待 \(P_1\) 持有的资源,\(P_1\) 等待 \(P_2\) 持有的资源,以此类推,直到 \(P_n\) 等待 \(P_0\) 持有的资源。
死锁处理策略
操作系统使用不同的方法来管理死锁:
- 死锁预防: 在结构上确保四个必要条件中至少有一个永远不成立。(例如:要求进程一次性请求所有需要的资源,从而打破“持有并等待”条件。)
- 死锁避免: 操作系统动态检查资源分配状态,以确保维持在安全状态 (safe state)(即系统能够按某种顺序为每个进程分配资源而不产生死锁)。(最著名的算法是银行家算法。)
- 死锁检测与恢复: 允许死锁发生,通过资源分配图检测死锁,然后进行恢复。恢复通常涉及抢占(剥夺资源)或进程终止(杀死一个或多个进程以打破循环)。
恭喜你完成了资源管理的学习!理解这些概念对于真正领会现代操作系统的复杂性和鲁棒性至关重要。请继续练习调度算法并熟记死锁的四个条件!