二、内存管理

1、前言

redis内存分配库支持jemalloc(Linux默认)、tcmalloc、libc(非Linux默认),编译方式参考Makefile。

三种内存分配方式的比较待以后总结——>?

2、adlist.h/adlist.c

基本数据结构是带头结点的双向链表(非循环),调用依赖zmalloc.h/zmalloc.c

typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

typedef struct list {
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned long len;
} list;

list代表一个链表,dup/free/match代表对链表结点数据的操作函数,即对listNode中value的操作函数。dup代表对value的复制函数,free代表释放value内存的函数,match代表对value进行比较的函数。

listIter代表一个迭代器,正向或反向遍历链表。

3、zmalloc.h/zmalloc.c

附注:两次宏操作,可以防止一次宏未对s中使用的宏进行替换,如下所示(好久没看,忘记是不是这个意思了?)

#define __xstr(s) __str(s)
#define __str(s) #s

主要是宏定义,运行效率高。实际运行依赖于所选择的内存分配库和操作系统平台。

未完待续。。。

posted @ 2013-10-28 23:35  飞天虎  阅读(174)  评论(0编辑  收藏  举报