《操作系统》课程笔记(Ch08-内存管理策略)
背景知识
-
基地址寄存器含有最小的合法物理内存地址,界限地址寄存器指定了范围的大小,两者共同定义了逻辑地址空间,即进程可以合法访问的地址范围。
-
CPU生成的地址是逻辑地址,内存单元看到的地址是物理地址。从虚拟地址(逻辑地址)到物理地址的映射是内存管理单元MMU完成的,基地址寄存器(在这称为重定位寄存器)内容加上逻辑地址即为物理地址。
-
用户只生成逻辑地址,逻辑地址在真正使用时会映射到物理地址,这之间的映射对内存管理至关重要
-
进程可以暂时交换到后备存储,再次执行时调回内存。这使得所有进程总的物理地址空间可以超过真实系统的物理地址空间。
连续内存分配
每个进程位于一个连续的内存区域,与包含下一个进程的内存相连。以前用固定分区方案,每个分区大小一致,可运行一个进程。现在多采用可变分区方案,操作系统维护一个表,记录哪些内存可用。在运行一段时间后,会出现大小不一的孔。
如何选择合适的孔分配给进程?主要有下面三种方法:
- 首次适应:分配首个足够大的孔
- 最优适应:分配尽量小的孔
- 最差适应:分配最大的孔
通常,前两者的性能更好。
碎片问题
- 外部碎片:存储被分成了大量在外部的、可分配的小孔,但各自又不足以支持一个进程的运行
- 内部碎片:进程分配到的内存可能比所需的大,多出的这部分在分区内部,但又不能再用
紧缩可以解决外部碎片问题,它将小块进行移动和重组,但重定位不是一定可行的;分段和分页技术可以解决外部碎片问题,它们允许逻辑地址空间不连续。
分段
程序员通常将内存看作一组不同长度的、之间没有特定顺序的段,而不是一个线性数组。为了进行定位,逻辑地址由一个二元组<段号s,偏移d>
构成。通过该二元组,结合段表(段号-基地址-段长界限),就能定位物理内存。
- 通过段号查出基地址和界限
- 基地址+偏移得到物理地址
- 注意检查偏移小于等于段长界限,否则非法
分页
提供了访问物理内存的另一种方式,能彻底消除外部碎片。
将物理内存分为固定大小的块,称为帧;逻辑内存分为同样大小的块,称为页。当执行一个进程时,它的页从文件系统中加载到内存中的可用帧。
一些性质
-
页大小等于帧大小(物理块大小)
-
如果逻辑地址空间有m位,页大小为2^n字节,则逻辑地址可以表示为:
<页码p(m-n位),页偏移d(n位)>
-
虚拟地址空间为2^m*1Byte(假设按字节编址)
-
通常每个进程都有一张页表,建立了页码-物理块号的映射
查表过程
快表TLB
TLB是关联的高速内存,访问速度非常快。TLB包含少数的页表条目,可用于存储经常访问的页表项目。先查TLB,当页码不在TLB中时(未命中),才访问内存中的页表。
有效内存访问时间EAT
表示进行一次内存访问的期望用时,通过概率进行加权求得。
其他
-
保护
在页表中增加有效-无效位,用于控制能否对某些帧进行访问
-
共享页
分页的优点之一是可以共享公共的可重入代码(不能自我修改的代码、纯代码,即在执行期间不会改变)
页表的组织
-
分层分页
现代操作系统支持很大的逻辑地址空间,这将使得页表非常大(页大小和之前基本相同,则m-n变大)。为了解决这个问题,使用分层页表,即将页表再分页。
-
哈希页表
处理大于32位地址空间的常用方法是哈希页表。
用页码通过H函数获得哈希表Entry,哈希表项是帧号的拉链。
-
倒置页表
对于每个真正的内存页或帧,才有一个条目。这样,整个系统只有一个页表,并且每个物理内存的页只有一个相应的条目。
减少了存储空间,但查找时间增加了,最坏需要遍历页表。
分页和分段的主要区别
-
页是信息的物理单位
段是信息的逻辑单位
-
页的大小是由系统确定的
段的长度因段而异
-
分页的进程地址空间是一维的
分段的进程地址空间是二维的
-
分页系统很难实现过程和数据的分离
分段系统却可以很容易实现这些功能