当前位置: 首页 > news >正文

系统分析师第五课:进程通信-死锁-存储管理-固定分页分段

系统分析师核心知识点:进程通信、死锁、线程与存储管理详解

在系统分析师的备考中,操作系统中的进程通信、死锁处理、线程特性及存储管理是核心考点,涉及大量原理性知识和实际应用场景。本文将系统梳理这些知识点,帮助考生理清脉络、掌握重点。

本节课的学习内容思维导图见下图:
在这里插入图片描述

一、进程间的通信

进程间通信(IPC)是指进程之间的信息交换,根据交换信息量和效率可分为低级和高级两种方式。

1. 分类依据与特点

  • 定义:进程之间的信息交换,交换信息量可多可少,核心是协调进程行为。
  • 分类标准:按通信效率和复杂度分为低级方式和高级方式。

2. 低级通信方式

  • 典型代表:PV操作(基于信号量的同步互斥机制)。
  • 存在问题
    • 编程难度高:需用户自行实现同步与互斥逻辑,对用户不透明。
    • 效率低下:操作不当易引发死锁,通信效率低。
    • 适用场景有限:仅适合简单的短信息交换(如临界资源控制)。

3. 高级通信方式

高级方式由系统提供完整机制,降低编程复杂度,适合复杂场景:

  • 共享存储

    • 实现原理:进程通过共享特定数据结构或存储区直接交换数据。
    • 特点:直接访问内存,通信效率极高。
    • 应用场景:需频繁交换大量数据的场景(如视频处理中多进程共享帧数据)。
  • 消息传递

    • 基本单位:以“消息”为单位(包含数据和控制信息)。
    • 实现方式:通过系统提供的原语(如send发送、receive接收)完成通信。
    • 优势:编程简单,系统封装了通信细节,支持跨机通信。
  • 管道通信

    • 本质:通过共享“管道文件”(pipe文件)实现的半双工通信。
    • 工作流程
      1. 写进程以字符流形式将数据写入管道。
      2. 读进程从管道中按顺序读取数据。
    • 特点:需建立读写进程的连接,仅支持单向数据传输(半双工)。

二、死锁

死锁是进程并发执行中因资源竞争导致的“永久阻塞”状态,是操作系统设计的难点。

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个页的数学关系

  • 实例演算:4GB内存(B)分4KB(B)页时,总页数=页,故需18位页号

  • 关键公式:页号位数=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算法易出现,分配块增多但缺页率上升)。

总结

本文涵盖了进程通信、死锁、线程及存储管理的核心知识点,其中:

  • 进程通信需区分低级与高级方式的适用场景;
  • 死锁需掌握必要条件、解决措施及资源计算;
  • 存储管理的重点是分页/分段的地址转换及页面置换算法。

建议结合例题强化理解,尤其注意死锁判定、地址转换及页面置换的实际应用,这些均为系统分析师考试的高频考点。

http://www.dtcms.com/a/279181.html

相关文章:

  • SpringMVC注解:@RequestParam 与 @PathVariable
  • 详解同步、异步、阻塞、非阻塞
  • 关于机械臂控制中的 MoveL 和 MoveJ 操作
  • Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例
  • FBRT-YOLO: Faster and Better for Real-Time Aerial Image Detection论文精读(逐段解析)
  • linux服务器换ip后客户端无法从服务器下载数据到本地问题处理
  • 学生管理系统(C++实现)
  • 13.梯度scharr与lapkacia算子
  • 成都,工业设备边缘计算如何落地?——“边缘智能”新解法!
  • Linux入门:从文件存储到常用命令详解
  • 从数据库到播放器:Java视频续播功能完整实现解析
  • simscape中坐标系和坐标变换Frames and Transforms
  • MySQL数据实时同步到Elasticsearch的高效解决方案
  • 小波变换 | 连续小波变换
  • Effective Modern C++ 条款10:优先考虑限域enum而非未限域enum
  • 安全架构中身份与访问管理体系设计
  • 基于Yolov8车辆检测及图像处理系统【有代码】
  • python多版本管理--pyenv
  • pyspark中map算子和flatmap算子
  • RAG优化
  • Mysql数据库学习--约束
  • 聚宽sql数据库传递
  • 非阻塞写入核心:asyncio.StreamWriter 的流量控制与数据推送之道
  • python+requests 接口自动化测试实战
  • 支付宝小程序代运营:专业助力提升运营效能
  • AI Agent和Agentic AI
  • 驱动开发系列60- Vulkan 驱动实现-SPIRV到HW指令的实现过程(1)
  • 【Bluedroid】蓝牙协议栈enable流程深度解析
  • Redis ①⑥-缓存
  • org.casic.javafx.control.PaginationPicker用法