【操作系统笔记】OS_内存管理_连续内存分配(03)

Page content

这一篇整理了操作系统的内存管理_连续内存分配相关的内容。

1.操作系统和内存够

1.1 操作系统的内存管理方式

  1. 抽象
    逻辑地址空间
  2. 保护
    独立地址空间
  3. 共享
    访问相同内存
  4. 虚拟化
    更大的地址空间

1.2 操作系统中管理内存的不同方法

  • 程序重定位(relocation)
  • 分段(segmentation)
  • 分页(paging)
  • 虚拟内存(virtual memeory)
  • 目前多数系统(如linux)采用按页式虚拟存储

1.3 实现高度依赖硬件

  • 与计算机存储架构紧耦合
  • MMU(内存管理单元):处理CPU存储访问请求的硬件

1.4 地址空间和地址生成

1.4.1 地址空间的定义

  • 物理地址空间 –硬件支持的地址空间
    起始地址0, 直到MAXsys
  • 逻辑地址空间 – 在CPU运行的进程看到的地址
    起始地址0, 直到MAXprog

1.4.2 逻辑地址生成

程序(xx.c) =编译=> (xx.s) =汇编=> (xx.o) =链接=> (.exe) =载入=> 操作系统内存

1.4.3 过程

  1. CPU
  • ALU:需要逻辑地址的内存内容
  • MMU: 进行逻辑地址和物理地址的转换
  • CPU控制逻辑:给总线发送物理地址请求
  1. 内存
  • 发送物理地址的内容给CPU
  • 或接受CPU数据到物理地址
  1. 操作系统
  • 建立逻辑地址LA和物理地址PA的映射

2.连续内存分配

2.1 内存碎片问题

空闲内存不能被利用

  • 外部碎片:在分配单元之间的未被使用内存
  • 内部碎片:在分配单元内部的未被使用内存

2.2 分区的动态分配

当程序被加载执行时,分配一个进程指定大小可变的分区(块,内存块),分区的地址是连续的

分配策略

第一适配

分配n个字节,使用第一个可用的空间比n大的空闲块。

  1. 原理&实现
  • 空闲分区列表按地址顺序排序
  • 分配过程时,搜索第一个合适的分区
  • 释放分区是,检查释放可与临近的空闲分区合并
  1. 优点
  • 简单
  • 在高地址空间有大块的空间分区
  1. 缺点
  • 外部碎片
  • 分配大块时较慢
最佳适配

分配n字节分区时,查找并使用不小于n的最小空闲分区

  1. 原理&实现
  • 空闲分区列表安装大小排序
  • 分配时,查找一个合适的分区
  • 释放时,查找并且合并临近的空闲分区(如果找到)
  1. 优点
  • 大部分分配的尺寸比较小时,效果很好
  • 可避免大的空间分区被拆分
  • 可减小外部碎片的大小
  • 相对简单
  1. 缺点
  • 外部碎片
  • 释放分区较慢
  • 容易产生好多无用的小碎片
最差适配

分配n字节,使用尺寸不小于n的最大空闲分区

  1. 原理&实现
  • 空闲分区列表按由大到小排序
  • 分配时,选最大的分区
  • 释放时,检查释放可与临近的空闲分区合并,进行可能的合并,并调整空闲分区列表顺序
  1. 优点
  • 中等大学的分配较多时,效果最好
  • 避免出现太多的小碎片
  1. 缺点
  • 释放分区较慢
  • 外部碎片
  • 容易破坏大的空闲分区,因此后续难以分配大的分区

2.3 压缩式碎片整理

  • 重置程序以合并孔洞
  • 要求所有程序是动态可重置的
  • 议题:何时重置?开销?

2.4 交换式碎片整理

  • 运行程序需要更多的内存
  • 枪战等待的程序&回收他们的内存

欢迎大家的意见和交流

email: li_mingxie@163.com