计算机体系结构和内存层次
- 计算机体系结构
- 内存层次
- 操作系统的内存管理方式
计算机体系结构
基本的分配和释放的管理要求。cpu高速缓存,存储管理单元(MMU),内存最小访问单位8bit;32位的意思是一次可以读写32位;高速缓存用来存放会重复使用的数据,用来提高效率;
内存层次
缓存速度最快,首先去缓存找数据,若未命中则去内存中找,若仍未命中则去外存(虚拟内存)中找,这三者速度差别很大。
操作系统的内存管理
知识点:我们希望的理想状态。逻辑存储单元。
存储管理要达到的效果:
- 抽象:逻辑地址空间
- 保护:独立地址空间
- 共享:访问相同内存
- 虚拟化:更大的地址空间
操作系统中采用的内存管理方式:
- 重定位(relocation)
- 分段(segmentation)
- 分页(paging)
- 虚拟存储(目前多数系统,如Linux,采用按需页式虚拟存储)
实现高度依赖硬件:
- 与计算机存储架构紧耦合
- MMU(内存管理单元):处理CPU存储访问请求的硬件
地址空间和地址生成
地址空间的定义
物理地址空间-硬件支持的地址空间(地址总线条数)。
- 起始地址为0,知道
逻辑地址空间-在CPU运行的进程看到的地址
- 起始地址为0,直到
地址是从哪里来的?
逻辑地址生成
加载时:
- 如编译时起始位置位置,编译器需生成可重定位的代码
- 加载时,生成绝对地址
执行时:
- 执行时代码可移动
- 需地址转换(映射)硬件支持
地址生成过程
CPU:
- ALU:需要逻辑地址的内存内容
- MMU:进行逻辑地址和物理地址的转换
内存:
- 发送物理地址的内容给CPU
- 或接受CPU数据到物理地址
操作系统:
- 建立逻辑地址LA和物理地址PA的映射
地址检查
检查段的长度和偏移量是否为有效范围。
连续内存分配
连续内存分配和内存碎片
连续内存分配: 给进程分配一块不小于指定大小的连续的物理内存。
内存碎片: 空闲内存不能被利用。
外部碎片: 分配单元之间的未被使用的内存。
内部碎片: 分配单元内部的未被使用的内存,取决于分配单元大小是否要调整。
动态分区分配
动态内存分配:
- 当程序被加载可执行时,分配一个进程指定大小可变的分区(块,内存块)
- 分区的地址是连续的
操作系统需要维护的数据结构:
- 所有进程的已分配分区
- 空闲分区(Empty-blocks)
动态分区分配策略:
- 最先匹配
- 最优匹配
- 最差匹配
最先匹配(First Fit Allocation)策略
思路:分配n个字节时,使用第一个可用的空间比n大的空闲块。
原理&实现:
- 空闲分区列表按照地址顺序排序
- 分配过程中,搜索一个合适的分区
- 释放分区时,检查是否可与临近的空闲分区合并
优点:
- 简单
- 在高地址上有大块的空闲分区
缺点:
- 外部碎片多
- 分配大块时较慢
最佳匹配(Best Fit Allocation)策略
思路:分配n个字节时,查找并使用不小于n的最小空闲分区
原理&实现:
- 空闲分区列表按照大小排序
- 分配时,查找一个合适的分区
- 释放时,查找并合并临近的空闲分区(如果找到)
优点: 大部分分配的尺寸较小时,效果很好
- 可避免大的空闲分区被拆分
- 可减小外部碎片的大小
- 相对简单
缺点:
- 外部碎片
- 释放分区慢
- 容易产生很多无用的小碎片
最差匹配(Worst Fit Allocation)策略
思路:分配n字节,使用尺寸不小于n的最大空闲分区。
原理&实现:
- 空闲分区按从大到小排序
- 分配时,选最大的分区
- 释放时,检查是否可与临近的空闲分区合并,进行可能的合并,并调整空闲分区列表的顺序
优点:
- 中等大小的分配较多时,效果最好
- 避免出现太多的小碎片
缺点:
- 释放分区较慢
- 外部碎片
- 容易破坏大的空闲分区,因此后续难以分配大的分区
来源:https://blog.csdn.net/weixin_41162823/article/details/101264009