Linux 内核原理之内存系统

buddy system

进程向内核申请内存需要地址连续的内存块,linux如何处理来尽可能保持内存块的连续的呢?答案buddy system。来看下buddy system内存地址分配策略。

首先假设系统一开始有共16个字节的内存,然后被分出去8 byte。状态图如下:

在这里插入图片描述
可以看到左边数组中存放的都是等大的块,内存不连续的等大块以链表的方式存放在相应的索引处。

如果这个时候,有个2字节的请求,剩余的6个字节就会被分别放在212^1222^2处。

当内存回收时,内核会在等大块中,发现可以合并的内存块,并放到更上层。比如上面的8个字节内存被释放时,两个8字节的内存块会被发现是连续的,合并放到242^4位置。

buddy system存在内存碎片问题?

当内存被频繁的申请和释放,buddy system就会有内存碎片问题。进程要申请一块内存,剩余内存总量是够的,但是内存地址不连续。

下面简单举个内存碎片的例子:

初始状态:

{ [0-15] }

分配2 byte:
{ [0-7] } , { [8-11] } , { [12-13] }

申请5 byte
{ [8-11] } , {[12,13],[6-7]}(内存碎片), { [5-5] }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章