日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

郝健: Linux内存管理学习笔记-第3节课

發布時間:2023/12/4 综合教程 40 生活家
生活随笔 收集整理的這篇文章主要介紹了 郝健: Linux内存管理学习笔记-第3节课 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要

進程的虛擬地址空間VMA(Virtual Memory Area)

Pagefault的幾種可能性、VMA的作用、major缺頁和minor缺頁

進程內存消耗的4個概念:vss、rss、pss和uss

應用內存泄漏的界定方法

內存泄漏的檢測工具:valgrind和addresssanitizer

?

?

1.????進程的虛擬地址空間VMA(Virtual Memory Area)

上圖中,task_struct中的mm_struct就代表進程的整個內存資源,mm_struct中的pgd為頁表,mmap指針指向的vm_area_struct鏈表的每一個節點就代表進程的一個虛擬地址空間,即一個VMA。一個VMA最終可能對應ELF可執行程序的數據段、代碼段、堆、棧、或者動態鏈接庫的某個部分。

?

VMA的分布情況可以有通過pmap命令,及maps,smaps文件查看,如下圖:

pmap pid

pmap - report memory map of a process

?

/proc/<pid>/maps及/proc/<pid>/smaps更詳細展示了進程VMA的分布情況。

?

觀察pmap結果及maps,smaps文件,可以發現注:IA32下,一個進程的VMA是在0~3G之間分散分布的,是一段一段的,中間會有很多空白區域,空白區域對進程來說都是不能訪問的,VMA中會標注這一段的RWX的具體權限。如下圖所示:

另,VMA的具體內容可參考下圖。

2.????Page fault的幾種可能性、VMA的作用、major缺頁和minor缺頁

1)如,調用malloc申請100M內存,IA32下在0~3G虛擬地址中立刻就會占用到大小為100M的VMA,且符合堆的定義,這一段VMA的權限是R+W的。但由于Lazy機制,這100M其實并沒有獲得,這100M全部映射到一個物理地址相同的零頁,且在頁表中記錄的權限為只讀的。當100M中任何一頁發生寫操作時,MMU會給CPU發page fault(MMU可以從寄存器讀出發生page fault的地址;MMU可以讀出發生page fault的原因),Linux內核收到缺頁中斷,在缺頁中斷的處理程序中讀出虛擬地址和原因,去VMA中查,發現是用戶程序在寫malloc的合法區域且有寫權限,Linux內核就真正的申請內存,頁表中對應一頁的權限也修改為R+W。

2)如,程序中有野指針飛到了此程序運行時進程的VMA以外的非法區域,硬件就會收到page fault,進程會收到SIGSEGV信號報段錯誤并終止。

3)如,代碼段在VMA中權限為R+X,如果程序中有野指針飛到此區域去寫,則也會發生段錯誤。(另,malloc堆區在VMA中權限為R+W,如果程序的PC指針飛到此區域去執行,同樣發生段錯誤。)

4)如,執行代碼段時會發生缺頁,Linux申請1頁內存,并從硬盤讀取出代碼段,此時產生了IO操作,為major主缺頁。

綜上,page fault后,Linux會查VMA,也會比對VMA中和頁表中的權限,體現出VMA的重要作用。

?

3.????進程內存消耗的4個概念:vss、rss、pss和uss

首先,我們評估一個進程的內存消耗都是指用戶空間的內存,不包括內核空間的內存消耗,即IA32下,虛擬地址在0~3G的部分所對應的物理地址的內存。

VSS - Virtual Set Size

RSS - Resident Set Size

PSS - Proportional Set Size

USS - Unique Set Size

1044,1045,1054三個進程,每個進程都有一個頁表,對應其虛擬地址如何向real memory上去轉換。

process 1044的1,2,3都在虛擬地址空間,所以其VSS=1+2+3。

process 1044的4,5,6都在real memory上,所以其RSS=4+5+6。

?

分析real memory的具體瓜分情況:

4 ?libc代碼段,1044,1045,1054三個進程都使用了libc的代碼段,被三個進程分享。

5 ?bash shell的代碼段,1044,1045都是bash shell,被兩個進程分享。

6 ?1044獨占

所以,上圖中4+5+6并不全是1044進程消耗的內存,因為4明顯被3個進程指向,5明顯被2個進程指向,衍生出了PSS(按比例計算的駐留內存)的概念。進程1044的PSS為4/3 +5/2 +6。

最后,進程1044獨占且駐留的內存USS為 6。

?

一般情況下,VSS >= RSS >= PSS >= USS。

?

評估進程內存耗費情況一般使用smem工具,查看PSS(最公平):

1)命令行模式

2)餅狀圖模式

3)柱狀圖模式

跑一個死循環程序,觀察其smaps文件。然后再把此程序跑一份,觀察其smaps文件變化(smaps內容很長,只看第一段):

可以看出PSS由4k變為2k,而Shared_clean由0k變為4k,Private_clean由4k變為0k。

?

4.????應用內存泄漏的界定方法

內存泄漏:進程運行的時間越久,耗費的內存越多,申請與釋放不成對。

內存泄漏只看USS即可。

觀察內存泄漏使用連續多點采樣法:

?

5.????內存泄漏的檢測工具:valgrind和addresssanitizer

每次free(p2),沒有free(p1),申請與釋放不成對。

?

使用valgrind檢測由內存泄漏的程序:

使用addresssanitizer中的lsan工具檢測程序內存泄漏:

調用 __lsan_do_leak_check()做檢查

檢測出泄漏了10次。

如今更流行使用addresssanitizer。


內存管理報名

報名:《Linux的任督二脈》之《內存管理》微課(連續5晚)

總結

以上是生活随笔為你收集整理的郝健: Linux内存管理学习笔记-第3节课的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。