1.Redis源码阅读(1)——zmalloc
2.ptmalloc2 源码剖析3 -- 源码剖析
3.鸿蒙轻内核M核源码分析:LibC实现之Musl LibC
4.内存分配不再神秘:深入剖析malloc函数实现原理与机制
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的酷狗api源码值。这个宏函数中的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分支中,已有开发者对此进行了优化。ptmalloc2 源码剖析3 -- 源码剖析
文章内容包含平台配置、malloc_state、arena实例、new_arena、arena_get、arena_get2、开发手册网站源码heap、new_heap、grow_heap、heap_trim、init、malloc_hook、malloc_hook_ini、ptmalloc_init、malloc_consolidate、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用于内存扩展与收缩,依据当前heap状态调用mprotect或mmap进行操作。图床上传源码
heap_trim释放heap,条件为当前heap无已分配chunk或可用空间不足。
init阶段,通过malloc_hook、realloc_hook和__memalign_hook函数进行内存分配。
malloc_consolidate合并fastbins和unsortedbin,优化内存分配。
public_mALLOc作为内存分配入口。
sYSMALLOc尝试系统申请内存,实现内存分配。
freepublic_fREe用于释放内存,针对map映射内存调用munmap,其他情况归还给对应arena。
systrim使用sbrk归还内存。
鸿蒙轻内核M核源码分析:LibC实现之Musl LibC
本文探讨了LiteOS-M内核中Musl LibC的实现,重点关注文件系统与内存管理功能。Musl LibC在内核中提供了两种LibC实现选项,使用者可根据需求选择musl libC或newlibc。本文以musl libC为例,深度解析其文件系统与内存分配释放机制。
在使用musl libC并启用POSIX FS API时,开发者可使用文件kal\libc\musl\fs.c中定义的文件系统操作接口。这些接口遵循标准的POSIX规范,具体用法可参阅相关文档,或通过网络资源查询。例如,mount()函数用于挂载文件系统,而umount()和umount2()用于卸载文件系统,后者还支持额外的卸载选项。open()、close()、unlink()等文件操作接口允许用户打开、关闭和删除文件,其中open()还支持多种文件创建和状态标签。read()与write()用于文件数据的读写操作,lseek()则用于文件读写位置的调整。
在内存管理方面,LiteOS-M内核提供了标准的POSIX内存分配接口,包括malloc()、free()与memalign()等。其中,malloc()和free()用于内存的申请与释放,而memalign()则允许用户以指定的内存对齐大小进行内存申请。
此外,calloc()函数在分配内存时预先设置内存区域的值为零,而realloc()则用于调整已分配内存的大小。这些函数构成了内核中内存管理的核心机制,确保资源的高效利用与安全释放。
总结而言,musl libC在LiteOS-M内核中的实现,通过提供全面且高效的文件系统与内存管理功能,为开发者提供了强大的工具集,以满足不同应用场景的需求。本文虽已详述关键功能,但难免有所疏漏,欢迎读者在遇到问题或有改进建议时提出,共同推动技术进步。感谢阅读。
内存分配不再神秘:深入剖析malloc函数实现原理与机制
内存是计算机中至关重要的资源,CPU仅能直接读取内存中的数据。内存分配有三种方式:malloc函数、new和calloc函数。malloc函数用于在内存中找一片指定大小的空间,返回该空间的首地址。了解malloc相关的几个函数,包括malloc、void*和free()函数。malloc分配的内存大小至少为参数所指定的字节数,返回一个指向可用内存起始位置的指针,多次调用malloc所分配的地址不能有重叠部分。malloc和free是配对使用的,释放内存时只能释放一次,释放空指针不会出错。new函数返回指定类型的指针,并自动计算所需大小。calloc函数用于在堆区申请动态内存空间,返回类型为空指针,参数包括元素个数和每个元素的字节大小。realloc函数用于为已分配的内存块增加或减少内存大小,保留原始内容。free函数用于释放由malloc、calloc或realloc分配的内存。在使用这些函数时,合理地分配和释放内存是非常重要的。通过了解内存分配的原理,可以更有效地管理计算机资源,避免内存泄漏等问题。为了更深入地学习Linux内核技术,可以加入技术交流群并获取学习资源,获取Linux内核源码资料文档和视频资料。