王道操作系统笔记
王道操作系统笔记
操作系统
1.1_1 操作系统的概念、功能和目标
作为用户和计算机硬件之间的接口
提供的功能
- 命令接口
- 联机命令接口
- 脱机命令接口
- 程序接口
- GUI(图形用户界面)
- Windows
- iOS
- Android
目标
- 方便用户使用
1.1_2 操作系统的特征
| 特征 | 定义 |
|---|---|
| 并发 | 多个事件交替发生(宏观同时发生、微观交替进行) |
| 并行 | 多个事件同时发生 |
| 共享 | 两种资源共享方式: 1. 互斥共享方式(如打印机) 2. 同时共享方式(如文件) |
| 虚拟 | 物理实体映射为多个逻辑实体: - 空分复用技术(如虚拟内存) - 时分复用技术(如CPU分时) |
| 异步 | 进程执行走走停停,速度不可预知(需并发性支持) |
1.1_3 操作系统的发展与分类
发展阶段
- 手工操作阶段
- 纸带机(用户独占全机、人机速度矛盾)
- 批处理阶段
- 单道批处理系统(外围机→磁带)
- 多道批处理系统(操作系统出现)
- 分时操作系统
- 轮流处理作业
- 无法处理紧急任务
- 实时操作系统
- 硬实时系统(严格时间限制)
- 软实时系统(允许偶尔犯错)
- 其他类型
- 网络操作系统
- 分布式操作系统
- 个人计算机操作系统
1.1_4 操作系统的运行机制与体系结构
运行机制
- 两种指令
- 特权指令(仅内核态可用)
- 非特权指令
- 两种处理器状态
- 核心态(root权限)
- 用户态
- 两种程序
- 内核程序(运行在核心态)
- 应用程序
操作系统内核功能
- 时钟管理
- 中断处理
- 原语(原子性操作)
- 资源管理
- 进程管理
- 存储器管理
- 设备管理
体系结构
| 类型 | 特点 |
|---|---|
| 大内核 | 主要功能模块运行在核心态(如Linux) |
| 微内核 | 仅保留最基本功能(如Windows NT) |
1.1_5 中断和异常
- 中断机制的作用:用户态→核心态的唯一途径
- 中断分类:
graph LR A[中断] --> B[内中断(异常)] A --> C[外中断] B --> D[陷阱(trap)] B --> E[故障(fault)] B --> F[中止(abort)]
1.1_6 系统调用
- 概念:应用程序通过系统调用请求OS服务
- 与库函数的区别:
系统调用 库函数 OS直接提供的接口 可能封装系统调用 需切换到核心态 运行在用户态
2.1_1 进程的定义、组成、组织方式、特征
定义
- 进程:程序的一次执行过程
组成
- PCB(进程存在唯一标志)
- 程序段
- 数据段
组织方式
- 链接方式(队列指针)
- 索引方式(索引表)
特征
- 动态性、并发性、独立性、异步性、结构性
2.1_2 进程的状态与转换
进程状态
| 状态 | 描述 | 资源占用情况 |
|---|---|---|
| 运行态 | 占有CPU并执行指令(单核CPU同一时刻只能有一个进程处于运行态) | CPU√,其他资源√ |
| 就绪态 | 具备运行条件,但无空闲CPU(等待调度) | CPU×,其他资源√ |
| 阻塞态 | 等待某事件(如I/O完成) | CPU×,其他资源× |
| 创建态 | 正在分配PCB、程序段和数据段 | - |
| 终止态 | 资源回收中 | - |
状态转换
stateDiagram-v2
[*] --> 创建态
创建态 --> 就绪态
就绪态 --> 运行态
运行态 --> 就绪态: 时间片用完
运行态 --> 阻塞态: 主动等待资源
阻塞态 --> 就绪态: 事件发生
运行态 --> 终止态: 异常终止/完成
2.1_3 进程控制
进程控制
用原语实现进程控制
原语操作
- 更新PCB信息
- 将PCB插入目标队列
- 资源分配/回收
关键原语
| 原语类型 | 触发事件 | 操作 |
|---|---|---|
| 创建原语 | 用户登录、作业调度、服务请求 | 申请空白PCB → 分配资源 → 初始化PCB → 加入就绪队列 |
| 终止原语 | 正常结束、异常终止、外界干预 | 回收内存 → 撤销PCB |
| 阻塞原语 | 等待资源/其他进程 | 运行态 → 阻塞态(主动) |
| 唤醒原语 | 等待事件发生 | 阻塞态 → 就绪态(被动) |
| 切换原语 | 时间片耗尽、高优先级进程到达 | 保存当前进程上下文 → 恢复目标进程上下文 |
2.1_4 进程通信
通信方式对比
| 方式 | 实现原理 | 特点 |
|---|---|---|
| 共享存储 | 分配共享空间,通过PV操作互斥访问 | - 基于数据结构(低级) - 基于存储区(高级) |
| 消息传递 | 直接/间接发送消息(含消息头和消息体) | - 直接通信:消息挂载到目标进程 - 间接通信:通过信箱中转 |
| 管道通信 | 半双工通信,遵循“写满才能读”的互斥规则 | 适用于父子进程通信,容量固定 |
2.1_5 线程概念与多线程模型
线程 vs 进程
| 特性 | 线程 | 进程 |
|---|---|---|
| 单位 | 基本CPU执行(调度)单位 | 资源分配单位(不管系统中是否有线程) |
| 系统开销 | 切换代价小(同进程内线程共享进程资源) | 切换代价大(需保存整个上下文) |
| 并发性 | 同一进程的线程可并发 | 进程间并发 |
| 通信方式 | 同进程内 线程 不通过内核 | 进程间通信 需通过内核 |
| 状态 | 只有三种状态转化:运行、就绪、阻塞 | 五种:运行、阻塞、就绪、创建、终止 |
| 独立运行 | 不能独立运行,依赖进程 | 独立 |
- ✅ 一个进程可创建一个或多个线程
- 进程是资源分配单位,可包含多个执行流(线程)
- ✅ 一个线程可创建一个或多个线程
- 线程可派生同级线程(如pthread_create)
- ❌ 一个线程可创建一个或多个进程
- 线程共享进程资源,无权直接创建进程(需通过进程级API如fork)
- ✅ 一个进程可创建一个或多个进程
- 通过fork/spawn等系统调用实现
线程实现方式
| 对比维度 | 用户线程 (User-Level Thread) | 内核线程 (Kernel-Level Thread) | 组合方式 (Hybrid Model) |
|---|---|---|---|
| 实现位置 | 用户空间 | 内核空间 | 用户空间 + 内核空间 |
| OS感知性 | 内核不可感知 | 内核直接管理,设置了一个线程控制块(TCB) | 用户线程动态绑定内核线程 |
| 线程映射模型 | 多对一(多个用户线程→1个内核线程) | 一对一(1用户线程→1内核线程) | 多对多(灵活绑定) |
| 创建/销毁开销 | ⚡ 极低(无需内核介入) | ⚠️ 高(需系统调用) | 🔄 中等(用户线程管理+内核线程绑定) |
| 阻塞问题 | 🚫 单线程阻塞→整个进程阻塞 | ✅ 单线程阻塞→可调度同进程其他线程 | ✅ 通过内核线程避免完全阻塞 |
| 多核并行能力 | ❌ 多个同进程用户线程只有一个运行(其实就是不能一个进程在多个cpu上) | ✅ 支持多线程并行 | ✅ 根据内核线程支持 |
| 调度单位 | 进程级调度 | 线程级调度 | 混合调度(用户线程池+内核线程调度) |
- ✅ 若系统中只有用户级线程,则处理机调度单位是进程
- 用户线程内核不可感知关键问题解析
线程实现模型
graph LR
A[用户级线程 ULT] -->|映射| B[内核级线程 KLT]
C[多对一模型] --> D[并发度低]
E[一对一模型] --> F[开销大]
G[多对多模型] --> H[平衡并发与开销]
2.2_1 处理机调度的概念与层次
三级调度对比
| 调度层次 | 操作对象 | 频率 | 功能 |
|---|---|---|---|
| 高级调度 | 作业(外存→内存) | 低 | 创建PCB,决定作业调入/调出 |
| 中级调度 | 挂起进程(内存↔外存) | 中 | 提高内存利用率,管理挂起队列 |
| 低级调度 | 进程(分配CPU) | 高(ms级) | 最基本的调度,决定进程执行顺序 |
挂起状态
- 就绪挂起:进程在外存,可被调入内存执行
- 阻塞挂起:进程在外存等待事件
2.2_2 进程调度时机与方式
调度触发条件
| 场景 | 能否调度 | 原因 |
|---|---|---|
| 处理中断过程中 | × | 内核态不可抢占 |
| 内核程序临界区 | × | 访问就绪队列等关键数据结构 |
| 原子操作(原语) | × | 操作不可分割 |
| 进程主动阻塞/终止 | √ | 主动放弃CPU |
| 时间片耗尽 | √ | 被动剥夺CPU |
调度方式
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 非抢占式 | 进程主动放弃CPU | 批处理系统 |
| 抢占式 | 强制剥夺CPU(响应紧急任务) | 实时/分时系统 |
最后更新于