❶ 80%的Linux都不懂的內存問題
本文深入解析了Linux內存管理的復雜機制,主要探討了進程內存申請與分配、內存耗盡後的OOM處理、內存實際位置以及系統如何回收內存。以下是文章的主要內容概述:
- 進程內存分配: 內存申請通過exec函數載入可執行文件到內存,代碼段、數據段等通過mmap映射,堆內存取決於實際需求。malloc調用brk或mmap分配內存,用戶態內存由內存分配器管理。
- 內存耗盡與OOM: OOM是內存不足時的自我保護,通過oom_adj參數和進程運行時間等因素選擇殺掉的進程。設置oom_adj可以干預進程優先順序。
- 內存位置: 文件映射可能在內核緩存(cache),而私有映射可能先復制到新分配的內存,避免寫時復制。匿名映射不佔用cache,且共享匿名映射在cache中。
- 內存回收: 手動回收包括清理pagecache和tmpfs。系統自動回收通過kswapd監控內存使用,臟頁回寫磁碟,匿名頁可能swap out。
總的來說,Linux內存管理涉及了進程的內存布局、內存分配策略、內存緊張時的解決方案,以及內存的動態管理和回收,展示了內核在內存管理上的精細控制和優化。