一文读懂Linux内存分配策略
💡
原文中文,约4900字,阅读约需12分钟。
📝
内容提要
本文以问答形式深入探讨了Linux内存系统的分配策略,包括虚拟地址空间的划分和用户空间内存的动态分配方式。malloc函数通过brk和mmap系统调用分配内存,其中brk方式不会归还内存给操作系统,而mmap方式会归还。预分配内存池可以减少系统调用和缺页中断的次数。
🎯
关键要点
- Linux内存系统分为内核空间和用户空间,32位系统内核占1G,64位系统内核和用户空间各占128T。
- 用户空间内存分为程序文件段、已初始化数据段、未初始化数据段、堆段、文件映射段和栈段。
- malloc函数用于动态分配内存,通过brk和mmap系统调用实现,brk不归还内存,mmap会归还。
- malloc默认使用128KB的阈值,分配小于128KB的内存通过brk,大于128KB的通过mmap。
- malloc分配的是虚拟内存,未访问的虚拟内存不会映射到物理内存,缺页中断会在访问时触发。
- free函数释放内存时,malloc通过brk分配的内存不会归还给操作系统,而是缓存;通过mmap分配的内存会归还。
- 频繁使用mmap会导致系统调用开销和缺页中断,因此malloc通过brk预分配内存池以减少开销。
- 使用brk分配内存可能导致内存碎片,malloc在实现中考虑了brk和mmap的优缺点,默认大块内存使用mmap。
- free函数通过偏移存储的描述信息来确定释放的内存块大小。
➡️