Redis 作为常用的内存数据库,代码精简易于阅读,所以成为我 Linux C 开发学习之首选。
Redis源码版本:4.0.2
本章主要看内存相关操作。
zmalloc.c & zmalloc.h
定义各种内存申请操作。
提供了三种库,一种是google的tcmalloc,一种是jemalloc,还有一种就是malloc
zmalloc
最简单的申请内存。加了一个size_t
的空间,记录当前申请的空间的大小。
1 | void *zmalloc(size_t size) { |
如果未提供zmalloc_size
函数,默认方法是向前取PREFIX_SIZE
拿到size
,相加得到真正的size
(在刚才的情况中并不会被调用到)
1 |
|
其中update_zmalloc_stat_alloc
作用是更新used_memory
。首先将n
用long
对齐,然后原子加used_memory
1 |
|
atomicIncr
定义如下,__atomic_add_fetch
是内建函数,原型为type __atomic_add_fetch (type *ptr, type val, int memorder)
,详见文档。
1 |
zfree
释放内存
1 | void zfree(void *ptr) { |
zmalloc_get_rss
获取RSS(resident set size,常驻内存大小)
1 |
|
zmalloc_get_fragmentation_ratio
碎片率
1 | /* Fragmentation = RSS / allocated-bytes */ |
zmalloc_get_smap_bytes_by_field
按字段名计算总字节数,字段名需要以”:”结尾,pid为-1表示当前进程。若不支持直接返回0。(利用"proc/<pid>/smaps"
或"proc/self/smaps"
信息)
1 | /* Get the sum of the specified field (converted form kb to bytes) in |
zmalloc_get_memory_size
返回物理内存字节数。(声称虽然看起来丑但是已经是最干净的方式)
通过sysctl
或sysconf
查询物理内存使用
1 | size_t zmalloc_get_memory_size(void) { |