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

第三章 内存

第三章 内存

内存基础知识

image-20250605091536293

内存管理概念

image-20250605092427824

内存保护

image-20250605092457474

内存映像

image-20250605093745083

image-20250605093809827

覆盖与交换

image-20250605095841225

内存分配(连续分配方式)

image-20250605150348046

内存分配(动态分配方式)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分页存储管理

image-20250607120452687

  1. 进程的逻辑地址空间——页表——内存块——内存的关系
1. 进程拥有独立的进程空间,每一个进程空间也是“页管理”
2. 页表:页号(隐含)+块号。块既对应逻辑空间的页,也对应物理空间的页(内存块)
3. 内存块:在物理空间的“页框”
三者的“页”(最小管理单元)对应,但是大小可能不同。页表更倾向于一种记录型的映射结构注意:页表项并不是和内存块一一对应的
如何实现地址转换

image-20250607122156025

2的整数次幂使得在计算页号和偏移量时更快

逻辑地址转换为物理地址的四件事:
1. 由 逻辑地址 获得页号、页内偏移量
2. 通过 页表 获得 页块
3. 计算 物理地址 = 页块 * 页大小 + 页内偏移量
注意:由于 乘法 的效率很低,所以当使用 2 的整数次幂时,会发现,在 32 位计算机中,页大小为 4KB = 2的12次方,因此,32位的前20位为整数位(页号),后12位为余数位(页内偏移量)的二进制表示。因此可以更快的拆分出 页号 + 页内偏移量

image-20250607123536667

页表寄存器:存储 页表 的 页表起始地址 和 页表长度(一种基于内存的地址变换机构)

页表项大小的进一步探讨:

image-20250607124507860

具有快表的地址变换结构:(基于 cpu高速缓存)

image-20250607125235598

访存:访问内存(查询慢表、目标内存单元速度相同)

两级页表

image-20250607130754815

这里其实说的是:页表结构也需要存在内存中,每一个页表很大,一个页表项一般为4kb,一般页表大小为2的20次方个页表项。一个内存块就是一个页面但是:如果整个页表都存在内存中,就需要一段很大的连续内存,而且可能产生页内碎片。这与我们离散型存储的思想相悖。所以我们对页表页进行离散式的存储。设置二级页表,用于记录 页表号、内存块号。根据页表号找到对应的内存块。然后就是典型的单级页表的查询方式了。这样情况下,原先的地址,比如32位:前10位为 页表号,中间10位为 页号,后面11位 为页内偏移量

image-20250607131642889

总结:

image-20250607132130287

分段存储管理

分段和分页的对比

image-20250607140816788

image-20250607141117350

段页式管理方式

image-20250607141621512

image-20250607141823710

虚拟内存

image-20250608123850379

请求分页管理方式

image-20250608125317462

页面置换算法

目的:选择换出哪个页面。尽量降低缺页率。

缺页率 = 缺页次数 / 整体请求页数量

最佳置换算法(opt)

简单的说,就是换出长时间不会被访问的页面。(理想化:因为不能预知之后要使用的页面序列)

性能最好(条件:可预知)

image-20250608130349422

先进先出置换算法(FIFO)

算法性能最差

image-20250608130829606

最近最久未使用置换算法(LRU)

image-20250608131114615

时钟置换算法(CLOCK)

image-20250608132538966

页面分配策略

image-20250608133429621

何时调入?

image-20250608134525377

何处调入?

image-20250608134747275

工作集:为了解决抖动(颠簸)现象

抖动(颠簸)现象:页面频繁换入换出的现象。主要原因:分配给进程的物理块不够

image-20250608135051658

image-20250608135107659

内存映射文件

image-20250608140843027

操作系统内存管理总结

一、内存管理概述

  • 核心目标:高效、安全地分配和管理内存资源,提升内存利用率,保障多进程间内存隔离与数据安全。
  • 关键功能:内存分配与回收、内存保护、地址映射、内存扩充(虚拟内存技术)。

二、内存管理基本技术

(一)连续分配管理方式

  1. 单一连续分配
    • 特点:内存分为系统区和用户区,仅允许单个用户进程运行。
    • 优缺点:实现简单,但内存利用率极低,仅适用于单道程序环境。
  2. 固定分区分配
    • 特点:将内存划分为若干固定大小的分区,每个分区可装入一个进程。
    • 优缺点:支持多道程序,存在内部碎片(分区内未被利用空间),分区大小固定导致大进程无法装入。
  3. 动态分区分配(可变分区分配)
    • 特点:根据进程实际需求动态划分内存分区,分区大小随进程变化。
    • 内存分配算法
      • 首次适应算法:从低地址开始查找第一个足够大的空闲分区,简单高效,易产生碎片。
      • 最佳适应算法:选择与进程大小最接近的空闲分区,易产生大量微小碎片。
      • 最坏适应算法:选择最大的空闲分区,减少碎片但可能导致大分区被分割。
    • 优缺点:无内部碎片,但存在外部碎片(分散的小空闲分区),需紧凑技术(内存移动合并碎片)辅助。

