一、计算机体系结构及内存分层体系
1. 计算机体系结构
2. 内存分层体系
寄存器/cache位于cpu,操作系统无法管理,速度很快,容量很小
主存:放置op本身,或者需要运行的代码,掉电后数据丢失
磁盘:存储大,掉电后数据还存在
3. 在操作系统的内存管理范例
操作系统在内存管理中完成的事情:
- 抽象:操作系统抽象了内存分配,寻址等功能,应用程序运行时,无需考虑物理内存与外设,只需访问连续的地址空间(逻辑地址空间)即可
- 保护:内存中运行多个应用程序,有可能访问别的应用程序的地址空间。操作系统提供隔离机制
- 共享:提供共享空间,使得进程能安全可靠的进行数据传递
- 虚拟化:swap,并对应用程序透明
操作系统中管理内存的不同方法:
- 程序重定位
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
二、地址空间及地址生成
1. 地址空间定义
物理地址空间:与硬件对应(内存条等)
逻辑地址空间:运行程序所看到的内存空间(一维线性地址空间),逻辑地址空间最终会落入物理地址空间
2.地址生成
逻辑地址空间生成:exe程序会将逻辑地址映射到物理地址
将指令逻辑地址映射到物理地址的过程:
- mmu中维护了逻辑地址对应的物理地址
- 当cpu要执行某一条指令时,alu发出请求,参数为逻辑地址
- cpu中的mmu查找逻辑地址的映射表,若逻辑地址的物理地址存在,则返回;若不存在,则在内存中查找
- 若查找成功,则cpu控制器发出请求,主存通过总线发送数据至cpu
3.地址安全检查
操作系统确定每个程序有效访问的地址空间(起始地址+长度)
若程序访问的内存地址不在有效的地址空间中,cpu则产生内存访问异常
三、连续内存分配
1. 内存碎片问题
定义:给程序分配一定空间之后,会出现有一些无法进一步利用的空闲空间
分类:外部碎片(在分配单元间的未使用内存)、内部碎片(在分配单元中的未使用内存)
2. 分区的动态分配
简单的内存管理方法:
当一个程序允许运行在内存中时,分配一个连续的区间
1) 第一适配
为了分配n字节,使用第一可用空闲块(大小大于n)
实现:从按地址排序的空闲块列表中,寻找出一块合适的分区
注意:回收内存空间时,可判断相邻的空闲分区能否合并
优点:简单;易于产生更大空闲块
缺点:会产生外碎片;具有不确定性
2) 最佳适配
为了分配n字节,使用最小的可用空闲块(大小大于n的最小空闲块)
实现:从按尺寸排序的空闲块列表中,寻找一个合适的分区
注意:回收内存空间时,可判断相邻的空闲分区能否合并
优点:当大部分分配是小尺寸时有效;比较简单
缺点:外碎片;重分配慢;易于产生很多没有用的微小碎片
3) 最差适配
为了分配n字节,使用最大的可用空闲块
实现:从按尺寸排序(从大到小)的空闲块列表中,寻找一个合适的分区
注意:回收内存空间时,可判断相邻的空闲分区能否合并
优点:分配很快(获取最大分区即可);分配是中等尺寸内存,效果最好
缺点:重分配慢;外碎片;易于破坏大的空闲块,导致需要大内存的程序无法被分配
3. 压缩式碎片整理
定义:通过拷贝,压缩出较大的空闲空间
问题:
- 拷贝的时机(程序运行时拷贝,会导致访问内存出错,可在进程非运行状态时执行)
- 开销
4. 交换式碎片整理
使用压缩式碎片整理,也无法再分配出空闲空间,此时,可用交换式碎片整理
定义:将不使用的程序的内存换到硬盘中
问题:
- 应该选择哪一个程序换出
- 什么时候执行换入换出的操作
- 换入换出粒度若为单个程序,开销太大