Linux內存管理相關記錄

  • 代碼段:用來存放可執行問價你的操作指令
  • 數據段:用來存放可執行文件中已初始化的全局變量,換句話說就是存放程序靜態分配的變量和全局變量
  • BSS段:包含了程序中未初始化的全局變量,在內存的BSS段在系統初始化時已被置零
  • 堆(heap):存放程序運行中被動態分配的內存段,他的大小不固定,可動態擴張或縮減
  • 棧:用戶存放程序臨時創建的局部變量,在函數調用時,其參數也會被亞茹發起調用的進程棧中,並且待到調用結束後,函數的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。
  • 頁/頁面:線性地址中的內存單元
  • 頁框:物理內存的內存單元
  • 頁高速緩存:磁盤內容在物理內存中的緩存
  • 高速緩存:用於滿足對單個頁框的分配請求
    目錄項高速緩存:保存目錄項到inode的映射關係當應用程序發起stat系統調用時,就會創建對應的dentry_cache項(更進一步,如果每次stat的文件都是不存在的文件,那麼總是會有大量新的dentry_cache項被創建)
  • 索引節點高速緩存:存放關於具體文件的一般信息,對應於存放在磁盤上的文件控制塊
  • 每CPU高速緩存:包括熱高速緩存和冷高速緩存,熱高速緩存的頁框在硬件高速緩存的可能性較大,冷高速緩存主要用於DMA操作
  • 保留的頁框池:只能用於滿足中斷處理程序或內部臨界區發出的原子內存分配請求
  • 內存池:僅在內存不足的緊急情況下分配一些動態內存
  • 內存描述符:與進程地址空間有關的全部信息都包含在內,進程虛擬內存的描述符
  • pgd:每個進程都有自己的頁表,進程描述符的pgd域指向的就是進程的頁全局目錄
    進程描述符pgd
  • 夥伴子系統分配內存函數接口:get_free_page/get_free_pages
  • malloc系統調用函數接口:brk、mmap
  • Slab分配器:kmem_cache_alloc/kmem_cache_free
  • Kmalloc:一般來說內核程序中對小於一頁的小塊內存的請求才通過Slab分配器提供的接口Kmalloc來完成(雖然它可分配32 到131072字節的內存)從內核內存分配的角度來講,kmalloc可被看成是get_free_page(s)的一個有效補充,內存分配粒度更靈活了。
  • Vmalloc:內核提供vmalloc函數分配內核虛擬內存,該函數不同於kmalloc,它可以分配較Kmalloc大得多的內存空間(可遠大於128K,但必須是頁大小的倍數),但相比Kmalloc來說,Vmalloc需要對內核虛擬地址進行重映射,必須更新內核頁表,因此分配效率上要低一些(用空間換時間)
    這裏寫圖片描述

strace 常用來跟蹤進程執行時的系統調用和所接收的信號
eg:strace cat /dev/null

eg:strace -o output.txt -T -tt -e trace=all -p 28979
跟蹤28979進程的所有系統調用(-e trace=all),並統計系統調用的花費時間,以及開始時間(並以可視化的時分秒格式顯示),
最後將記錄結果存在output.txt文件裏面

發佈了86 篇原創文章 · 獲贊 23 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章