【存储管理】内核缓冲区的管理概述

来源:互联网 发布:法律援助 知乎 编辑:程序博客网 时间:2024/05/18 17:58

内核在运行过程中,常常需要使用一些缓冲区,例如,当要建立一个新的进程就要增加一个task_struct结构,而当进程撤销时释放本进程的task_struct,注意缓冲区并不是某个子程序的局部变量,因此不使用堆栈空间了,这些缓冲区也是动态变化的,采用全局性的办法。


(1)使用用户空间的malloc()那样动态的分配办法,从一个存储空间堆,需要多少就切下一块,不用了就归还,如果内核采用,缺点如下:久而久之,存储堆碎片化严重,导致尽管内存中有很多的内存,但是却无法分配;内核中已经释放的数据结构可能会再次使用,但不需初始化,提高效率;缓冲区的组织和管理严重影响高速缓存的命中率;不适合多处理器共用内存的情况;


(2)slab机制,在slab机制中,每种重要的数据结构都有自己的专用缓冲区队列,都有相应的构造和拆除方法;每种对象的缓冲区的队列是由一个连串的大块(slab)构成,一个大块肯能包含若干个小对象;一个slab可能由1,2,3...最多32个连续的物理页面构成,slab的具体大小是通过对象的大小计算得出的;每一个slab的前端是该slab双向队列的描述结构slab_t;每一个双向队列在逻辑上分为三部分(slab所有的对象都已使用,slab对象部分使用,slab完全未使用的);每一个slab都有对象区,这是个对象数据结构的数组,以对象的序号为下标可以得到具体对象的起始地址;每一个slab还有个对象链接数组,用来实现空对象链;slab头部有一个小小的区域是不使用的,称为“着色区”,可使得每一个对象的起始地址都按高速缓存的缓冲行大小对齐,可使得不同slab上统一位置的对象起始地址在高速缓存相互错开,可以改善高速缓冲的效率;一个slab上的所有对象的起始地址都必然是和高速缓存的缓冲行对齐的;


(3)slab的描述结构slab_t:其中list_head将一块slab_s链入一个专用的缓冲区队列,inuse表示已分配对象的计数器,colouroff表示本slab上着色区的大小,指针s_mem指向对象区的起点,free指明了空闲对象链中的第一个对象;


(4)在为每种对象建立的slab队列都有一个对头,其控制结构称为kmem_cache_t,该数据结构中除用来维持slab队列的各种指针外,还记录了各个slab的各种参数,以及构造和拆除函数;系统中还有一个总的slab头,其队头为kmem_cache_t即cache_cache,维持各个第一层slab的kmem_cache_t结构;每一个第一层slab上的每一个对象,即kmem_cache_t是队头,用来维持一个第二层的slab队列;第二层的slab队列基本都是为某种对象所有,数据结构专用,每一个第二层的slab维持着一个空闲对象的队列;



(5)当需要分配一个具有专用的slab队列的数据结构时,应该通过kmem_cache_alloc()分配,如我们看到的mm_struct,vm_area_struct,file等,


(6)当数据结构较大时,slab结构有所不同,将由slab控制结构的kmem_slab_t中的有一个指针指向相应slab上的第一个对象,两者相分离;


(7)内核中并非是所有的数据结构都有必要的专用的缓冲区队列,一些不太常用的开销不大的数据结构可以合用一个通用的缓冲区队列,是由一个结构数组所管理的,即采用物理页面分配采用的按大小分区,又使用slab方式来管理,如kmalloc,kfree;



0 0
原创粉丝点击