Redis 源码剖析-1(zmalloc.c)

zmalloc.c 源码阅读

Redis 自身对内存的分配和释放做了一定封装

阅读内容:

  • 内存分配及释放

  • 内存分配统计

  • 内存异常处理


  1. 可控制是否启用线程安全

    通过 void zmalloc_enable_thread_safeness(void); 函数将 zmalloc_thread_safe 变量置为 1 即开启

  2. 分配的内存统计

    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)
  1. 内存溢出处理

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()## 标题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值