GlusterFS 之内存池(mem-pool)实现原理及代码详解
最近一直在研究 glusterfs 的源代码,自己也在上面做了一些小的改动。我最开始研究的是 3.2.5 这个版
本,因为据同行和网上资料显示这个版本目前是最稳定的版本。glusterfs 实现比较复杂,具体的设计思想和架构
就不详细介绍了,网上有这方面的资料(CSDN 博客里面就有很好介绍的文章)。
研究开源系统的一个好处就是可以充分了解它的实现,如果是看这方面的论文只能了解一些原理性的东西,
但是我们真正做项目还需要实际的实现。很多开源系统可能本身不一定就很适合你的系统,但是如果可以改造那
么利用它来改造也是很值得划算的。研究开源系统最大的好处就是学习它的优秀的代码,今天这篇博文就是要分
享 glusterfs 里面使用的内存池技术。
glusterfs 实现内存池技术的源文件和头文件分别是 mem-pool.c 和 mem-pool.h,首先看看头文件中内存
池对象结构体的定义如下:
1 struct mem_pool {
2 struct list_head list;//用于管理内存池的标准双向链表
3 int hot_count;//正在使用的内存数量计数
4 int cold_count;//未使用的内存数量计数
5 gf_lock_t lock;
6 unsigned long padded_sizeof_type;//带有填充
7 void *pool;//内存池开始地址
8 void *pool_end;//内存池结束地址
9 int real_sizeof_type;//内存池存放对象的真实大小
10 uint64_t alloc_count;//采用 alloc 分配的次数
11 uint64_t pool_misses;//内出池缺少次数
12 int max_alloc;//采用 alloc 分配的最大次数
13 int curr_stdalloc;
14 int max_stdalloc;
15 char *name;
16 struct list_head global_list;//加入到全局的内存池链表
17 };
然后我们在来分析几个重要的实现函数,第一个函数就是 mem_pool_new_fn,它会新建一个内存池对
象,然后按照传递进来的内存的大小和个数分配内存,还要加上一些额外存储内容的内存容量,如存放链表指针
的因为这些内存池对象本身是通过通用链表来管理的,还有如标识内存是否在被使用的一个标志等。具体看下面
代码的实现,关键代码都有注释:
1 struct mem_pool *
2 mem_pool_new_fn (unsigned long sizeof_type,
3 unsigned long count, char *name)
4 {
5 struct mem_pool *mem_pool = NULL;
评论3