首页 > 系统相关 >内存碎片与缓解

内存碎片与缓解

时间:2024-03-29 22:11:18浏览次数:27  
标签:合并 碎片 算法 内存 缓解 slab 分配

参考资料:https://blog.csdn.net/u014183456/article/details/122031750   内存碎片分为内部碎片和外部碎片

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

标签:合并,碎片,算法,内存,缓解,slab,分配
From: https://www.cnblogs.com/lethe1203/p/18104709

相关文章

  • 段页式内存管理
    转载博客:https://blog.csdn.net/qq_50985215/article/details/127670165 分页、分段的优缺点分析分页管理它的缺点就是不方便按照逻辑块实现信息的共享和保护而分段管理,如果段长过大,为其分配很大的连续空间会很不方便,而且还是产生外部碎片 段页式管理=分段+分页段页式......
  • 【零基础C语言】动态内存管理
     目录1.动态内存分配的意义 2.malloc函数 3.free函数 4.calloc函数 5.realloc函数 6.常见的动态内存错误 6.1对NULL指针的解引⽤操作6.2对动态开辟空间的越界访问6.3对非动态开辟内存使⽤free释放 6.4使⽤free释放⼀块动态开辟内存的⼀部分 6.5......
  • 每个程序员都应该了解的内存知识(三): 虚拟内存
    虚拟内存概念wiki解释它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上物理内存通常被分隔成多个内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。阅读链接虚拟内存篇(原文地址)详解内存映射(做的图非常好,一定要重点看一看)MM......
  • 每个程序员都应该了解的内存知识(四): NUMA
    NUMA第四章https://lwn.net/Articles/254445/概念NUMA(Non-UniformMemoryAccess,非一致性内存访问)是一种计算机内存设计的架构,用在多处理器的系统中,以增加处理器访问内存的速度。在NUMA架构中,每个处理器或处理器组都有自己的本地内存,并且处理器可以直接访问本地内存以获得更......
  • 每个程序员都应该了解的内存知识(五): 代码优化
    代码优化多线程优化尽量使用顺序读写因为分支预测的关系,顺序读写通常能够带来更好的性能.共享变量将只读变量和读写变量分离有可能因为缓存行的原因导致读写变量的更新影响到读变量,进而影响了运行速度提升数据的局部性,将一起使用的读写变量分组到一个结构中缓......
  • 每个程序员都应该了解的内存知识(一): 南桥&北桥&内存
    南桥&北桥&内存结构每个程序员都应该了解的内存知识.pdf-p5-每个程序员都应该了解的内存知识-P5-20240327103419​​功能每个程序员都应该了解的内存知识.pdf-p5-每个程序员都应该了解的内存知识-P5-20240327104347​​北桥主要是连接CPU以及RAM以及南桥,作为连......
  • 每个程序员都应该了解的内存知识(二): CPU Cache
    CPUCache架构每个程序员都应该了解的内存知识.pdf-p22-每个程序员都应该了解的内存知识-P22-20240328112647​​每个程序员都应该了解的内存知识.pdf-p23-每个程序员都应该了解的内存知识-P23-20240328112807​​每个程序员都应该了解的内存知识.pdf-p23-每个......
  • Lec3 Lec4: 虚拟内存和RISC-V寄存器
    虚拟内存使用虚拟内存主要为了实现隔离内存隔离,所有程序指令存放在一个物理内存上,如果一个指令的操作位刚好是另一个指令的地址,那么会造成指令的丢失为了解决这个问题使用地址空间地址空间为每一个指令程序分配自己的地址空间,每个指令程序只能在自己的地址空间上操作。我们需......
  • 使用Andorid Studio解决app内存泄漏问题方法与实践
    某项目的app运行一段时间(切换页面、触发交互事件等)后就开始严重卡顿,使用top查看内存的使用情况,发现每次操作过后内存都有小幅增长,且永远不下降,存在内存泄露问题。目录1AndoridStudio内存泄露检测工具使用方法2内存泄露实例分析2.1页面切换后未主动释放​编辑2.2回调......
  • 如何在Java中读取超过内存大小的文件
    读取文件内容,然后进行处理,在Java中我们通常利用Files类中的方法,将可以文件内容加载到内存,并流顺利地进行处理。但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大。此时,我们则需要采用另一种策略:部分读取它,并具有其他结构来仅编译所需的数据。接下来,我们就来......