zmalloc 代码解释(redis代码阅读)

在看redis代码的时候,看到一个常用的函数zmalloc,这个是作者封装的一个malloc函数。


深入看看,对内存空间的申请和线程安全都会有所了解。

void *zmalloc(size_t size) {
    void *ptr = malloc(size+PREFIX_SIZE);                                                   
    
    if (!ptr) zmalloc_oom_handler(size);                                                    
#ifdef HAVE_MALLOC_SIZE
    update_zmalloc_stat_alloc(zmalloc_size(ptr));                                           
    return ptr;                                                                             
#else
    *((size_t*)ptr) = size;
    update_zmalloc_stat_alloc(size+PREFIX_SIZE);                                            
    return (char*)ptr+PREFIX_SIZE;                                                          
#endif                                                                                      
}                                                                                           


下面就分析一下

    if (!ptr) zmalloc_oom_handler(size);                                                    


 这一句里函数的实现是

static void zmalloc_default_oom(size_t size) {
    fprintf(stderr, "zmalloc: Out of memory trying to allocate %zu bytes\n",                
        size);
    fflush(stderr);                                                                         
    abort();                                                                                
}                                                                   


这个函数作用就是,如果申请失败了,打印一个错误消息并输出,同时终止程序。如果内存不够了,redis也就要挂了。


对于

    update_zmalloc_stat_alloc(zmalloc_size(ptr));                                           


对应的实现是

 #define update_zmalloc_stat_alloc(__n) do { \                                               
    size_t _n = (__n); \
    if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \                    
    if (zmalloc_thread_safe) { \
        update_zmalloc_stat_add(_n); \                                                      
    } else { \
        used_memory += _n; \                                                                
    } \
} while(0)          

                                                                        


2. 里面比较核心的有两个,

a。 默认redis的地址以sizeof(log)对齐

b。 如果有线程安全,需要用线程安全原语来操作使用内存的大小

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值