【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )
文章目錄
- 一、內存分配系統調用過程 ( 用戶層 | 系統調用 | 內核層 )
- 二、內存管理流程
一、內存分配系統調用過程 ( 用戶層 | 系統調用 | 內核層 )
" 堆內存 " 動態分配 的 系統調用 過程 :
① 用戶應用程序調用 : 開發者 在 " 用戶空間 “ 的 應用程序 中調用 malloc 等函數 , 申請 動態分配 ” 堆內存 " ,
② 系統調用 : 用戶空間 的 內存管理函數 調用 " 內核與用戶層接口 “ 中的 brk sbrk mmap munmap 等函數 , 這些函數就是 ” 系統調用 " 函數 ; 系統調用接口 是 用戶層的 malloc 函數 與 內核層的 vmalloc 函數之間的 橋梁 ;
③ 內核層調用 : 內核與用戶層接口 的 內存管理函數 調用 " Linux 內核 " 中的 kmalloc vmalloc 函數 ;
C 語言中使用 malloc free 等函數分配堆內存 , C++ 中使用的 new delete 關鍵字管理內存 , 其本質還是調用 malloc free 函數實現的內存管理 ;
二、內存管理流程
內存管理流程 :
① 用戶層 ( 用戶空間 ) 內存管理 :
- C 語言 : 在 C 中 , 使用 malloc 動態分配 " 堆內存 " , 使用 free 回收 " 堆內存 " ;
- C++ 語言 : 在 C++ 中 , 使用 new 關鍵字 動態分配 " 堆內存 " , 使用 delete 關鍵字 回收 " 堆內存 " ;
- C++ STL : STL 中 , 堆內存 是 自動分配 , 自動回收 的 , 不需要用戶進行手動操作 ;
② 系統調用接口 內存管理 : 調用 brk sbrk mmap munmap 等系統調用函數 ,
- brk sbrk 函數 既可以分配內存 , 又可以回收內存 , 通過 修改 起始 和 終止 地址即可實現 ;
- mmap 函數用于分配內存 , munmap 函數用于回收內存 ;
可參考 【Linux 內核 內存管理】Linux 內核堆內存管理 ② ( 動態分配堆內存方式 | brk 系統調用 | mmap 系統調用 | brk 系統調用源碼介紹 ) 博客 , 了解 brk 和 mmap 系統調用 ;
-
brk 系統調用 : 該方式本質是 設置 " 進程數據段 “ 的 結束地址 , 將該 ” 結束地址 " 向 高或低 移動 , 實現堆內存的 擴張或收縮 ;
-
mmap 系統調用 : 向 Linux 操作系統 申請 " 虛擬地址空間 " 內存 , 并且將某個文件 " 映射 “ 到該申請的內存中 ; 如果 不需要映射文件 到該空間中 , 則該空間就是 ” 匿名空間 " , 可作為 " 堆內存 " 使用 ;
③ 內核層 ( 內核空間 ) 內存管理 : 在 Linux 內核中 , 通過 kmalloc vmalloc __get_free_pages 函數管理內存 ;
總結
以上是生活随笔為你收集整理的【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux 内核 内存管理】内存管理架
- 下一篇: 【Linux 内核 内存管理】内存管理架