redis之zmalloc
来源:互联网 发布:火炬红包群 淘宝群 编辑:程序博客网 时间:2024/06/06 02:38
号外号外,新建Redis交流讨论群:332160890,欢迎加入!!
zmalloc介绍
这部分是用来申请内存的,之所以单独成了一部分在于redis希望能够将不同系统提供的api统一起来,另外还有一部分系统无法获取malloc数目,因此在这里也进行了一部分的封装;这部分内容很简单,实际上就是malloc, calloc, realloc, free几个操作的变形
代码分析
使用变量
used_memory,已使用的内存数;
malloc_thread_safe,分配内存线程是否安全;
used_memory_mutex,已使用内存数变量互斥锁;
代码分解
zmalloc_default_oom,默认的内存溢出响应函数
static void zmalloc_default_oom(size_t size) { fprintf(stderr, "zmalloc: Out of memory trying to allocate %zu bytes\n", size); fflush(stderr); abort();}
zmalloc,这里面判断是否需要添加prefix_size,也就是将分配的内存大小写到分配内存的前部,根据实际需要大小执行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}
zcalloc,这个函数与zmalloc的函数区别在于申请得到的内存是否初始化,zcalloc会初始化,zmalloc则是乱数据
void *zcalloc(size_t 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}
zrealloc,这个函数是用来重新分配内存的,如果ptr为空,则直接申请内存即可,如果当前地址不能满足size大小的内存空间,则需要重新申请内存,然后将ptr中数据拷贝过去,返回新申请内存地址;如果当前地址满足,则扩大当前地址范围
void *zrealloc(void *ptr, size_t size) {#ifndef HAVE_MALLOC_SIZE void *realptr;#endif size_t oldsize; void *newptr; if (ptr == NULL) return zmalloc(size);#ifdef HAVE_MALLOC_SIZE oldsize = zmalloc_size(ptr); newptr = realloc(ptr,size); //重新分配内存 if (!newptr) zmalloc_oom_handler(size); update_zmalloc_stat_free(oldsize); update_zmalloc_stat_alloc(zmalloc_size(newptr)); return newptr;#else realptr = (char*)ptr-PREFIX_SIZE; oldsize = *((size_t*)realptr); newptr = realloc(realptr,size+PREFIX_SIZE); if (!newptr) zmalloc_oom_handler(size); *((size_t*)newptr) = size; update_zmalloc_stat_free(oldsize); update_zmalloc_stat_alloc(size); return (char*)newptr+PREFIX_SIZE;#endif}
zfree,释放内存;
void zfree(void *ptr) {#ifndef HAVE_MALLOC_SIZE void *realptr; size_t oldsize;#endif if (ptr == NULL) return;#ifdef HAVE_MALLOC_SIZE update_zmalloc_stat_free(zmalloc_size(ptr)); free(ptr);#else realptr = (char*)ptr-PREFIX_SIZE; oldsize = *((size_t*)realptr); update_zmalloc_stat_free(oldsize+PREFIX_SIZE); free(realptr);#endif}
0 0
- redis之zmalloc
- Redis zmalloc
- redis zmalloc
- 菜鸟学习redis-----内存管理之zmalloc函数
- Redis中的zmalloc
- redis 内存管理zmalloc
- (redis)zmalloc.h/zmalloc.c理解
- zmalloc 代码解释(redis代码阅读)
- 【redis源码分析】内存分配---zmalloc
- Redis中的内存管理:关于zmalloc
- Redis 源码分析(zmalloc部分)
- Redis 源码阅读笔记1:zmalloc
- 编译安装redis报错zmalloc.h
- Redis源代码分析之一:内存管理——Zmalloc
- Redis源码分析(二十五)--- zmalloc内存分配实现
- Redis源码分析(二十五)--- zmalloc内存分配实现
- Redis开源代码读书笔记三(zmalloc模块)
- 结合redis设计与实现的redis源码学习-1-内存分配(zmalloc)
- (四) spring属性配置细节
- 人见人爱A-B
- HTTPS ConnectionSpec CertificatePinner
- Region-based Convolutional Networks for Accurate Object Detection and Segmentation----R-CNN论文笔记
- C语言基础 二维int型数组的定义及初始化
- redis之zmalloc
- 最小的K个数
- DFT与FFT 的直观感受
- linux 常用软件安装
- 杭电1028 整数划分问题 母函数
- 学习SpringMVC中优秀的代码编写风格
- 10Regular Expression Matching
- canvas animation
- C语言基础 for循环遍历及以矩阵的样式输出二维整型数组