内部碎片 外部碎片( 四 )


从许多方面来看,Alloc就是终极内存分配程序 。它产生的内存碎片很少,速度很快,并有判定功能 。你可以调整甚至去掉内存碎片 。只是在分配一个存储量后,使之空闲,但不再分配时,才会产生外部碎片 。内部碎片会不断产生,但对某个给定的系统和八种存储量来说是恒定不变的 。
Alloc是一种有八个自由表的固定存储量内存分配程序的实现方法 。系统程序员可以对每一种存储量进行配置,并可决定采用更少的存储量来进一步减少碎片 。除开始时以外,分配内存块和使内存块空闲都是恒定时间操作 。首先,系统必须对请求的存储量四舍五入到下一个可用存储量 。就八种存储量而言,这一目标可用三个 如果语句来实现 。其次,系统总是在八个自由表的表头插入或删除内存块 。开始时,分配未使用的内存要多花几个周期的时间,但速度仍然极快,而且所花时间恒定不变 。
堆 () 的内存开销(8 ~ 16 字节/分配)比 alloc小,所以你可以停用内存的专用权 。()分配程序平均来讲是相当快的 。它的内部碎片比alloc()少,但外部碎片则比alloc()多 。它有一个最大分配存储量,但对大多数系统来说,这一极限值足够大 。可选的共享所有权与低开销使 () 适用于有许多小型对象和共享对象的 C++应用程序 。堆是一种具有内部堆数据结构的伙伴系统的实现方法 。在 OSE 中,有 28 个不同的存储量可供使用,每种存储量都是前两种存储量之和,于是形成一个斐波那契()序列 。实际内存块存储量为序列数乘以 16 字节,其中包括分配程序开销或者 8 字节/分配(在文件和行信息启用的情况下为 16 字节) 。
【内部碎片 外部碎片】当你很少需要大块内存时,则OSE内存管理程序最适用 。典型的系统要把存储空间分配给整个系统、堆或库 。在有 MMU 的系统中,有些实现方法使用 MMU 的转换功能来显著降低甚至消除内存碎片 。在其他情况下,OSE 内存管理程序会产生非常多的碎片 。它没有最大分配存储量,而且是一种最先适合内存分配程序的实现方法 。内存分配被四舍五入到页面的偶数——典型值是 4 k 字节 。