1.ptmalloc2 源码剖析3 -- 源码剖析
2.内存分配不再神秘:深入剖析malloc函数实现原理与机制
3.Redis源码阅读(1)——zmalloc
ptmalloc2 源码剖析3 -- 源码剖析
文章内容包含平台配置、malloc_state、源码c原arena实例、源码c原new_arena、源码c原arena_get、源码c原arena_get2、源码c原博易决策源码heap、源码c原new_heap、源码c原grow_heap、源码c原heap_trim、源码c原init、源码c原malloc_hook、源码c原malloc_hook_ini、源码c原txl加相册源码ptmalloc_init、源码c原malloc_consolidate、源码c原public_mALLOc、sYSMALLOc、freepublic_fREe、systrim等关键模块。
平台配置为 Debian AMD,使用ptmalloc2作为内存分配机制。
malloc_state 表征一个arena,全局只有一个main_arena实例,arena实例通过malloc_init_state()函数初始化。
当线程尝试获取arena失败时,请求抓包源码通过new_heap获取内存区域,构建非main_arena实例。
arena_get和arena_get2分别尝试线程的私有实例和全局arena链表获取arena,若获取失败,则创建new_arena。
heap表示mmap映射连续内存区域,每个arena至少包含一个heap,且起始地址为HEAP_MAX_SIZE整数倍。
new_heap尝试mmap映射内存,实现内存对齐,确保起始地址满足要求。
grow_heap用于内存扩展与收缩,珍爱网CRM源码依据当前heap状态调用mprotect或mmap进行操作。
heap_trim释放heap,条件为当前heap无已分配chunk或可用空间不足。
init阶段,通过malloc_hook、realloc_hook和__memalign_hook函数进行内存分配。
malloc_consolidate合并fastbins和unsortedbin,优化内存分配。
public_mALLOc作为内存分配入口。
sYSMALLOc尝试系统申请内存,实现内存分配。
freepublic_fREe用于释放内存,萝卜视频2.3.2源码针对map映射内存调用munmap,其他情况归还给对应arena。
systrim使用sbrk归还内存。
内存分配不再神秘:深入剖析malloc函数实现原理与机制
内存是计算机中至关重要的资源,CPU仅能直接读取内存中的数据。内存分配有三种方式:malloc函数、new和calloc函数。malloc函数用于在内存中找一片指定大小的空间,返回该空间的首地址。了解malloc相关的几个函数,包括malloc、void*和free()函数。malloc分配的内存大小至少为参数所指定的字节数,返回一个指向可用内存起始位置的指针,多次调用malloc所分配的地址不能有重叠部分。malloc和free是配对使用的,释放内存时只能释放一次,释放空指针不会出错。new函数返回指定类型的指针,并自动计算所需大小。calloc函数用于在堆区申请动态内存空间,返回类型为空指针,参数包括元素个数和每个元素的字节大小。realloc函数用于为已分配的内存块增加或减少内存大小,保留原始内容。free函数用于释放由malloc、calloc或realloc分配的内存。在使用这些函数时,合理地分配和释放内存是非常重要的。通过了解内存分配的原理,可以更有效地管理计算机资源,避免内存泄漏等问题。为了更深入地学习Linux内核技术,可以加入技术交流群并获取学习资源,获取Linux内核源码资料文档和视频资料。
Redis源码阅读(1)——zmalloc
zmalloc是一个简化内存分配的库,包含以下API函数:zmalloc
zcalloc
zrealloc
zfree
zstrdup
zmalloc_used_memory
zmalloc_set_oom_handler
zmalloc_get_rss
zmalloc_get_allocator_info
zmalloc_get_private_dirty
zmalloc_get_smap_bytes_by_field
zmalloc_get_memory_size
zlibc_free
其中,zmalloc用于分配内存,zcalloc在分配内存的同时初始化为0,zrealloc用于重新分配内存,zfree用于释放内存,zstrdup用于复制字符串并分配内存,zmalloc_used_memory用于获取已分配内存的大小,zmalloc_set_oom_handler用于设置内存溢出处理器,zmalloc_get_rss用于获取当前进程的内存使用量,zmalloc_get_allocator_info用于获取分配器信息,zmalloc_get_private_dirty用于获取私有脏数据,zmalloc_get_smap_bytes_by_field用于获取指定字段的内存使用量,zmalloc_get_memory_size用于获取内存大小,zlibc_free用于释放内存。 在zmalloc中,宏函数update_zmalloc_stat_alloc用于更新used_memory的值。这个宏函数中的if语句用于补齐分配的内存字节数到sizeof(long),但是我不太理解5.0源码中为什么atomicIncr使用的是__n而不是直接对_n进行操作。测试发现,used_memory的值并未对齐到8,那么if语句的存在意义何在呢? 同样地,update_zmalloc_stat_free宏函数用于更新已释放内存的统计信息。与update_zmalloc_stat_alloc相比,虽然malloc_usable_size已经返回精确的字节数,但update_zmalloc_stat_alloc为何不直接使用atomicIncr更新used_memory呢?在Unstable分支中,已有开发者对此进行了优化。