内存碎片与缓解

 
内存碎片分为内部碎片和外部碎片
  1. 外部碎片(External Fragmentation):
  • 外部碎片是指已分配的内存块之间出现的不连续、无法充分利用的空闲内存空间。
  • 外部碎片通常发生在动态内存分配中,当多次分配和释放内存后,会留下一些小而不连续的未分配空间,这些空间虽然总和足够大,但无法满足大块内存的需求。
  • 由于外部碎片的存在,可能导致某些内存分配请求无法得到满足,即使总体上有足够的内存空间。
  1. 内部碎片(Internal Fragmentation):
  • 内部碎片是指已分配的内存块中,部分空间没有被有效利用而浪费掉的情况。
  • 内部碎片通常发生在静态内存分配或固定大小内存块分配中。例如,如果申请了一个固定大小的内存块,但实际使用的空间远小于该内存块的大小,就会产生内部碎片。
  • 内部碎片的存在会导致系统整体内存利用率下降,因为一些内存空间被浪费在了未被使用的部分上。
 
外部内存碎片缓解方式:Linux Buddy分配算法
内部内存碎片缓解方式:slab算法
 
Buddy分配算法:
伙伴内存管理算法的主要步骤包括初始化、分配内存、释放内存和合并内存。以下是这些步骤的详细说明:
  1. 初始化:将整个可用内存空间划分为大小相等的内存块,每个内存块的大小通常是2的幂次方。这些内存块以二叉树的形式进行组织,其中树的根节点代表整个可用内存空间,而每个节点表示一个特定大小的内存块。
  2. 分配内存:当程序需要分配一块特定大小的内存时,系统会在二叉树中找到一个最小的、合适的内存块来满足需求。通常会选择一个大小略大于需求的内存块,然后将其标记为已分配状态。
  3. 释放内存:当程序释放某块已分配的内存时,系统会将该内存块标记为空闲状态,并尝试与其伙伴块进行合并,形成更大的内存块。
  4. 合并内存:合并是伙伴内存管理算法的关键操作,它通过将空闲的内存块与其伙伴块进行合并,形成更大的内存块。如果合并后的内存块仍然是一个伙伴块,就可以继续合并,直到无法再合并为止。
 
slab算法:Linux页表为4k,slab可以将4k继续拆分为更小的单位来进行管理, 不需要将整个页面给对象,这样节省空间。内核中对于频繁使用的小对象,slab还会进行缓存,避免频繁的内存分配与回收
0
 
 
 
 
posted @ 2024-03-29 22:07  lethe1203  阅读(27)  评论(0编辑  收藏  举报