操作系统(2) —— 物理内存(连续非连续)的管理

操作系统(2) —— 物理内存(连续/非连续)的管理

一. 计算机体系结构

  • 基本硬件结构:CPU内存外设(O/I)。
  • 内存的层次结构:CPU(访问寄存器和cache,速度较快),内存(主存/物理内存,容量很大,速度较慢)。
  • OS完成的目标:
    • 抽象:访问连续的地址空间,即逻辑地址空间
    • 保护:独立的地址空间
    • 共享:访问相同内存
    • 虚拟化:更多的地址空间,暂时不用的数据放入硬盘(虚拟内存)
  • 在OS中管理内存的不同方法
    • 程序重定位
    • 分段
    • 分页
    • 虚拟内存
    • 按需分页虚拟内存
  • 实现高度依赖于硬件
    • 必须知道内存架构
    • MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求

二. 地址空间/地址生成

1. 地址空间定义
  • 物理地址空间:硬件支持的地址空间。包括起始地址和长度。
  • 逻辑地址空间:一个运行的程序所拥有的内存范围。
2. 地址生成
  • 逻辑地址生成:编译、汇编、链接、载入。
  • 物理地址生成:由逻辑地址映射而来,由OS控制。
3. 地址安全检查
  • 建立一个表(map),规定访问地址的区域。

三. 连续内存分配

1. 内存碎片问题:空闲内存不能被使用
  • 外部碎片:在分配单元之间的未使用内存。
  • 内部碎片:在分配单元中的未使用内存。
2. 简单的内存管理方法——分区的动态分配
  • 当一个程序准许运行在内存中时,分配一个连续的区间。
  • 分配一个连续的内存区间给运行的程序以访问数据。
3. 分配策略
  • 首次适配:使用地址排序中第一个满足分配请求的空闲内存块。

    优势:简单,易于产生较大的空闲块;

    缺点:容易产生外部碎片;不确定性。

  • 最优适配:使用最适合满足分配请求的空闲块。

    优势:当大部分分配是小尺寸时非常有效;比较简单。

    缺点:产生外部碎片;重分配慢;易产生多个没用的微小碎片。

  • 最差适配:使用最大的可用空闲块。

    优点:分配是中等尺寸时,效果最好

    缺点:重分配慢;多个外部碎片;易于破坏大的空闲块以致大分区无法被分配。

4. 压缩式碎片整理
  • 重置程序以合并孔洞;
  • 要求所有程序是 动态可重置 的。
5. 交换式碎片整理
  • 运行程序需要更多的内存,则抢占下一个等待的程序,回收他们的内存;
  • 把抢占的程序存到硬盘(虚拟内存)里。

四. 非连续内存分配

连续内存分配的缺点:
  • 分配给一个程序的物理内存是连续的;
  • 内存利用率较低;
  • 存在内碎片、外碎片的问题。
非连续内存分配的优点:
  • 一个程序的物理地址空间是非连续的;
  • 更好的内存利用和管理;
  • 允许共享代码与数据、库等;
  • 支持动态加载和动态链接。
非连续内存分配的缺点:
  • 如何建立虚拟地址和物理地址之间的转换:软件方案/硬件方案
  • 两种硬件方案:分段/分页
1. 分段——更好的分离和共享
  • 分段地址空间:将连续的逻辑地址空间分散到多个物理地址空间。
  • 分段寻址方案
    • 段访问机制:程序访问内存地址需要一个二维的二元组(段号和段内偏移)。
    • 逻辑地址分为两块,分别放段号和段内偏移,称为段表
2. 分页
  • 分页地址空间

    • 划分物理内存至固定大小的帧,大小是2的幂,如512、4096、8192。

      页帧(帧号/帧内偏移,可以计算出物理地址)

    • 划分逻辑地址空间至相同大小的页,大小是2的幂,如512、4096、8192。

      页内偏移的大小=帧内偏移大小

      页号大小 对应 帧号大小

    • 建立方案将逻辑地址转换为物理地址(pages to frames)

      • 页表
      • MMU/TLB
  • 页寻址方案

    • 页表保存了逻辑地址和物理地址之间的映射关系
    • 页映射到帧
    • 页是连续的虚拟内存(逻辑)
    • 帧是非连续的物理内存
    • 不是所有的页都有对应的帧
  • 页表

    • 每个运行的程序都有一个页表,属于程序运行状态,会动态变化。
    • 地址转换的实例:32kb的物理内存,每页1024bytes。
  • 性能问题(时间/空间)

    • 访问一个内存单元需要两次内存访问,分别用来获取页表项和访问数据
    • 页表可能非常大——多级页表、反向页表
  • TLB(Translation Look-aside Buffer)

    • 缓存近期访问的页帧转换表项
    • 使用关联内存实现,具备快速访问性能
    • 如果TLB命中,物理页号可以很快被获取;如果未命中,对应的表项被更新到TLB中。
  • 多级页表的问题:大地址空间问题,前向映射页表变得繁琐

    不是让页表与逻辑地址空间的大小对应,而是让页表与物理地址的大小对应。导致逻辑地址空间的增长速度快于物理地址空间。

    • 解决:反向页表。 反过来,用物理地址空间(帧)做索引,寻找逻辑地址空间(页),占空间小。

      • 使用页寄存器:每个帧和一个寄存器关联,寄存器内容包括此帧是否被占用、对应的页号和保护位。
    • 优点:转换表大小相对于物理内存来说很小,转换表的大小与逻辑地址空间的大小无关。

      缺点:需要的信息对调了,即根据帧号找页号。实现时设计成本大,硬件成本高,容量小。

    • 将 页寄存器 变为 基于哈希(hash) 查找 的方案,可节省空间,但多了一个计算哈希函数的硬件。

发布了76 篇原创文章 · 获赞 30 · 访问量 5835

猜你喜欢

转载自blog.csdn.net/weixin_45926367/article/details/104776547