(二)非连续分配管理方式

  1. 分页存储管理
    • 基本思想:将内存和进程划分为大小相等的页(内存物理块)和页框,通过页表实现逻辑地址到物理地址的映射。
    • 关键概念
      • 页号:逻辑地址高位,对应页表索引。
      • 页内偏移量:逻辑地址低位,确定页内具体位置。
      • 页表:记录页号与物理块号的映射关系,存于内存,查询需一次访存。
    • 优缺点:无外部碎片,内存利用率高,支持虚拟内存;存在页内碎片(每页最后部分可能未被利用),地址转换开销较大。
  2. 分段存储管理
    • 基本思想:按程序逻辑结构(如代码段、数据段、栈段)划分为若干段,每段有独立段名和长度,通过段表映射逻辑段到物理内存。
    • 关键概念
      • 段号:逻辑地址高位,标识段类型和功能。
      • 段内偏移量:逻辑地址低位,确定段内具体位置。
      • 段表:记录段号、段长和基址,检查偏移量是否越界(段内偏移量≤段长)。
    • 优缺点:便于程序模块化设计和共享,支持动态链接;存在外部碎片,地址转换需两次访存。
  3. 段页式存储管理
    • 基本思想:结合分段和分页,先将进程分为若干段,每段再划分为若干页,通过段表和页表实现两级地址映射。
    • 地址转换过程:逻辑地址→段表(查段对应的页表基址)→页表(查页对应的物理块号)→物理地址,需三次访存(引入快表可加速)。
    • 优缺点:兼具分段和分页优势,减少碎片,支持动态链接和共享;结构复杂,地址转换开销大。

三、虚拟内存技术

(一)核心思想

  • 基于局部性原理(进程在一段时间内集中访问部分区域),允许进程仅装入部分页面 / 段到内存,其余数据存于外存,运行时按需调入(请求调页 / 段),实现 “内存不足时运行大程序” 的效果。

(二)关键技术

  1. 请求分页存储管理

    • 与分页的区别:页表增加状态位(是否在内存)、访问位(记录访问频率)、修改位(是否被修改),支持缺页中断(进程访问不在内存的页时触发,调入页面)。

    • 页面置换算法

      :当内存无空闲块时,选择淘汰页面的策略。

      • 最佳置换算法(OPT):理论上最优,淘汰最远将来才使用的页,无法实现,用于性能对比。
      • 先进先出算法(FIFO):淘汰最早进入内存的页,可能产生 “Belady 现象”(增加物理块数反而使缺页率上升)。
      • 最近最久未使用算法(LRU):淘汰最长时间未访问的页,需记录页访问时间,硬件成本高(可用寄存器或栈实现近似算法)。
      • Clock 算法(最近未使用算法,NRU):通过访问位标记页是否被访问,淘汰未被访问的页,简单高效。
  2. 请求分段存储管理:类似请求分页,增加段的状态位和缺段中断,支持段的动态增长和共享。

(三)内存扩充效果

  • 逻辑地址空间远大于物理内存空间,提升多道程序并发度,但需注意缺页 / 段率过高导致的 “抖动”(频繁内外存交换,系统性能急剧下降)。

四、内存保护机制

  • 目的:防止进程越权访问或破坏其他进程 / 系统内存数据。
  • 实现方式
    • 界限寄存器:设置上下界寄存器,检查进程访问地址是否在合法范围内。
    • 存储键与访问权字节:内存块分配存储键,进程持访问权字节(密钥),匹配则允许访问。
  • 与地址映射结合:在地址转换过程中同步检查访问权限,确保安全。

五、总结对比

管理方式连续 / 非连续主要碎片类型典型应用场景
单一连续分配连续无(仅单进程)早期单用户系统(如 DOS 雏形)
固定分区分配连续内部碎片简单多道程序系统(如早期批处理系统)
动态分区分配连续外部碎片需动态适应进程大小的系统(需紧凑技术)
分页管理非连续页内碎片(内部)现代操作系统基础(如 Linux 内存管理基础)
分段管理非连续外部碎片支持程序模块化的系统(如早期 UNIX)
段页式管理非连续页内碎片复杂系统(如 Windows 早期版本)
虚拟内存(请求分页 / 段)非连续页内碎片 + 外部碎片(通过置换算法缓解)多任务、大程序运行的现代系统(如 Linux、Windows)

重点总结:内存管理围绕 “高效分配、安全隔离、虚拟扩充” 展开,连续分配简单但碎片问题严重,非连续分配(分页 / 分段)是主流,虚拟内存技术突破物理内存限制,保护机制确保系统稳定。不同场景需权衡碎片、性能和实现复杂度选择合适方案。

相关文章:

  • AUTOSAR实战教程--DoIP_01_配置项解释
  • 在VSCode中使用Ultralytics扩展
  • vscode 配置 latex
  • 港理工:LLM推理与推荐能力集成
  • 机器学习 [白板推导](四)[降维]
  • 计数排序_桶排序
  • hot100 -- 10.回溯系列
  • 电流舵DAC设计(二)
  • Vue-Leaflet地图组件开发(三)地图控件与高级样式设计
  • Python学习——排序
  • Java严格模式withResolverStyle解析日期错误及解决方案
  • AI架构师修炼之道
  • 深入解析Java21核心新特性(虚拟线程,分代 ZGC,记录模式模式匹配增强)
  • 指针的使用——字符、字符串、字符串数组(char*)
  • Cesium快速入门到精通系列教程八:时间系统
  • Razor编程RenderXXX相关方法大全
  • ChatterBox - 轻巧快速的语音克隆与文本转语音模型,支持情感控制 支持50系显卡 一键整合包下载
  • Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
  • 异步跟栈 webpack
  • 【Elasticsearch】映射:fielddata 详解
  • 网站备案升级/最新足球消息
  • 做网站怎么收费/seo学院
  • 有没有免费网站制作/百度网站排名优化
  • 长沙app开发费用多少/中国seo
  • 撰写网站栏目规划/杭州seo博客
  • 怎么样让网站网址有图标/深圳seo专家