本節主要涉及下面這些概念,搞清楚我們在linux下面寫乙個應用程式究竟耗費了多少記憶體,也是我們查核心洩漏的指標。
vss- virtual set size
rss- resident set size
pss- proportional set size
uss- unique set size
在linux 裡面大量的存在記憶體共享的概念,比如我們的libc 庫,加入我們有100個程式呼叫了c 庫,linux會把**段再記憶體裡面共享給這個100個程序使用(動態連線庫都是這樣),我們把乙個程式跑兩次,程式的**段也是共享的,當然資料段是寫時拷貝的,當我們再評估乙個程序耗費多少記憶體的時候,我們有必要搞清這些虛的,實的,以及共享的,我們說的程序的記憶體消耗就是指使用者空間耗費的記憶體,核心空間耗費的記憶體就是核心消耗的,比如我們做了乙個系統呼叫,這個系統呼叫申請了很多記憶體,這個寫記憶體也不屬於程序消耗
vma 表面位址的合法性,和許可權,不代表頁表裡面真實的許可權,但是linux的頁表中發生page fault時會檢測vma,確定是否合法訪問,如果合法,申請對應的物理位址對映過來。
這些vma 可能來自程式本身的**段,資料段,或者動態庫。
我們一般用如下方法來檢視vma
linux 下各種page fault,通常分為minor page fault ,和major page fault。第一中只是申請一頁記憶體,第二種不僅要申請記憶體,還需要讀取硬碟,所以這種開銷是遠大於minor page fault的,從硬體mmu 不區分這個,minor和major 是純軟體的概念。
linux 這麼多程序在跑,每個程序都有各自的頁表,下面這張圖詳細的描述了各個程序是如何瓜分記憶體條的。有一些是被不同程序共享的,描述乙個程序有四個概念,一般說乙個程序耗費多少記憶體,pss是最公平的,uss 一般用於觀察記憶體洩漏就可以了,連續多點採用來判斷。在linux 我們一般都是使用smem 這個工具比如 smem -p ^a.out 檢視a.out記憶體消耗情況,嵌入式系統一般用smemcap 抓取tar包,在電腦上檢視。
對於核心的記憶體洩漏是檢視slab區域,vmalloc區域是不是在不斷變大,核心的洩漏不算在程序上。
4.9 之後的gcc 都帶有addresssssanitizer(asan) ,他會幫你檢查記憶體申請釋放的點,這樣程式稍微慢幾倍就可以檢測記憶體洩漏的問題
Linux核心管理 記憶體(三)
首先明確一點,mmu的主要工作只有乙個,就是把虛擬位址對映到實體地址。mmu是memory management unit的縮寫,中文名是 記憶體管理 單元,它是 處理器 cpu 中用來管理 虛擬儲存器 物理儲存器的控制線路,同時也負責 虛擬位址 對映為實體地址 是乙個硬體,mmu工作原理也就是cp...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...