❶ 80%的Linux都不懂的内存问题
本文深入解析了Linux内存管理的复杂机制,主要探讨了进程内存申请与分配、内存耗尽后的OOM处理、内存实际位置以及系统如何回收内存。以下是文章的主要内容概述:
- 进程内存分配: 内存申请通过exec函数加载可执行文件到内存,代码段、数据段等通过mmap映射,堆内存取决于实际需求。malloc调用brk或mmap分配内存,用户态内存由内存分配器管理。
- 内存耗尽与OOM: OOM是内存不足时的自我保护,通过oom_adj参数和进程运行时间等因素选择杀掉的进程。设置oom_adj可以干预进程优先级。
- 内存位置: 文件映射可能在内核缓存(cache),而私有映射可能先复制到新分配的内存,避免写时复制。匿名映射不占用cache,且共享匿名映射在cache中。
- 内存回收: 手动回收包括清理pagecache和tmpfs。系统自动回收通过kswapd监控内存使用,脏页回写磁盘,匿名页可能swap out。
总的来说,Linux内存管理涉及了进程的内存布局、内存分配策略、内存紧张时的解决方案,以及内存的动态管理和回收,展示了内核在内存管理上的精细控制和优化。