Redis源码分析(二十五)--- zmalloc内存分配实现
来源:互联网 发布:知鱼之乐 编辑:程序博客网 时间:2024/06/05 04:18
时间过的很快,经过快1个月的时间学习,本人对Redis源代码的分析已经超过了一半,上几次的学习,我主要的是对于Redis工具类的代码进行了学习。后面的几天我将会学习Redis代码中的一些封装类的实现,这些封装类在整个Redis系统中都可能普遍用到。比如说我马上要分析的在zmalloc的内存封装的实现。先抛开Redis的内存函数库不说,在纯粹的C语言中,内存分配的函数有malloc,free,relloc这3个函数,熟悉C语言编程的同学一定不会陌生。但是在这里Redis代码的编写者,在Redis系统中对内存的分配又做了一次小小封装。我也只能说是一个小小的封装,核心的调用方法仍是C语言中的这3个函数。先看一下在zmalloc.h头文件中define的一些API:
- void *zmalloc(size_t size); /* 调用zmalloc申请size个大小的空间 */
- void *zcalloc(size_t size); /* 调用系统函数calloc函数申请空间 */
- void *zrealloc(void *ptr, size_t size); /* 原内存重新调整空间为size的大小 */
- void zfree(void *ptr); /* 释放空间方法,并更新used_memory的值 */
- char *zstrdup(const char *s); /* 字符串复制方法 */
- size_t zmalloc_used_memory(void); /* 获取当前已经占用的内存大小 */
- void zmalloc_enable_thread_safeness(void); /* 是否设置线程安全模式 */
- void zmalloc_set_oom_handler(void (*oom_handler)(size_t)); /* 可自定义设置内存溢出的处理方法 */
- float zmalloc_get_fragmentation_ratio(size_t rss); /* 所给大小与已使用内存大小之比 */
- size_t zmalloc_get_rss(void);
- size_t zmalloc_get_private_dirty(void); /* 获取私有的脏数据大小 */
- void zlibc_free(void *ptr); /* 原始系统free释放方法 */
- static size_t used_memory = 0;
- static int zmalloc_thread_safe = 0;
- pthread_mutex_t used_memory_mutex = PTHREAD_MUTEX_INITIALIZER;
- /* 在对内存空间做使用的时候,进行了加锁控制 */
- #define update_zmalloc_stat_add(__n) do { \
- pthread_mutex_lock(&used_memory_mutex); \
- used_memory += (__n); \
- pthread_mutex_unlock(&used_memory_mutex); \
- } while(0)
- /* 调用zmalloc申请size个大小的空间 */
- void *zmalloc(size_t size) {
- //实际调用的还是malloc函数
- void *ptr = malloc(size+PREFIX_SIZE);
- //如果申请的结果为null,说明发生了oom,调用oom的处理方法
- if (!ptr) zmalloc_oom_handler(size);
- #ifdef HAVE_MALLOC_SIZE
- //更新used_memory的大小
- 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
- }
- /* 申请新的_n大小的内存,分为线程安全,和线程不安全的模式 */
- #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)
- /* 调用系统函数calloc函数申请空间 */
- void *zcalloc(size_t size) {
- //calloc与malloc的意思一样,不过参数不一样
- //void *calloc(size_t numElements,size_t sizeOfElement),;numElements * sizeOfElement才是最终的内存的大小
- //所在这里就是申请一块大小为size+PREFIX_SIZE的空间
- void *ptr = calloc(1, 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
- }
- /* 是否设置线程安全模式 */
- void zmalloc_enable_thread_safeness(void) {
- zmalloc_thread_safe = 1;
- }
- /* 可自定义设置内存溢出的处理方法 */
- void zmalloc_set_oom_handler(void (*oom_handler)(size_t)) {
- zmalloc_oom_handler = oom_handler;
- }
0 0
- Redis源码分析(二十五)--- zmalloc内存分配实现
- Redis源码分析(二十五)--- zmalloc内存分配实现
- 【redis源码分析】内存分配---zmalloc
- 结合redis设计与实现的redis源码学习-1-内存分配(zmalloc)
- Redis 源码分析(zmalloc部分)
- Redis源码分析-内存分配
- Redis源码分析-内存分配
- Redis源码分析-内存分配
- redis 内存管理zmalloc
- Redis源代码分析之一:内存管理——Zmalloc
- (redis)zmalloc.h/zmalloc.c理解
- Redis源码剖析--内存分配
- Redis中的内存管理:关于zmalloc
- Redis源码剖析和注释(二十五)--- Redis Cluster 的通信流程深入剖析(载入配置文件、节点握手、分配槽)
- Redis 源码阅读笔记1:zmalloc
- python源码分析----内存分配(1)
- python源码分析----内存分配(2)
- redis源码分析(二)-sds字符串的实现
- bundle install时候出现"Could not find modernizr-2.6.2 in any of the sources"
- win8改win7笔记
- 数据库小知识
- java--导入包中的类
- hdoj 5240 Exam 【模拟】
- Redis源码分析(二十五)--- zmalloc内存分配实现
- 《关于多代理系统的研究》01
- linux下一个网卡配置多个ip【虚拟ip】
- tomcat管理员密码设置
- 2015多校Solve this interesting problem
- HDU 3669 Cross the Wall (斜率优化DP)
- redis内存管理代码注释
- 在eclipse中打开文件所在的目录
- oracle数据库用户加锁和解锁