外部碎片
还没有被分配出去(不属于任何进程)的内存,但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。外部碎片是除了任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
内存碎片问题
频繁地请求和释放不同大小的内存,必然导致内存碎片问题的产生,结果就是当再次要求分配连续的内存时,即使整体内存是足够的,也无法满足连续内存的需求。该问题也称之为外碎片(external fragmentation)。
解决方案:
避免外碎片的方法有两种:
1、地址转换技术,把非连续的物理地址转换成连续的线性地址。
2、记录现存的空闲内存,以尽量避免为满足对小块的请求而分割大的空闲块。
Linux采用了第二种方案,因为在某些情况下,系统的确需要连续的物理地址(DMA处理器可以直接访问总线)。
Linux内存管理
linux kernel 通过把整个物理内存划分成以一个个page进行管理,
第一层为全部物理内存:其管理器为伙伴系统,最小管理单位为page;
第二层为slab page:其管理器为slab/slub,最小管理单位为2的m次幂的字节块;