| 贵 州 学 习 网 |
|
伙伴算法的数据结构 伙伴系统的数据结构是free_area_struct: l struct free_area_struct{ l struct page *next; //双向链表指针,链 l //表每个成员是一个块的第一个物理页描述符 l struct page *prev; l unsigned int *map; //指向对应的位图 l unsigned long count;//链表元素个数 l } 数据结构的分析:free_area[0]到free_area[9]都是free_area_struct类型的结构,分别对应不同大小块的链表,并且分别对应一个位图。 伙伴系统数据结构图 slab分配机制 为什么要提出slab机制l原因: 解决之道: slab分配器的组成: cache的数据结构l l lunsigned long c_magic; //从一组预先定义好的数值中选出的一个魔数,用于检查高速缓存的当前状态和一致性 size_t c_org_size; lunsigned long c_gfporder;//每个slab包含的连续页面数目为2c_gfporder个 lvoid (*c_ctor)(void *, kmem_cache_t *, unsigned long); //构造函数 lvoid (*c_dtor)(void*, kmem_cache_t*, unsigned long); //析构函数 lunsigned long c_align; //对象的对齐因子 lsize_t c_colour; /* cache colouring range */ lsize_t c_colour_next;/* cache colouring */ unsigned long c_failures; lconst char *c_name; //cache名 lstruct kmem_cache_s *c_nextp; l //指向下一个cache l kmem_cache_t *c_index_cachep; l //指向外部对象描述符所在的高速缓存 l //的高速缓存描述符 l}; 高速缓存分为两种类型:通用和专用。前者只由slab分配器用于自己使用,后者由内核其余部分使用。 l 通用高速缓存是: l (1)第一个高速缓存包含由内核使用的其余高速缓存的高速缓存描述符。cache_cache变量包含第一个高速缓存的描述符。 l (2)第二个高速缓存包含没有存放在slab内的slab描述符。cache_slabp变量指向第二个高速缓存描述符。 (3)13个高速缓存包含几何分布的内存区。cache_sizes数组元素分别指向13个高速缓存描述符,与其相关的内存区大小为32,64,…,131072字节。 l 系统初始化时调用kmem_cache_init和kmem_cache_sizes_init建立通用高速缓存,调用kmem_cache_create创建专用高速缓存。 slab的数据结构 l unsigned long _offset:slab_offset_bits, l s_dma:1; l} kmem_slab_t; 对象的数据结构l对象数据结构如下: ltypedef struct kmem_bufctl_s { l union { l struct kmem_bufctl_s *buf_nextp; l //指向下一个空闲对象 l kmem_slab_t *buf_slabp; //对象被分配, l //且对象描述符在外面,指向对象所在的 l //slab的slab描述符 l void * buf_objp; //对象被分配,且对象描 l //述符在外面,则指向该对象 l } u; l} kmem_bufctl_t; 对象描述符可以存放在slab内部,紧接描述符所描述的对象之后; 如果存放在slab之外,存放在由cache_sizes指向的一个通用高速缓存中。对象本身所在的高速缓存,通过cache的c_index_cachep和slab的s_index两个域被连到它们的描述符所在的高速缓存。 slab分配器所管理的对象可以在内存对齐,也就是说,存放它们的起始物理地址是一个给定常数的倍数,这个常数叫做对齐因子,存放在cache的c_align域中。 存放对象大小的c_offset域要考虑增加填充字节数来对齐。如果对象大小大于高速缓存行的一半,就在ram中把这个对象的大小对齐到ll_cache_bytes的倍数,也就是行的开始。否则,这个对象的大小就是ll_cache_bytes的因子取整。 slab着色的产生背景:由于相同大小的对象很可能存放于高速缓存的相同的偏移量处,在不同slab内具有相同偏移量的对象最终可能映射在同一高速缓存行中。slab分配器使用slab着色的策略解决这个问题。 slab分配器利用空闲未用的字节来对slab着色,可用颜色个数为空闲字节数/c_align+1。 如果用颜色col对一个slab着色,那末,第一个对象偏移量(相对于slab起始地址)等于col*c_align。这个值存放在slab的s_offset域。
3种相关数据结构 kmem_bufctl_t 其实就是unsigned int,形成数组,用于标识slab中的每个对象是否已用,并形成空闲对象链 kmeme_cache_s 缓存块管理信息 结构:在cache_cache中分配,存放所有的cache,这些cache中,有cache_slabp,专门分配off slab模式的slab_t与kmem_bufctl_t数组,也有由cache_sizes指针数组所指向的一些通用cache,另有一些独立的专用cache 两种方式: |
责任编辑:gzu521