计算机操作系统 · 期末复习
来源:2026年6月26日复习课录音整理。考试时间 7月10日,题型为 选择、填空、判断、解答、计算分析题(含代码题)。
第一章:操作系统引论
1.1 操作系统的定义 🏗️
操作系统是计算机硬件上覆盖的第一层软件,对硬件的扩充,是其他软件运行的基础。
一句话理解:操作系统就是夹在"硬件"和"应用软件"中间的那一层,没有它,你写的程序根本跑不起来。
💡 类比:把计算机想象成一栋大楼。硬件是地基和钢筋水泥,操作系统是水电管道和电梯系统,各种APP是房间里的家具。没有水电管道,你搬家具进来也没法住。
1.2 操作系统的四大目标
| 目标 | 含义 | 通俗理解 |
|---|---|---|
| 方便性 | 提供编译命令和封装好的接口 | 你不用自己写读写硬盘的代码,调个 fopen 就行 |
| 有效性 | 提高系统资源利用率 + 提高系统吞吐量 | CPU 别闲着,单位时间处理越多任务越好 |
| 可扩充性 | 模块化结构,方便添加新功能 | 像搭乐高,想加什么模块就插上 |
| 开放性 | 遵循 OSI 等开放标准 | 不同厂商的设备能互联互通 |
⚠️ 有效性的两个指标 = 提高资源利用率 + 提高系统吞吐量。吞吐量 = 单位时间内处理的数据/任务量。
1.3 操作系统的作用(三个)
- OS 作为用户与计算机硬件系统之间的接口 — 你是通过 OS 跟硬件打交道的
- OS 作为计算机系统资源的管理者 — CPU、内存、硬盘、外设都归它管
- OS 实现了对计算机资源的抽象 — 把复杂的硬件细节隐藏起来,给你一个简洁的视图
1.4 操作系统的发展过程(重点三个)
一、批处理系统
单道批处理系统
- 一个任务执行完,下一个任务才能开始
- 缺点:CPU 闲置时间太长,资源利用率低
- 就像食堂只有一个打饭窗口,大家排一条队
多道批处理系统 ⭐(重点)
- 引入"后备队列"概念
- 核心八字:==宏观并行,微观串行==
什么是"宏观并行,微观串行"?
- 单核 CPU 下,同一时刻只能执行一条指令(微观串行)
- 但程序切换极快,让你感觉多个程序在同时跑(宏观并行)
- 典型场景:程序 A 在做 IO(不占 CPU)时,程序 B 可以用 CPU 计算
💡 类比:你一边烧水(IO),一边切菜(CPU计算)。同一时刻你只能在干一件事(微观串行),但你在烧水和切菜之间快速切换,看起来像在同时做(宏观并行)。
二、分时系统 ⭐
- 两个关键词:==人机交互==、==时间片轮转==
- 把 CPU 时间切成小片,每个用户轮着用
- 交互性强——每用户都能感觉自己独占了一台电脑
三、实时系统
- 关键词:==实时性==
- 分为两类:
| 类型 | 特点 | 例子 |
|---|---|---|
| 硬实时 | 错过截止时间会产生严重后果 | 导弹拦截系统、核电站控制系统 |
| 软实时 | 偶尔超时只是影响体验 | 刷抖音、看视频、打游戏 |
1.5 操作系统的基本特性(四个)⭐
并发 → 共享 → 虚拟 → 异步
⚠️ 其中最基本的两个是:并发 和 共享
| 特性 | 含义 |
|---|---|
| 并发 | 一段时间内多个程序宏观上同时运行 |
| 共享 | 多个进程共享系统资源 |
| 虚拟 | 通过某种技术把物理实体映射成逻辑对应物 |
| 异步 | 进程以不可预知的速度向前推进,但相同环境下结果一定相同 |
⭐ 异步性的核心理解:每个进程执行的速度不确定(这次快下次慢),但只要同步机制完善、环境相同,多次运行的结果是一样的。就像你每天走不同的路线去学校,速度虽有快慢,但最终都能到同一个教室。
1.6 重要计算题:多道批处理最小时间 ⭐
题目原型(课后习题第27题):
P2 比 P1 晚 5ms 到达:
- P1:计算 60ms → IO 80ms → 计算 20ms
- P2:计算 120ms → IO 40ms → 计算 40ms 求完成两个作业的最少时间(不考虑调度和切换时间)。
解题关键四原则:
- 计算使用 CPU,IO 操作不占 CPU
- 先到先执行
- 一个进程做 IO 时,另一个进程可以用 CPU
- 不同设备的 IO 可并行
⚠️ 这不是"原题",数字会变。必须掌握方法,不能背数字。
第二章:进程管理
2.1 前趋图 ⭐(必考)
本质:==有向无环图(DAG)==
- 初始节点:没有前驱的节点(如上图 P1)
- 终止节点:没有后继的节点(如上图 P5)
- P1→P2:P1 是 P2 的前驱,P2 是 P1 的后继
⚠️ 考法:前趋图不会单独考,会和信号量 + PV 操作一起考——给你一个前趋图,让你用 PV 操作实现它。
2.2 进程的定义
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
简单说:进程 = 正在运行的程序。
2.3 进程的四个基本特征
| 特征 | 含义 |
|---|---|
| 动态性 | ⭐最基本特征!进程有生命周期(创建→运行→终止) |
| 并发性 | 多个进程可在一段时间内同时运行 |
| 独立性 | 进程是独立运行和资源分配的单位 |
| 异步性 | 进程以不可预知的速度推进 |
⚠️ 别搞混!
- 操作系统的四个特性:并发、共享、虚拟、异步(最基本两:并发+共享)
- 进程的四个特性:动态、并发、独立、异步(最基本:动态性)
2.4 进程 vs 程序(必背)⭐
| 区别维度 | 进程 | 程序 |
|---|---|---|
| ① 动静 | 活的(有生命周期) | 死的(写完就不变) |
| ② 位置 | 内存中 | 外存中(硬盘) |
| ③ 关系 | 程序的一次实例/执行 | 进程的"模板" |
| ④ 组成 | 程序是进程的代码部分 | — |
考试写前三条就能拿满分。举个栗子:你打开三个 Word 文档——程序只有一个(Word软件),但进程有三个(每个文档窗口是一个独立进程)。
2.5 进程的三状态模型 ⭐
| 转换 | 触发条件 |
|---|---|
| 就绪 → 执行 | 调度(CPU 分配给你了) |
| 执行 → 就绪 | 中断(时间片到了 / 被更高优先级抢走) |
| 执行 → 阻塞 | 等待 IO(需要读硬盘、等网络数据等) |
| 阻塞 → 就绪 | IO 完成(数据准备好了) |
⚠️ 注意:就绪 ⇄ 执行是双向箭头(可以互相转换)。但阻塞不能直接到执行,必须先回到就绪。
💡 类比:把 CPU 想成一个讲台,进程是想发言的同学。就绪=举手准备发言,执行=站在讲台讲话,阻塞=出去上厕所了(要等回来重新举手才能发言)。
2.6 PCB(进程控制块)
PCB 是进程存在的唯一标志,常驻内存。
- 每个进程有一个唯一的 PID(进程ID),存于 PCB 中
- 就像每个人都有唯一的身份证号,PCB 就是进程的"身份证"
PCB 的三种组织方式
| 方式 | 结构 | 查找效率 |
|---|---|---|
| 线性方式 | 所有 PCB 排成一张表 | O(n),要遍历 |
| 链接方式 | 按状态分成链表,指针串联 | 中等 |
| 索引方式 | 建索引表,直接定位 | O(1),最好但实现复杂 |
2.7 进程通信
直接通信 vs 间接通信:
- 直接:进程A 直接 → 进程B(用 send/receive 原语)
- 间接:进程A → 信箱 → 进程B(中间多一个载体)
阻塞/非阻塞 send & receive
| 组合 | 通信类型 |
|---|---|
| 阻塞 send + 阻塞 receive | 同步通信(双方都得等) |
| 非阻塞 send + 阻塞 receive | 异步通信(发了就不管) |
阻塞 send = 快递员必须亲手交给你才走;非阻塞 send = 快递员放快递柜就走。
2.8 线程
线程在进程内部,一个进程可以有多个线程。
进程 vs 线程(六维度比较,写四个满分)⭐
| 比较维度 | 进程 | 线程 |
|---|---|---|
| ① 调度单位 | 资源拥有单位 | 调度和分派的基本单位 |
| ② 并发性 | 进程间可并发 | 同一进程内多线程也可并发 |
| ③ 拥有资源 | 拥有系统资源 | 本身不拥有,仅少量独立运行资源 |
| ④ 独立性 | 不同进程独立性强 | 同进程线程间独立性低很多 |
| ⑤ 系统开销 | 进程切换开销大 | 线程切换开销小(约1/10) |
| ⑥ 多处理器 | — | 同进程多线程可分布到多处理器 |
第三章:处理机调度
3.1 调度的三个层次
| 层次 | 别称 | 调度对象 |
|---|---|---|
| 高级调度 | 长程调度 / 作业调度 | 作业 |
| 中级调度 | — | (了解即可) |
| 低级调度 | 短程调度 / 进程调度 | 进程 |
低级调度(进程调度)可分为:抢占式 和 非抢占式
3.2 三个关键时间指标
| 指标 | 公式 | 含义 |
|---|---|---|
| 周转时间 | 完成时间 - 到达时间 | 从提交到完成的全部时间 |
| 带权周转时间 | 周转时间 / 服务时间 | 周转时间相对于实际服务时间的倍数 |
| 等待时间 | 周转时间 - 服务时间 | 在就绪队列中等待的时间 |
平均周转时间 = 所有作业周转时间之和 / 作业数量
3.3 各类调度算法
1. 先来先服务(FCFS)
- 谁先到先执行谁
- 护航效应:大卡车(长进程)堵在前面,后面的小汽车(短进程)全被压速
- 有利于长进程和 CPU 密集型,不利于短进程和 IO 密集型
2. 短作业优先(SJF)
- 谁执行时间短就优先谁
- 可分抢占式/非抢占式(看题目描述)
3. 优先级调度算法 ⭐
| 优先级类型 | 特点 |
|---|---|
| 静态优先级 | 出生就定死,调度过程不变 |
| 动态优先级(响应比) | 等待时间越长优先级越高 |
⭐ 响应比公式:
重点掌握:基于静态优先级的抢占式调度算法。做题要列出表格:开始时间、完成时间、周转时间、等待时间。
4. 时间片轮转(RR)
- 专为分时系统设计
- 每个进程用完时间片就让出 CPU,下一个上
- 公平但上下文切换频繁
5. 多级反馈队列(MLFQ)⭐ 重点
规则:
- 所有新进程先进入队列1(优先级最高,时间片最短)
- 在队列1中没完成的 → 降级到队列2,以此类推
- 抢占:队列2、3的进程运行时,队列1来了新进程 → 立即抢占
- 优先级自上而下递减,时间片自上而下递增
⚠️ 考试重点:基于抢占式的优先级调度 + 多级反馈队列,必须会画表格计算。
第四章:进程同步与死锁
4.1 临界资源与临界区
| 概念 | 定义 |
|---|---|
| 临界资源 | 一次只允许一个进程使用的资源 |
| 临界区 | 进程中涉及临界资源的代码段 |
💡 打印机就是典型临界资源——两个人同时打印会乱套。
4.2 进程同步的四个准则 ⭐
- 空闲让进 — 没人用你就进
- 忙则等待 — 有人在用你就等
- 有限等待 — 不能无限等下去
- 让权等待 — 等的时候别占着 CPU(主动放弃CPU)
4.3 信号量 + PV 操作 + 前趋图 ⭐(必考代码题)
通用步骤:
① 定义信号量:前趋图中每条边对应一个信号量,初值全部设为 0 ② 用 cobegin / coend 包裹(co = concurrent,表示并发) ③ P 操作(wait):等待前驱完成;V 操作(signal):通知后继可以执行
| 写法一 | 写法二 | 含义 |
|---|---|---|
| wait(S) | P(S) | 申请信号量(等待) |
| signal(S) | V(S) | 释放信号量(通知) |
核心规则:前驱节点执行完后 V,后继节点执行前 P。
4.4 死锁
死锁的四个必要条件
- 互斥 — 资源一次只能一个用
- 请求和保持 — 拿了资源A还想要资源B,不放A
- 不可抢占 — 不能强行抢别人的资源
- 循环等待 — A等B,B等C,C等A,形成环
⚠️ 四个条件全部满足才会死锁,打破任意一个就能预防死锁。
4.5 银行家算法 ⭐(必考计算分析题)
标准两问套路:
第一问:系统是否安全?
- 用银行家算法找一个安全序列
- 找到 → 安全 ✅
- 找不到 → 不安全 ❌
第二问:某进程请求资源,能否分配?
- ① 比较:Request ≤ Need?(请求 ≤ 还需资源)
- ② 比较:Request ≤ Available?(请求 ≤ 当前剩余资源)
- ③ 更新表格后重新找安全序列
- 能找到 → 可以分配 ✅
- 找不到 → 拒绝请求 ❌
⚠️ 每问最后都要文字总结回答,这有分!
实验:两个必会的代码 ⭐
实验 9:创建子进程(fork)
在 Linux C 环境下用 fork() 创建子进程,分别打印主进程和子进程的 PID。
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
printf("创建进程失败\n");
} else if (pid == 0) {
// 子进程:fork() 在子进程中返回 0
printf("我是子进程,PID = %d\n", getpid());
} else {
// 父进程:fork() 在父进程中返回子进程的 PID
printf("我是父进程,PID = %d,子进程PID = %d\n", getpid(), pid);
}
return 0;
}💡
fork()调一次,返回两次——父进程拿到子进程的PID,子进程拿到0。
实验 12:创建线程
创建子线程,打印线程 ID。
#include <stdio.h>
#include <pthread.h>
void* thread_func(void* arg) {
printf("我是子线程,线程ID = %lu\n", pthread_self());
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL); // 等待子线程结束
printf("主线程结束\n");
return 0;
}⚠️ 编译线程程序需要加
-lpthread:gcc program.c -o program -lpthread
快速自查清单 ✅
| 序号 | 知识点 | 掌握了吗 |
|---|---|---|
| 1 | 操作系统的定义(一句话) | ☐ |
| 2 | OS四大目标、三大作用 | ☐ |
| 3 | 多道批处理:宏观并行微观串行 | ☐ |
| 4 | 分时系统(交互+时间片)vs 实时系统(硬/软) | ☐ |
| 5 | OS四特性(最基本两:并发+共享)vs 进程四特性(最基本:动态) | ☐ |
| 6 | 多道批处理最小时间计算题 | ☐ |
| 7 | 前趋图 = 有向无环图 | ☐ |
| 8 | 进程 vs 程序(三条区别) | ☐ |
| 9 | 进程三状态图(就绪⇄执行→阻塞→就绪) | ☐ |
| 10 | PCB 是进程存在的唯一标志 | ☐ |
| 11 | 进程通信(直接/间接,阻塞/非阻塞) | ☐ |
| 12 | 进程 vs 线程(六选四) | ☐ |
| 13 | 周转时间、等待时间、带权周转时间公式 | ☐ |
| 14 | 静态优先级 vs 动态优先级(响应比) | ☐ |
| 15 | 多级反馈队列调度规则 | ☐ |
| 16 | 临界区、进程同步四准则 | ☐ |
| 17 | 信号量 + PV 实现前趋图 | ☐ |
| 18 | 死锁四必要条件 | ☐ |
| 19 | 银行家算法(两问套路) | ☐ |
| 20 | fork() 和 pthread_create() 代码 | ☐ |
📅 考试时间:7月10日,加油!💪