linux内核:伙伴算法、slab算法、ptmalloc、tcmalloc使用场景

linux内核空间

Linux 内核空间分为三个区域ZONE: ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM

物理地址空间的顶部以下一段空间,被PCI设备的I/O内存映射占据,它们的大小和布局由PCI规范所决定。640K~1M这段地址空间被BIOS和VGA适配器所占据
由于这两段地址空间的存在,导致相应的RAM空间不能被CPU所寻址(当CPU访问该段地址时,北桥会自动将目的物理地址“路由”到相应的I/O设备上,不会发送给RAM),从而形成RAM空洞。

  • ZONE_DMA的范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用。之所以需要单独管理DMA的物理页面,是因为DMA使用物理地址访问内存,不经过MMU,并且需要连续的缓冲区,所以为了能够提供物理上连续的缓冲区,必须从物理地址空间专门划分一段区域用于DMA。
  • ZONE_NORMAL的范围是16M~896M,该区域的物理页面是内核能够直接使用的。
  • ZONE_HIGHMEM的范围是896M~结束,该区域即为高端内存,内核不能直接使用。
ps: kmalloc为DMA分配内存 vmalloc 分配较大内核内存 malloc分配用户空间内存

伙伴算法、slab算法、ptmalloc、tcmalloc使用场景

伙伴算法(物理内存分配算法)

物理内存分配的单位为页,如果直接分配会导致内存碎片化,因此诞生伙伴算法用于解决此问题。
伙伴算法的分配单位为页(4kb),管理ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM区域。

https://zhuanlan.zhihu.com/p/501806997

slab算法(物理内存分配算法)slob/slub算法

伙伴算法分配的单位为页,如果申请的内存小于页大小,会很浪费,因此诞生slab算法。
slab算法的分配单位为字节,slab分配器只管理内核的常规地址空间(直接被映射到内核地址空间的ZONE_NORMAL和ZONE_DMA)。
https://zhuanlan.zhihu.com/p/490588193?utm_id=0

ptmalloc、tcmalloc(虚拟内存分配算法)

分配单位为字节,ptmalloc、tcmalloc 管理用户空间内存,也就是进程中的堆内存。

资料:
https://blog.csdn.net/liushengxi_root/article/details/88377620
https://blog.csdn.net/qq_41683305/article/details/124554490
https://zhuanlan.zhihu.com/p/526148283
虚拟内存:https://blog.csdn.net/weixin_42570192/article/details/126197643
https://blog.csdn.net/liushengxi_root/article/details/88377620

posted @ 2023-10-17 14:57  小海哥哥de  阅读(233)  评论(0编辑  收藏  举报