【程序员必备小知识-内存知识20】内存的分配引言内存的分

引言

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

关于内存的分配和回收是非常复杂的,这里只是简要的说一下。

内存的分配方式

malloc() 是 C 标准库提供的内存分配函数,对应到系统调用上,有两种实现方式,即 brk()mmap()

brk

对于小于128k的小块内存,通过移动堆顶的位置来分配内存,这类内存释放后不会立刻归还给系统,而是储存起来,以便重复使用,可以减少缺页异常的发生,提高内存访问效率,但在系统繁忙的时候,频繁分配内存和释放会造成内存碎片。

mmap

那大于128k的大块内存都给mmap分配,它在文件映射段中找一块空闲的内存进行分配,这类内存释放后会立刻归还给系统,这样就会增加缺页异常的发生,在系统繁忙的时候,频繁分配内存会导致大量的缺页异常,增大内核的负担,故mmap只分配大块内存、

但需要注意的是内存是由内核分配的,也就是只有发生缺页异常的时候才会进入到内核,也就是说这两种调用方式发生后,并没有分配内存。

伙伴算法

总的来说,Linux通过伙伴算法来管理内存分配,伙伴算法大致是这样的:把所有空闲的页面分成10个块组,每个快组的块的页面的个数是2的幂次方个,每一组中块的大小相同,块和块之间构成一个链表。

假设要分配的块的大小为128个,那就先去块组中查找,看是否有这样一个空闲页面,有的话就分配,如果没有就查找下一个更大的块组,比如在256页面大小的块的链表中看看有没有这样的空闲块,如果有内核就把它分为两块,一块直接分配,另一块插入到块大小为128个页面的链表中,如果还没有,那就查下一个更大的块组,直到查到最后都没有,就放弃分配并放出错误信号。

image.png