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) { |