连续内存分配 读操作系统概念第六版

来源:互联网 发布:java 量化交易系统 编辑:程序博客网 时间:2024/05/15 06:37

内存通常分为两个区域:一个用于驻留操作系统,另一个用于用户进程。

保护操作系统不受用户进程所影响,保护用户进程不受其他用户进程所影响。通过采用重定位寄存器和界限寄存器,可以实现这种保护。重定位寄存器含有最小的物理地址值;界限寄存器含有逻辑地址的值。有了重定位寄存器和界限寄存器,每个逻辑地址必须小于界限寄存器;MMU动态地将逻辑地址加上重定位寄存器的值后映射为物理地址。映射后的物理地址在送交内存单元。

当CPU调度程序选择以进程执行时,作为上下文切换工作的一部分,派遣程序会用正确的值初始化重定位寄存器和界限寄存器。

 

内存碎片可以是内部的也可以是外部的。设想有一个18464B大小的孔,并采用多分区分配方案。假如有一个进程需要18462B。如果值准确分配所要求的块,那么还剩下一个2B的孔。维护这一小孔的开销要比孔本身大很多。因此,通常将内存以固定大小的块为单元来分配。采用这种方案,进程所分配的内存可能比所需要的要大。这两个数字之差称为内部碎片,这部分内存在分区内,而又不能用。

一种解决外部碎片问题的方法是紧缩。紧缩的目的是移动内存内容,以便所有空闲空间合并成一整块。紧缩是有一定条件的。如果重定位是静态的,并且在汇编时或装入时进行的,那么就不能紧缩。如果重定位是动态的,是在运动时进行的,那么就能采用紧缩。对于动态重定位,可以首先移动程序和数据,然后再根据新基地址的值来改变基地址寄存器。如果能采用紧缩,还需要评估其开销。还需要评估其开销。最简单的合并算法是简单地将所有进程移到内存的一端;而将所有的孔移到内存的另一端,以生成一个大的空闲块。