一、操作系统概述
1.1 操作系统定义与作用
操作系统是管理和控制计算机硬件与软件资源的系统软件,作为用户与计算机硬件之间的接口,为用户和应用程序提供良好的运行环境。
1.2 操作系统的主要功能
-
资源管理:高效管理CPU、内存、I/O设备等硬件资源
-
程序控制:控制程序执行,改善人机交互
-
环境优化:合理组织工作站配置,提升系统性能
1.3 操作系统的基本特性
并发性 (Concurrency)

-
定义:多个进程在同一时间段内交替执行
-
实现:通过时间片轮转、优先级调度等机制
-
与并行区别:并发是宏观上的同时,微观上交替;并行是真正的同时执行
共享性 (Sharing)
-
资源共享方式:
-
互斥共享:如打印机、磁带机(临界资源)
-
同时访问:如磁盘、内存(可分时复用)
-
虚拟性 (Virtualization)
-
核心技术:SPOOLing(假脱机)技术
-
实现原理:使用物理设备模拟虚拟设备
-
应用示例:
-
虚拟内存:小内存运行大程序
-
虚拟打印机:多用户共享打印设备
-
异步性 (Asynchronism)
-
定义:多个进程以不可预知的速度向前推进
-
原因:资源竞争、调度算法、外部事件等
-
管理策略:同步机制(信号量、管程等)
二、进程管理
2.1 进程定义与组成
进程概念模型
┌─────────────────────────────────┐
│ 进程实体 │
├─────────────────────────────────┤
│ 程序块 │ 数据块 │ 进程控制块 │
│ (代码段) │ (数据段) │ (PCB) │
└─────────┴──────────┴───────────┘
进程与程序的区别
| 对比维度 | 程序 | 进程 |
|---|---|---|
| 存在形式 | 静态的指令集合 | 动态的执行过程 |
| 生命周期 | 永久存储 | 创建→运行→终止 |
| 组成结构 | 代码文件 | PCB+程序+数据 |
| 资源分配 | 不参与分配 | 资源分配的基本单位 |
2.2 进程状态与转换
三态模型及其转换

