系统分析师第五课:进程通信-死锁-存储管理-固定分页分段
系统分析师核心知识点:进程通信、死锁、线程与存储管理详解
在系统分析师的备考中,操作系统中的进程通信、死锁处理、线程特性及存储管理是核心考点,涉及大量原理性知识和实际应用场景。本文将系统梳理这些知识点,帮助考生理清脉络、掌握重点。
本节课的学习内容思维导图见下图:
一、进程间的通信
进程间通信(IPC)是指进程之间的信息交换,根据交换信息量和效率可分为低级和高级两种方式。
1. 分类依据与特点
- 定义:进程之间的信息交换,交换信息量可多可少,核心是协调进程行为。
- 分类标准:按通信效率和复杂度分为低级方式和高级方式。
2. 低级通信方式
- 典型代表:PV操作(基于信号量的同步互斥机制)。
- 存在问题:
- 编程难度高:需用户自行实现同步与互斥逻辑,对用户不透明。
- 效率低下:操作不当易引发死锁,通信效率低。
- 适用场景有限:仅适合简单的短信息交换(如临界资源控制)。
3. 高级通信方式
高级方式由系统提供完整机制,降低编程复杂度,适合复杂场景:
-
共享存储:
- 实现原理:进程通过共享特定数据结构或存储区直接交换数据。
- 特点:直接访问内存,通信效率极高。
- 应用场景:需频繁交换大量数据的场景(如视频处理中多进程共享帧数据)。
-
消息传递:
- 基本单位:以“消息”为单位(包含数据和控制信息)。
- 实现方式:通过系统提供的原语(如send发送、receive接收)完成通信。
- 优势:编程简单,系统封装了通信细节,支持跨机通信。
-
管道通信:
- 本质:通过共享“管道文件”(pipe文件)实现的半双工通信。
- 工作流程:
- 写进程以字符流形式将数据写入管道。
- 读进程从管道中按顺序读取数据。
- 特点:需建立读写进程的连接,仅支持单向数据传输(半双工)。
二、死锁
死锁是进程并发执行中因资源竞争导致的“永久阻塞”状态,是操作系统设计的难点。
1. 核心概念
- 定义:进程等待永远不会发生的事件时产生的阻塞状态。当多个进程陷入死锁,会导致系统整体死锁。
- 类比:进程资源图中所有节点均为阻塞节点(无进程可继续执行)。
2. 死锁的必要条件(缺一不可)
- 互斥条件:进程请求的资源具有排他性(如打印机,同一时间仅一个进程使用)。
- 占有等待:进程持有部分资源的同时,等待其他资源。
- 非剥夺性:系统不能强制回收已分配给进程的资源。
- 循环等待:进程间形成资源请求环路(如P1等P2的资源,P2等P1的资源)。
3. 死锁的解决措施
根据处理阶段不同,分为预防、避免、检测与解除三类:
(1)预防死锁
- 核心思想:破坏四个必要条件中的至少一个。
- 实现方法:
- 设置资源超时释放机制(破坏“非剥夺性”)。
- 允许系统强制剥夺资源(破坏“非剥夺性”)。
- 要求进程一次性申请所有资源(破坏“占有等待”)。
(2)避免死锁
- 核心思想:在资源分配前预判安全性,仅当分配后系统仍安全时才分配。
- 典型算法:银行家算法(类比贷款风控,预先计算安全路径)。
- 工作原理:通过计算“安全序列”(所有进程可按此序列完成执行),确保资源分配不会导致死锁。
(3)检测与解除死锁
- 检测机制:定期运行死锁检测程序,通过资源分配图判断是否存在死锁。
- 解除方法:
- 强制剥夺部分进程的资源并分配给死锁进程。
- 终止部分死锁进程(按优先级或代价最小原则)。
4. 资源计算(常考公式)
- 最大死锁资源数:
n×(r-1)
(n为进程数,r为单个进程的最大资源需求。此时每个进程持有r-1个资源,系统无剩余资源,必发生死锁)。 - 最小安全资源数:
n×(r-1)+1
(确保至少一个进程能获得全部资源并完成,释放资源后供其他进程使用,避免死锁)。
5. 案例应用
例题1:死锁不发生的条件
题目:3个进程,每个进程最多需要5个资源,求系统至少需要多少资源才能保证不发生死锁?
解析:
最小安全资源数 = 3×(5-1)+1 = 13,故答案为13。
例题2:信号量取值范围
题目:系统有3台打印机,用信号量S控制访问,求S的取值范围及初始值。
解析:
- 初始值=打印机数量=3。
- 最小值=3-n(n为进程数,负值表示等待队列中的进程数)。
- 答案:取值范围为3,2,1,0,-1,…,-(n-3);初始值为3。
例题3:银行家算法
题目:已知总资源、已分配资源和各进程需求,计算剩余资源及安全序列。
解析:
- 剩余资源=总资源-已分配资源(如总资源(10,5,3),已分配(8,5,2),则剩余(2,0,1))。
- 安全序列需满足每个进程的需求≤剩余资源,且进程完成后释放的资源可继续供其他进程使用(如B)。
三、线程
线程是进程的“轻量级”执行单元,是现代操作系统提高并发效率的关键。
1. 引入线程的原因
传统进程存在两大属性:资源分配单位和调度单位,导致创建/切换开销大。线程将这两大属性分离:
- 进程:作为资源分配单位(持有内存、文件等资源)。
- 线程:作为调度单位(负责执行,开销远小于进程)。
2. 线程的资源特性
- 独有资源:程序计数器、寄存器组、栈指针、线程控制块(TCB)。
- 共享资源:进程的公共数据、全局变量、代码段、文件描述符等。
- 并发问题:多线程共享资源时需通过锁机制(如互斥锁)避免数据混乱(如多个线程同时修改共享变量)。
四、存储管理
存储管理负责内存的分配、回收和地址转换,核心目标是提高内存利用率和访问效率。
1. 分区存储
- 整存特性:进程所需内存需整体分配后才能执行。
(1)固定分区
- 特点:内存预先划分为大小固定的区域(如8GB内存分为100MB/区)。
- 问题:内部碎片(进程需求小于分区大小,如50MB进程分配100MB分区,浪费50MB)。
(2)可变分区
- 特点:按需动态划分内存(50MB进程分配50MB空间)。
- 问题:外部碎片(频繁分配与回收后产生的细小空闲块,如1MB残块无法被利用)。
(3)分区分配算法
- 首次适应:按地址顺序查找首个能满足需求的空闲块。
- 最佳适应:查找与需求大小最接近的空闲块(最小碎片)。
- 最差适应:选择最大的空闲块(减少碎片产生)。
- 循环首次适应:从上次分配位置继续查找(均衡空闲块使用)。
2. 分页存储
- 核心思想:基于程序局部性原理,将进程和内存按固定大小(如4KB)分为“页”和“块”,通过页表映射逻辑地址与物理地址。
- 优缺点:
- 优点:利用率高,碎片小,分配及管理简单
- 缺点:抖动现象——异常情况:页数增加反而降低效率(与缓存机制相反)
(1)页地址与转换
1)逻辑地址与物理地址的概念
- 本质区别:逻辑地址是内存中的页地址(如第4页),物理地址是外存中的页框/页帧地址,两者大小相同但编号独立。
- 转换必要性:程序运行时需将外存页框调入内存页,必须建立地址映射关系才能正确执行
- 典型场景:4GB内存按4KB分页时,会产生2^20个页,对应需要20位页号
2)页地址的组成
- 基本结构:由页号(高位)和页内地址(低位)组成,类似"省份+门牌号"的层次结构
- 地址示例:逻辑地址"04256"中,"04"为页号,"256"为页内偏移量
3)页号的计算与位数确定
-
计算原理:页号位数由总页数决定,满足n位可表示2^n个页的数学关系
-
实例演算:
-
关键公式:页号位数=log2(内存总量/页大小),注意单位统一换算为字节
4)页内地址的计算与位数确定
- 确定依据:页内地址位数由单页大小决定,4KB页对应12位地址(
) - 地址特性:在地址转换过程中保持不变,直接作为物理地址的偏移量部分
- 验证方法:若页内地址超过页大小(如12位地址值>4095),则说明地址非法
5)逻辑地址到物理地址的转换过程
转换步骤:
- 分离逻辑地址的页号和页内地址
- 通过页表查询该页号对应的物理块号
- 将物理块号与原页内地址拼接成物理地址
- 边界检查:需先验证页号是否超出页表长度寄存器值,防止越界访问
- 硬件支持:依赖页表地址寄存器和页表长度寄存器完成快速查询
(2)页面置换算法
当内存不足时,需置换页面,常用算法:
- OPT(最佳置换):淘汰未来最久不使用的页(理想算法,仅作理论基准)。
- FIFO(先进先出):淘汰最早进入内存的页(简单但可能产生“抖动”)。
- LRU(最近最少使用):淘汰最近最少使用的页(符合局部性原理,性能接近OPT),需要维护访问时间戳或移动页面到队列头。
置换策略细节
- 淘汰优先级:
最近未被访问的页面(无论是否修改)
最近未被修改的页面(避免频繁写回外存)- 性能对比:
LRU实际性能最接近OPT,但实现开销较大
FIFO实现简单但可能产生抖动(频繁的页面调入调出)- 硬件支持:LRU需要为每个页设置访问位,定期清零以识别"最近"访问
(3)快表(TLB)
- 本质:页表的高速缓存,存储当前活跃页面的映射关系。
- 作用:加速地址转换(命中时仅需1次Cache+1次内存访问,未命中时需2次内存访问)。
- 硬件特性:
– 由相联存储器(CAM)组成,支持按内容并行查找。
– 物理存放在Cache中,访问速度远快于内存。 - 访问流程:
– 快表命中时:只需1次Cache访问+1次内存访问
– 慢表访问:需要2次内存访问(先查页表再取数据)
-类比关系:
– 快表与页表的关系 ≈ Cache与主存的关系
– 快表(TLB)相当于页表的"Cache版"
** 应用案例**
-
例题1:地址转换物理地址判定
- 解题步骤:
根据页面大小确定页内偏移位数(4KB=→12位)
16进制地址拆分:低3位(12bit)为页内偏移,高位为页号
查页表获取物理块号(本例页号1→块号3)
组合物理块号与原页内偏移(3D16H) - 进制技巧:
每4位二进制对应1位16进制
12位偏移量正好对应3位16进制数 - 变式提醒:
若偏移量非12位需二进制转换
十进制地址需先转二进制再拆分 - 答案:B.3D16H
- 解题步骤:
-
** 例题2:页面淘汰策略判断**
- 状态位解读:
状态位0表示页面不在内存(如页号1)
访问位1表示最近被访问过(页号0/2/3)
修改位0表示未修改(仅页号3) - 淘汰原则:
优先淘汰最近未访问的页面(LRU思想)
若都被访问过,则淘汰未修改过的页面(减少I/O开销) - 实战技巧:
注意题目未说明算法时默认采用类LRU策略
修改位为0的页面替换代价最小 - 答案:D.3
- 状态位解读:
3. 分段存储
- 核心思想:按逻辑功能(如代码段、数据段、栈段)划分进程,段长可变,通过段表记录段的基址和长度。
(1)地址转换
- 逻辑地址:由“段号+段内偏移”组成。
- 转换过程:通过段号查段表得到基址,基址+段内偏移=物理地址(需检查偏移是否超出段长,防越界)。
(2)优缺点
- 优点:共享性好(如多个进程共享代码段)、模块独立性强(便于修改和更新)。
- 缺点:外部碎片严重(内存利用率低)。
4. 段页式存储
- 混合架构:先分段(按逻辑),再在段内分页(按固定大小)。
- 地址结构:段号+段内页号+页内偏移。
- 地址转换:需两次查表(段表→页表→物理地址)。
- 优缺点:兼具分段的逻辑性和分页的高效性,但硬件开销大(需TLB加速)。
- ** 1. 例题:逻辑地址转物理地址判定 **:
5. 虚拟存储
- 核心思想:将内存与外存结合,为进程提供远大于实际内存的“虚拟空间”(如4GB内存+1TB硬盘→1TB虚拟内存)。
- 实现基础:程序局部性原理(90%时间访问10%数据)。
- 关键技术:
- 请求调页:仅将当前需要的页调入内存。
- 页面置换:内存不足时置换不常用页面。
- 典型问题:
- 缺页中断:访问未调入内存的页时触发(处理耗时10-20ms)。
- 抖动:频繁的页面调入调出(FIFO算法易出现,分配块增多但缺页率上升)。
总结
本文涵盖了进程通信、死锁、线程及存储管理的核心知识点,其中:
- 进程通信需区分低级与高级方式的适用场景;
- 死锁需掌握必要条件、解决措施及资源计算;
- 存储管理的重点是分页/分段的地址转换及页面置换算法。
建议结合例题强化理解,尤其注意死锁判定、地址转换及页面置换的实际应用,这些均为系统分析师考试的高频考点。