目录
连续内存分配(contiguous memory allocation)
多分区方案(multiple-partition method)
TLB(translation-lookaside buffer )
一、内存管理硬件设计&地址空间
CPU能直接访问的存储器只有内存和处理器内的寄存器,机器指令可以用内存地址作参数而不能以磁盘地址作参数。因此,执行指令以及执行使用的数据必须在这些可直接访问的存储设备上。
基地址寄存器(base register)和界限地址寄存器(limit register)
每个进程都应该有独立的内存空间,需要确定一个进程可访问的合法地址的范围,并确保进程只访问其合法地址。基地址寄存器含有最小的合法物理内存地址,界限地址寄存器决定了范围的大小。
e.g:
基地址寄存器值为300040,界限寄存器为120900,那么程序可以合法访问从300040~420940(含)的所有地址。
内存空间保护的实现,是通过CPU硬件对用户模式所产生的每一个地址与寄存器的地址进行比较来完成的。只有操作系统可以通过特殊的特权指令来加载这两个寄存器。
地址空间
段机制启动、页机制未启动:逻辑地址->段机制处理->线性地址=物理地址
段机制和页机制都启动:逻辑地址->段机制处理->线性地址->页机制处理->物理地址
虚拟地址应该等价于逻辑地址(课本),但是因为对程序员而言可见的只有线性地址,有时候也把线性地址称为虚拟地址?
CPU所生成的地址通常称为逻辑地址(logical address),而内存单元所看到的的地址(即被加载到内存地址寄存器(memory-address register)中的地址)通常被称为物理地址(physical address)。
由程序所生成的所有逻辑地址的集合称为逻辑地址空间(logical address space)
与这些逻辑地址相对应的所有物理地址的集合称为物理地址空间(physical address space)
物理地址空间的大致布局:
虚拟地址空间(VM)的三个特征
1.Transparency(透明性、不可见的)
每个进程都认为它有独立的物理地址空间且不会认识到物理内存被虚拟化了。操作系统和硬件负责完成虚拟地址到物理地址的转化。
2.Efficiency(有效性)
从时间(不能让进程运行得很慢)、空间(不能占用过多的物理内存)等角度考虑,这就需要很多硬件支持,如TLB。
3.Protection
OS需要保证进程之间以及进程与OS之间不会发生冲突/物理内存不会相互覆盖,保护机制允许了进城之间的共享代码/数据。
对虚拟地址空间的解释:OS需要建立一个便于使用的物理内存的抽象,这个抽象便是(虚拟)地址空间。对于进程而言,可见的只是(虚拟)地址空间而不是物理内存,即其使用的地址都是虚拟地址,由OS转化为物理地址。
运行时从虚拟地址(这里指的是逻辑地址)到物理地址的映射是由内存管理单元(memory-management unit,MMU)的硬件设备来完成的。有许多方案可以完成这种映射。
一种简单的方案就是使用基地址寄存器,在这里称为重定位寄存器(relocation register)。用户进程所生成的地址在送交内存之前,都将加上重定位寄存器的值(如图)。
二、内存管理方法
内存通常分为两个区域:一个用于驻留操作系统,另一个用于用户进程。操作系统可以位于低内存,也可以位于高内存。影响这一决定的主要因素是中断向量的位置,由于中断向量通常位于低内存,所以操作系统也常常位于低内存……
连续内存分配(contiguous memory allocation)
这里讨论的是如何为需要调入内存的进程分配内存空间的方案,采用连续内存分配时,每个进程位于一个连续的内存区域。
连续内存分配有两个重要的技术:Splitting and Coalescing(姑且翻译为分裂和合并)
Splitting简单来说就是一个空闲内存块有10B,一个进程需要1B,那么我们把这个空闲块分为2部分:1B和9B。
Coalescing是针对进程释放内存后的操作,即将连续的空闲块合并。
上图中的三个空闲块会合并(如上图)。
多分区方案(multiple-partition method)
将内存分为多个大小固定的分区(partition),每个分区只能容纳一个进程。
当一个分区空闲时,可以从输入队列(等待队列)中选择一个进程,以调入到空闲分区。当进程终止时,其分区可以被其他进程所使用。
可变分区方案(variable-partition)
操作系统维护一个表,用于记录哪些可用和已被占用,把可用的内存块称为一个个的孔(hole)。
一开始所有内存作为1个孔,当有新进程需要内存时,为该进程查找足够大的孔,如果找到,为该进程