状态说明:
-
就绪态:具备运行条件,等待CPU分配
- 特点:所有资源就绪,只缺CPU
-
运行态:正在CPU上执行
- 特点:占用CPU,执行指令
-
等待态:等待某种事件发生
- 特点:不占用CPU,等待I/O等事件
2.3 进程同步与互斥
临界资源与临界区
// 临界区示例
void critical_section() {
enter_critical_section(); // 进入临界区
// 访问临界资源的代码
access_shared_resource();
leave_critical_section(); // 离开临界区
}
信号量与PV操作
信号量定义:
-
S ≥ 0:表示资源的可用数量
-
S < 0:|S|表示等待该资源的进程数
PV操作原语:
// P操作(wait操作,申请资源)
void P(semaphore S) {
S.value--;
if (S.value < 0) {
block(S.queue); // 阻塞当前进程
}
}
// V操作(signal操作,释放资源)
void V(semaphore S) {
S.value++;
if (S.value <= 0) {
wakeup(S.queue); // 唤醒等待进程
}
}
同步与互斥应用实例
// 互斥访问示例(信号量初始值=1)
semaphore mutex = 1;
// 进程A
P(mutex);
// 访问临界资源
critical_operation();
V(mutex);
// 进程B
P(mutex);
// 访问临界资源
critical_operation();
V(mutex);
// 同步示例(生产者-消费者问题)
semaphore empty = N; // 空缓冲区数量
semaphore full = 0; // 满缓冲区数量
semaphore mutex = 1; // 缓冲区互斥访问
// 生产者进程
producer() {
while (true) {
produce_item();
P(empty); // 等待空缓冲区
P(mutex); // 申请缓冲区访问权
put_item();
V(mutex); // 释放缓冲区访问权
V(full); // 增加满缓冲区计数
}
}
// 消费者进程
consumer() {
while (true) {
P(full); // 等待满缓冲区
P(mutex); // 申请缓冲区访问权
get_item();
V(mutex); // 释放缓冲区访问权
V(empty); // 增加空缓冲区计数
consume_item();
}
}
三、存储管理
3.1 存储管理目标与功能
主要功能:
-
内存分配与回收
-
地址映射
-
内存保护
-
内存共享
-
内存扩充(虚拟内存)
3.2 分区存储管理
固定分区分配
特点:
-
预先划分固定大小的分区
-
简单但内存利用率低
-
存在内部碎片
可变分区分配
分配算法对比:
| 算法名称 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 首次适应 | 从低地址开始找第一个足够大的空闲区 | 简单快速 | 低地址端易产生碎片 |
| 最佳适应 | 找能满足要求的最小空闲区 | 减少大空闲区分割 | 产生大量小碎片 |
| 最坏适应 | 找能满足要求的最大空闲区 | 减少小碎片产生 | 大空闲区被消耗 |
| 循环首次适应 | 从上一次查找位置开始循环查找 | 空闲区分布均匀 | 缺乏大空闲区 |
3.3 分页存储管理
基本原理
逻辑地址空间 物理地址空间
┌──────────┐ ┌──────────┐
│ 页0 │ │ 块2 │
│ 页1─────┼───────>│ 块5 │
│ 页2 │ │ 块8 │
│ 页3─────┼───────>│ 块1 │
└──────────┘ └──────────┘
页表
地址转换过程
逻辑地址 = 页号 + 页内偏移
↓
查页表获取物理块号
↓
物理地址 = 物理块号 × 页大小 + 页内偏移
分页管理的优缺点:
-
优点:
-
内存利用率高
-
碎片少(仅存在页内碎片)
-
分配管理简单
-
-
缺点:
-
程序模块化性能较差
-
页表占用空间大
-
需要硬件支持(MMU)
-
3.4 段页式存储管理
结合分段与分页的优势
逻辑地址 = 段号 + 段内页号 + 页内偏移
↓
段表→找到段描述符
↓
页表→找到物理块号
↓
物理地址 = 物理块号 × 页大小 + 页内偏移
段页式特点:
-
优点:
-
结合分段和分页的优点
-
便于程序模块化管理
-
支持内存保护和共享
-
-
缺点:
-
地址转换复杂
-
硬件成本高
-
需要多次访存
-
3.5 虚拟存储技术
虚拟内存原理
关键技术
-
请求分页系统:
-
部分页面装入内存
-
页面置换算法(FIFO、LRU、OPT等)
-
缺页中断处理
-
-
页面置换算法对比:
算法 原理 优点 缺点 FIFO 淘汰最早进入的页面 实现简单 Belady异常 LRU 淘汰最近最久未使用的页面 性能较好 实现复杂 OPT 淘汰将来最长时间不用的页面 理论最优 无法实现 Clock 循环扫描,淘汰访问位为0的页面 折中方案 可能效率低
四、设备管理
4.1 设备管理功能
核心任务:
-
设备分配与回收
-
设备驱动与控制
-
设备无关性实现
-
提高设备利用率
4.2 SPOOLing技术(假脱机)
SPOOLing系统组成
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 输入井 │←──┤输入进程│←──│ 输入设备 │
└─────────┘ └─────────┘ └─────────┘
↓
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 输出井 │───→│输出进程│───→│ 输出设备 │
└─────────┘ └─────────┘ └─────────┘
SPOOLing技术特点:
-
虚拟设备:将独占设备变为共享设备
-
速度匹配:缓解CPU与I/O设备速度差异
-
提高利用率:设备可被多个进程共享使用
4.3 设备分配策略
分配方式:
-
静态分配:进程运行前分配所需全部设备
-
优点:简单,不会死锁
-
缺点:设备利用率低
-
-
动态分配:进程运行中根据需要分配
-
优点:设备利用率高
-
缺点:可能产生死锁
-
五、文件管理
5.1 文件目录结构
树形目录结构
根目录 /
/ | \
bin home etc
/ \
user1 user2
/ \
docs downloads
路径表示
-
绝对路径:从根目录开始的完整路径
- 示例:
/home/user1/docs/report.txt
- 示例:
-
相对路径:从当前目录开始的路径
- 示例:当前在
/home/user1,docs/report.txt
- 示例:当前在
5.2 文件存储管理
位示图管理
// 位示图示例:用位表示磁盘块使用情况
#define DISK_BLOCKS 1024
#define BITMAP_SIZE (DISK_BLOCKS / 8)
unsigned char bitmap[BITMAP_SIZE];
// 分配磁盘块
int allocate_block() {
for (int i = 0; i < BITMAP_SIZE; i++) {
for (int j = 0; j < 8; j++) {
if (!(bitmap[i] & (1 << j))) {
bitmap[i] |= (1 << j);
return i * 8 + j;
}
}
}
return -1; // 无空闲块
}
// 释放磁盘块
void free_block(int block_no) {
int i = block_no / 8;
int j = block_no % 8;
bitmap[i] &= ~(1 << j);
}
索引文件结构
文件控制块(FCB)
┌─────────────┐
│ 文件属性 │
├─────────────┤
│ 直接索引 │──→数据块0
├─────────────┤ 数据块1
│ 一级间接索引│──→索引块──→数据块...
├─────────────┤
│ 二级间接索引│──→索引块→索引块→数据块...
└─────────────┘
六、操作系统的现代发展
6.1 操作系统发展趋势
-
微内核架构:将核心功能最小化
-
分布式操作系统:管理多台计算机资源
-
实时操作系统:保证任务截止时间
-
嵌入式操作系统:资源受限环境优化
6.2 操作系统性能指标
-
吞吐量:单位时间内完成的工作量
-
响应时间:从提交请求到得到响应的时间
-
周转时间:从作业提交到完成的时间
-
资源利用率:CPU、内存、I/O设备的使用效率