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