Linux 內存管理三

本節主要涉及下面這些概念,搞清楚我們在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) ,他會幫你檢查內存申請釋放的點,這樣程序稍微慢幾倍就可以檢測內存泄漏的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章