Redis开源代码读书笔记三(zmalloc模块)

来源:互联网 发布:淘宝秒杀是不是真的 编辑:程序博客网 时间:2024/05/17 23:51

模块特性

==》支持内存分配配置
==》支持线程安全
==》支持内存分配失败异常处理流程自定义
==》支持字符串复制操作
==》支持当前内存大小占用记录
==》支持内存碎片化计算
==》支持系统内存相关数据查询

内存分配算法配置

==》支持tcmalloc:http://gperftools.googlecode.com/svn/trunk/doc/tcmalloc.html
==》支持jemalloc:http://www.canonware.com/jemalloc/
==》支持ptmalloc(glibc):http://www.malloc.de/en/


如果对上述具体原理感兴趣,可以进一步阅读链接,希望我也能有空去看看这些具体实现,如果有机会的话。

内存操作基本接口

 
void *zmalloc(size_t size);
分配一块内存,并在真正的指针头上记录指针指向内存的长度。如果内存分配失败直接程序异常处理。

void *zcalloc(size_t size);
分配一块清零内存,并在真正的指针头上记录指针指向内存的长度。如果内存分配失败直接程序异常处理。

void *zrealloc(void *ptr, size_t size);
空指针相当于zmalloc函数。变更ptr指向内存的大小,返回变更后内存的指针,新旧指针可能不同。如果内存分配失败直接程序异常处理。

void zfree(void *ptr);
释放指针指向的内存块。

size_t zmalloc_size(void *ptr);
获取指针指向内存区域的大小。ptr未做保护,NULL指针可能导致程序crash。

char *zstrdup(const char *s);
字符串内存memcpy复制。

size_t zmalloc_used_memory(void);
获取zmalloc当前所使用掉的内存总量。

void zmalloc_enable_thread_safeness(void);
使能线程安全,确保统计数据正确性。

void zmalloc_set_oom_handler(void (*oom_handler)(size_t));
定制内存分配失败策略。Redis采用了自己的redisOutOfMemoryHandler处理函数,从日志记录上打印了crash的文件行数。

size_t zmalloc_get_rss(void);
获取进程常驻物理内存。

float zmalloc_get_fragmentation_ratio(size_t rss);
计算实际内存使用率。

size_t zmalloc_get_smap_bytes_by_field(char *field);
根据filed字段获取进程相关数据。

size_t zmalloc_get_private_dirty(void);
获取Private_Dirty字段的值。

void zlibc_free(void *ptr);

原始的libcfree函数实现。

0 0