计算机体系结构及内存分层体系
计算机体系结构
- CPU
- 内存
- IO
操作系统在内存管理要完成的目标
- 抽象:使得应用程序不需要考虑底层的细节,只需要访问一个连续的地址空间(逻辑地址空间)即可
- 保护:实现多个应用程序之间的内存隔离(独立地址空间)
- 共享:实现进程之间可以进行安全的数据传输(访问相同内存)
- 虚拟化:更多的地址空间,使用硬盘的空间存放内存中的冷数据,从而虚拟出一个更大的内存空间,对应用程序透明,应用程序无法感知
操作系统实现内存管理目标的手段
- 程序重定位
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
地址空间和地址生成
- 地址空间的定义
- 物理地址空间:硬件支持的地址空间,内存和磁盘
- 逻辑地址空间:一个运行的程序所拥有的内存范围
- 地址空间的查找
首先,CPU方面:
- CPU执行某条指令时CPU中的ALU部件需要知道这条指令的内容,所以会发出带有逻辑地址的请求
- CPU中的MMU(内存管理单元)会去查找这个逻辑地址和物理地址映射表中该逻辑地址有没有对应的物理地址,如果没有就产生一个处理过程去内存中去寻找
- 找到物理地址之后向主存发出请求,需要获得该地址的内容
其次,内存方面:
- 内存通过总线发送物理地址内存内容给CPU,CPU获取指令后开始执行
操作系统方面:需要在这些步骤之前建立逻辑地址和物理地址之间的映射
地址安全检查
操作系统通过设定一个程序所占有的虚拟内存的范围,来检测该程序获取地址是否安全(相关数据也是存于map中的)
连续内存的分配
分配场景
- 当一个程序准许运行在内存中时,分配一个连续的区间
- 分配一个连续的内存区间给运行的程序以访问数据
内存碎片问题(空闲内存不能被利用)
外部碎片:在分配空间块之间的无法被利用的空闲内存
内部碎片:在分配空间块中的无法被利用的空闲内存
简单的内存管理方法-动态分配策略
- 首次适配
需要维护一个按地址排序的空闲块列表,维护需要进行重分配需要检查,看看自由分区能不能与相邻的空闲分区合并(形成更大的空闲块)如果可以需要进行合并。从低地址开始找,碰到的第一个空间比需要空间大的空闲块就使用它。
**目的: **避免分割大的空闲块;最小化外部碎片产生的尺寸
**优点:**简单;易于产生更大的空闲块,向着地址空间的结尾
缺点:外部碎片的问题会加剧;不确定性
- 最佳适配
需要维护按尺寸排列的空闲列表,维护需要进行重分配检测,需要搜索和合并相邻的空闲分区。寻找和所需空间大于但相差最小的空间块进行使用。
**优点: **大部分分配是小尺寸时很有效;简单
**缺点: **外部碎片;重分配慢;易产生很多没用的微小碎片
- 最差适配
和最佳分配相似,但是使用的是大于所需空间且相差最大的空间快进行使用。
**目的: **避免太多的微小碎片
**优点: **中等尺寸效果最好
**缺点: **重分配慢;外部碎片;易于破碎大的空闲块以至大分区不能被分割
压缩式和交换式碎片整理
目的是为了进一步减少碎片产生
压缩式碎片整理
类似于标记整理算法,重制程序以合并在紧凑的空间中,需要要求所有程序是动态可重置的
缺点:何时重置;频繁操作开销很大;内存紧张的时候程序想要扩张空间无法支持
交换式碎片整理
与压缩式碎片整理方法不同的是,会将不使用的程序放到磁盘里(虚拟内存)中,以此来空出更多的内存空间
缺点:运行程序需要更多的内存空间;频繁操作开销还是很大
后续会继续对方法进行优化