slab allocator

首先要说的是memory area,因为有时需要的内存没有一个page frame那么大,比方说只有10bytes,如果分配一个page frame给它,则会产生很多internal fraction。这是一方面,更重要的是很多
kernel的数据结构都不正好是一个或几个page frame那么大,那么在分配的时候就会造成很多internal fraction。为了解决这个问题,linux现在是采用sun solris的解决方法。在内存划出多块区域,
被称为cache用来存放常用的kernel object,每个cache用来存放一类kernel object,每个cache被分为多个slab,每个slab存放一些objects。这样就可以将internal fraction减少到最小,另外
还可以复用object(每个object还有构造函数和析构函数,函数指针存放在cache decriptor中),从而提高系统的运行效率。但是每个object都是按某个常数进行对齐的,一般是power of 2。因为我们
要知道硬件cache也是按一个常数(通常是power of 2)进行对齐,所以内存中的对齐有利充分利用cache。还有一个原因是,一旦对齐了后,计算下一个对象的开始地址就变得简单了,而且可以用高效的指令
来完成,比如1<<位移的次数。第三点优势在于,Usually, microcomputers access memory cells more quickly if their physical addresses are aligned with respect to the
word size (that is, to the width of the internal memory bus of the computer).所以object是按word size 进行对齐。
补充:
linux还有一些通用的cache(general purpose cache),他们存放的object的大小是2的指数,从32到131072bytes。
在linux中还有per-cpu page frame cache,保存的是从buddy system中申请的一个个page frame,用来满足cpu对单个page frame的需求。所以linux为了提高系统的运行效率,还是动了不少脑经
的哦
2009/02/04 三

你可能感兴趣的:(数据结构,linux,cache,Access,sun)