写点什么

3. 操作系统—物理内存管理

作者:小呆鸟
  • 2022 年 8 月 29 日
    北京
  • 本文字数:1910 字

    阅读完需:约 6 分钟

💝操作系统物理内存管理

  • 计算机体系结构/内存分层体系

  • 地址空间 &地址生成

  • 连续内存分配

🎍1. 计算机体系结构/内存分层体系

🎉1.1 计算机体系结构

  • CPU

  • 内存

  • IO


1660983194920.png


🎉1.2 内存层次结构

  • 内存层次结构:CPU 访问内存的指令或数据所处的具体位置。


1660983210545.png


从 CPU 寄存器到磁盘,读写速度不断降低,存储数据容量大小不断增大。

  • 运行内存(主存):主存是在程序运行时所需要保存的数据空间

  • 磁盘(虚拟内存):用于持久化数据保存的空间

  • CPU 可以访问的内存包括两大类 : 寄存器 / cache(L1 缓存 / L2 缓存) (操作系统不可以访问这俩部分)

CPU访问的层次|___CPU寄存器/L1缓存|___L2缓存|___主存(程序访问)|___磁盘(程序访问)

🎉1.2 内存管理目标

  • 抽象:逻辑地址空间

  • 保护:独立地址空间

  • 共享:访问相同内存

  • 虚拟:更多的地址空间

有俩个地址空间:物理空间和逻辑空间主存是一种物理地**址空间,程序是一种逻辑地址空间


1660983264588.png


🎉1.3 内存管理方法

  • 程序重定位

  • 分段

  • 分页

  • 虚拟内存

  • 按需分页虚拟内存

实现高度依赖于硬件

  • 内存结构

  • MMU(内存管理单元):硬件组件负责处理 CPU 的内存访问要求

操作系统是一个软件,在完成上述功能时,同时需要依赖硬件

🎍2. 地址空间 & 地址生成

  • 地址空间定义

  • 地址生成

  • 地址安全检查

🎉2.1 地址空间的定义

  • 物理地址空间:硬件支持的地址空间,包括主存和硬盘(虚拟内存)

  • 逻辑地址空间:一个运行在程序所拥有的的内存范围,地址空间是一维的

  • 逻辑地址空间和物理地址空间有映射关系,这是靠OS来维持的,每一个逻辑空间都有对应的物理地址空间,可能对应内存也可能对应硬盘


1660983324908.png


逻辑地址生成

1660983350802.png


  • 逻辑地址生成,.c 程序经过编译得到.s 文件,再经过汇编得到.o 文件,此时变量名和函数名都会转换成从 0 开始的连续地址空间,然后再经过链接把多个.o 文件生成.exe 文件,此时因为链接了其他函数库,所以地址会产生偏移,从图中可以看到程序地址从 0-75 变成了 0-175。链接产生的地址 0-175 就是逻辑地址。

  • 然后 loader 程序会把硬盘中的.exe 文件加载到内存中运行。但是问题在于,假设另外一个程序的地址为 0-200,那这两个程序因为地址冲突就不能一起执行了,为了解决这个问题,MMU 会对程序的逻辑地址进行映射,转换成对应的物理地址。这样子,两个不同程序会映射到不同的物理地址上,避免冲突。所以程序加载时候会对逻辑地址进行重定位,转换成物理地址。

逻辑地址如何对应到物理地址


1660983393421.png


  1. 当 CPU 执行某条指令,它的 ALU 需要这个程序的内容,带着参数(逻辑地址)

  2. CPU 会查找这个逻辑地址的映射表 MMU,是否存在对应的物理地址,如果没有就会到内存中的 map 中找

  3. 找到后,他会给主存发送请求,请求该物理地址的内容

  4. 主存灰浆内容通过总线传到 CPU,然后 CPU 执行指令。

操作系统在此之前,需要建立逻辑地址和物理地址的映射关系,这个关系可以放到CPU,由内存缓存,加快访问过程

安全检查(程序之间不能干扰,确保程序访问合法)

  • 操作系统确保每一个程序有效访问的地址空间(起始地址+偏移量)

  • CPU 执行指令会查找 MAP,MAP 会指出访问的逻辑地址,看逻辑地址是否满足该限制(当超出该长度,就是不合法访问,这是 OS 来维护的),当不满足 CPU 就会产生一个系统异常,让 OS 进一步处理


1660983446098.png


🎍3. 连续内存分配

  • 内存碎片问题

  • 分区的动态分配

  • 第一适配

    最佳适配

    最差适配

  • 压缩式碎片整理

  • 交换式碎片整理

🎉3.1 内存碎片问题

  • 内存碎片:给运行程序分配一块空间后,会出现一部分无法利用的空间。

  • 内存碎片分为:外部碎片内部碎片

    外部碎片:在分配单元之间无法使用的内存

    内部碎片:已经分配给了应用程序,但是它无法使用,单元分配之内,无法使用


1660983469342.png


🎉3.2 分区的动态分配

  • 程序从硬盘加载到内存,需要为他分配一块连续的空间

  • 程序在运行过程中需要访问数据,为他的数据分配内存


1660983537990.png


🔔3.2.1 首次适配

  • 在内存中找到第一个比需求大的空闲块, 分配给应用程序


1660983559147.png


🔔3.2.2 最优适配

  • 寻找整个空间块中,最适合满足需求的空间块(在内存中找到最小的空闲块, 分配给应用程序)

相比首次适配

  1. 为了避免份分割大的空间块

  2. 为了最小化外部碎片产生的尺寸


1660983575142.png


🔔3.2.3 最差适配

  • 在内存中找到最大的空闲块, 分配给应用程序

为了避免太多的微小的碎片

1660983600178.png


🔔3.2.4 3 种分配策略区别

这三种都是一些简单的内存管理算法,没有优劣,因为操作系统的分配是随机的。

🎉3.3 压缩式碎片整理

将运行程序所在的内存,在内存中移来移去,使得空闲的块变得连续

  1. 压缩式碎片整理

    重置程序以合并碎片

    要求所有程序是动态可重置的

    问题 :

    何时将程序重置 ? (在程序处于等待状态时才可以重置)

    需要考虑内存拷贝的开销

主要是利用软件,来进行程序重置

1660983624177.png


🎉3.4 交换式碎片整理

把当前没有运行的程序,把它所占的空间放在硬盘上,从而空出更多的空闲空间

  • 运行程序需要更多的内存时,抢占等待的程序并且回收它们的内存

  • 问题 :

    哪些程序应该被换入换出 ?

    什么时候进行换入和换出

    而且换入换出是以单个程序的大小为力度,此时开销大


1660983646984.png


用户头像

小呆鸟

关注

还未添加个人签名 2022.01.27 加入

还未添加个人简介

评论

发布
暂无评论
3. 操作系统—物理内存管理_操作系统_小呆鸟_InfoQ写作社区