关于虚拟内存有三点须要注意:算法
上图展现了整个进程地址空间的分布,其中4G的地址空间分为两部分,在用户空间内,对应了内存分布的五个段:数据段、代码段、BSS段、堆、栈。在上篇文章中有详细的介绍。函数
这个图示内核用户空间的划分,图中最重要的就是高端内存的映射
进程
其中kmalloc和vmalloc函数申请的空间对应着不一样的区域,同时又不一样的含义。内存
这张图中页解释了三者的不一样关系,和上篇文章中的内容有类似之处。方法
伙伴算法:im
一种物理内存分配和回收的方法,物理内存全部空闲页都记录在BUDDY链表中。首选,系统创建一个链表,链表中的每一个元素表明一类大小的物理内存,分别为2的0次方、1次方、2次方,个页大小,对应4K、8K、16K的内存,没一类大小的内存又有一个链表,表示目前能够分配的物理内存。例如如今仅存须要分配8K的物理内存,系统首先从8K那个链表中查询有无可分配的内存,如有直接分配;不然查找16K大小的链表,如有,首先将16K一分为二,将其中一个分配给进程,另外一个插入8K的链表中,若无,继续查找32K,如有,首先把32K一分为二,其中一个16K大小的内存插入16K链表中,而后另外一个16K继续一分为二,将其中一个插入8K的链表中,另外一个分配给进程........以此类推。当内存释放时,查看相邻内存有无空闲,若存在两个联系的8K的空闲内存,直接合并成一个16K的内存,插入16K链表中。(伙伴算法用于物理内存分配方案)链表
SLAB算法:数据
是一种对伙伴算的一种补充,对于用户进程的内存分配,伙伴算法已经够好了,但对于内核进程,还须要存在一类很小的数据(字节大小,好比进程描述符、虚拟内存描述符等),若每次给几个字节的数据分配一个4KB的页,实在太浪费,因而就有了SLBA算法,SLAB算法其实就是把一个页用力劈成一小块一小块,而后再分配。
查询