美文网首页
Linux 内存管理(buddy 和 slab)

Linux 内存管理(buddy 和 slab)

作者: 丁鸿辉 | 来源:发表于2022-03-29 17:31 被阅读0次

    内存 buddy 分配器

    Linux 在拿到一大块内存后(譬如是64MB内存),先将其看作是好多个连续排列的 4MB 内存。
    那么如果程序请求1MB的内存,那么内存分配操作逻辑如下:

    • 选中一个 4MB 内存,将其切分为2个2MB的内存
    • 2MB太大了,选取一个 2MB 内存切成2个1MB的内存
    • 分配1MB内存给程序

    这个算法就是所谓的 binary buddy 分配算法。
    在 Linux 中,这个二分法最小分割到 4096 字节,也就是一个页的大小。
    因此总共有 11 种大小,分别为 4KB,8KB,……4MB。
    其中 4KB 为 order 0,4MB 为 order 10.
    我们称其 max order 为 12,有些资料会提到这个概念。

    以上这些信息可以在 /proc/buddyinfo 上查看,其格式大概是这样:

    初始内存,空闲 64MB 内存:分为 16 个4MB。
    4K(0) 8K(1) 16K(2) 32K(3) 64K(4) ...                           2M(9)   4M(10)
    0     0     0      0      0      0       0       0       0       0       16
    分配 1MB 后,空闲 63MB 内存:分为 15个4MB、1个2MB 和 1个1MB。
    0     0     0      0      0      0       0       0       1       1       15
    
    实际示例
    $ cat /proc/buddyinfo
    Node 0, zone      DMA      0      1      0      0      2      1      1      0      1      1      3
    Node 0, zone    DMA32      6      2      2      6      3      4      2      3      2      3    432
    Node 0, zone   Normal  22980   9813  54346  45837  20375   8005   4476   2776   1399    237  20226
    $
    

    buddy 内存的碎片问题

    buddy 在上面这种情况下,有些被分为小块内存,那么就会存在内存碎片的问题。
    /proc/pagetypeinfo

    以上 buddy 管理的是不小于4K 的内存分配,slab 则是管理小于4KB 的内存对象。

    相关文章

      网友评论

          本文标题:Linux 内存管理(buddy 和 slab)

          本文链接:https://www.haomeiwen.com/subject/sgfbjrtx.html