Ⅴ. 连续内存分配

不羁的心 提交于 2019-11-30 09:29:43

计算机体系结构和内存层次

  • 计算机体系结构
  • 内存层次
  • 操作系统的内存管理方式

计算机体系结构

基本的分配和释放的管理要求。cpu高速缓存,存储管理单元(MMU),内存最小访问单位8bit;32位的意思是一次可以读写32位;高速缓存用来存放会重复使用的数据,用来提高效率;

内存层次

缓存速度最快,首先去缓存找数据,若未命中则去内存中找,若仍未命中则去外存(虚拟内存)中找,这三者速度差别很大。

操作系统的内存管理

知识点:我们希望的理想状态。逻辑存储单元。
存储管理要达到的效果:

  • 抽象:逻辑地址空间
  • 保护:独立地址空间
  • 共享:访问相同内存
  • 虚拟化:更大的地址空间

操作系统中采用的内存管理方式:

  • 重定位(relocation)
  • 分段(segmentation)
  • 分页(paging)
  • 虚拟存储(目前多数系统,如Linux,采用按需页式虚拟存储)

实现高度依赖硬件:

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

地址空间和地址生成

地址空间的定义

物理地址空间-硬件支持的地址空间(地址总线条数)。

  • 起始地址为0,知道MAXsysMAX_{sys}

逻辑地址空间-在CPU运行的进程看到的地址

  • 起始地址为0,直到MAXprogMAX_{prog}

地址是从哪里来的?

逻辑地址生成

在这里插入图片描述

图1:逻辑地址生成图示
#### 地址生成时机和限制 编译时: - 假设起始地址已知 - 如果起始地址改变,必须重新编译

加载时:

  • 如编译时起始位置位置,编译器需生成可重定位的代码
  • 加载时,生成绝对地址

执行时:

  • 执行时代码可移动
  • 需地址转换(映射)硬件支持

地址生成过程

CPU:

  • ALU:需要逻辑地址的内存内容
  • MMU:进行逻辑地址和物理地址的转换

内存:

  • 发送物理地址的内容给CPU
  • 或接受CPU数据到物理地址

操作系统:

  • 建立逻辑地址LA和物理地址PA的映射

地址检查

检查段的长度和偏移量是否为有效范围。

连续内存分配

连续内存分配和内存碎片

连续内存分配: 给进程分配一块不小于指定大小的连续的物理内存。
内存碎片: 空闲内存不能被利用。
外部碎片: 分配单元之间的未被使用的内存。
内部碎片: 分配单元内部的未被使用的内存,取决于分配单元大小是否要调整。

动态分区分配

动态内存分配:

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

操作系统需要维护的数据结构:

  • 所有进程的已分配分区
  • 空闲分区(Empty-blocks)

动态分区分配策略:

  • 最先匹配
  • 最优匹配
  • 最差匹配

最先匹配(First Fit Allocation)策略

思路:分配n个字节时,使用第一个可用的空间比n大的空闲块。
原理&实现:

  • 空闲分区列表按照地址顺序排序
  • 分配过程中,搜索一个合适的分区
  • 释放分区时,检查是否可与临近的空闲分区合并

优点:

  • 简单
  • 在高地址上有大块的空闲分区

缺点:

  • 外部碎片多
  • 分配大块时较慢

最佳匹配(Best Fit Allocation)策略

思路:分配n个字节时,查找并使用不小于n的最小空闲分区
原理&实现:

  • 空闲分区列表按照大小排序
  • 分配时,查找一个合适的分区
  • 释放时,查找并合并临近的空闲分区(如果找到)

优点: 大部分分配的尺寸较小时,效果很好

  • 可避免大的空闲分区被拆分
  • 可减小外部碎片的大小
  • 相对简单

缺点:

  • 外部碎片
  • 释放分区慢
  • 容易产生很多无用的小碎片

最差匹配(Worst Fit Allocation)策略

思路:分配n字节,使用尺寸不小于n的最大空闲分区。
原理&实现:

  • 空闲分区按从大到小排序
  • 分配时,选最大的分区
  • 释放时,检查是否可与临近的空闲分区合并,进行可能的合并,并调整空闲分区列表的顺序

优点:

  • 中等大小的分配较多时,效果最好
  • 避免出现太多的小碎片

缺点:

  • 释放分区较慢
  • 外部碎片
  • 容易破坏大的空闲分区,因此后续难以分配大的分区
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!