源码剖析"/>
Redis 源码剖析
zmalloc.c 源码阅读
Redis 自身对内存的分配和释放做了一定封装
阅读内容:
-
内存分配及释放
-
内存分配统计
-
内存异常处理
-
可控制是否启用线程安全
通过 void zmalloc_enable_thread_safeness(void); 函数将 zmalloc_thread_safe 变量置为 1 即开启
-
分配的内存统计
zmalloc_thread_safe 标志位来决定是否在更新 used_memory 变量时加锁。整个内存分配的统计是通过宏定义去实现的
类似这样
#define increment_used_memory(__n) do { \size_t _n = (__n); \if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \if (zmalloc_thread_safe) { \pthread_mutex_lock(&used_memory_mutex); \used_memory += _n; \pthread_mutex_unlock(&used_memory_mutex); \} else { \used_memory += _n; \} \
} while(0)
-
内存溢出处理
static void zmalloc_oom(size_t size) {fprintf(stderr, "zmalloc: Out of memory trying to allocate %zu bytes\n",size);fflush(stderr);abort();
}
注意 abort(),exit(), assert() 区别
exit()
- flush 未写入的缓冲数据
- 关闭所有打开的文件
- 删除所有临时文件
- 返回退出状态
abort()
- 可能不会 flush 缓冲数据
- 可能不会关闭打开的文件
- 可能不会删除所有临时文件
assert()
- 如果表达式为 0,表达式,文件名,行号,返回标准错误,然后调用 abort()## 标题
更多推荐
Redis 源码剖析
发布评论