Linux 内存管理(buddy 和 slab)

Linux 内存管理(buddy 和 slab),第1张

Linux 在拿到一大块内存后(譬如是64MB内存),先将其看作是好多个连续排列的 4MB 内存。

那么如果程序请求1MB的内存,那么内存分配 *** 作逻辑如下:

这个算法就是所谓的 binary buddy 分配算法。

在 Linux 中,这个二分法最小分割到 4096 字节,也就是一个页的大小。

因此总共有 11 种大小,分别为 4KB,8KB,……4MB。

其中 4KB 为 order 0,4MB 为 order 10.

我们称其 max order 为 12,有些资料会提到这个概念。

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

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

/proc/pagetypeinfo

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

本文介绍Linux内核内存分配函数: kzalloc() 和 kcalloc() 。

文件: include/linux/slab.h ,定义如下:

kzalloc() 函数功能同 kmalloc() 。区别:内存分配成功后清零。

每次使用 kzalloc() 后,都要有对应的内存释放函数 kfree() 。

举例:

文件: include/linux/slab.h ,定义如下:

kcalloc() 函数为数组分配内存,大小 n*size ,并对分配的内存清零。该函数的最终实现类似 kmalloc() 函数。

每次使用 kcalloc() 后,都要有对应的内存释放函数 kfree() 。

举例:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8993515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存