在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux進程的內存消耗和泄漏詳解

書生途 ? 來源:書生途 ? 作者:書生途 ? 2022-05-14 10:07 ? 次閱讀

內存消耗和泄漏

  • 進程的VMA
  • 進程內存消耗的4個概念: vss、rss、pss和uss
  • page fault的幾種可能性, major 和 minor
  • 應用內存泄漏的解決方法
  • 應用內存泄漏的檢測方法:valgrind 和 addresssanitizer

本節重點闡述 Linux的應用程序究竟消耗了多少內存?

一是,看到的內存消耗,并不一定是真的消耗。

二是,Linux存在大量的內存共享的情況。
動態鏈接庫的特點:代碼段共享內存,數據段寫時拷貝。
把一個應用程序跑兩個進程,這兩個進程的代碼段也是共享的。

當我們評估進程消耗多少內存時,就是指在用戶空間消耗的內存,即虛擬地址在0~3G的部分,對應的物理地址內存。內核空間的內存消耗屬于內核,系統調用申請了很多內存,這些內存是不屬于進程消耗的。

進程的虛擬地址空間VMA

poYBAGJ-ZoSAXn1TAABu5WwG4Z0259.jpg

task_struct里面有個mm_struct指針, 它代表進程的內存資源。pgd,代表 頁表的地址; mmap 指向vm_area_struct 鏈表。 vm_area_struct 的每一段代表進程的一個虛擬地址空間。vma的每一段,都可能是可執行程序的某個數據段、某個代碼段,堆、或棧。一個進程的虛擬地址,是在0~3G之間任意分布的。

pYYBAGJ-ZoSAYInyAAEgNvLwiU4140.jpg

上圖 提供三種方式,看到進程的VMA空間。pmap 3474其地址,size, 權限,通過以上的方式,可以看到進程的虛擬地址空間,分布在0~3G,任意一小段一小段分布的。應用程序運行起來,就是一堆各種各樣的VMA。VMA對應著 堆、棧、代碼段、數據段、等,不在任何段里的虛擬地址空間,被認為是非法的。

poYBAGJ-ZoWAKppBAACpvXNELgQ800.jpg

當指針訪問地址時,落在一個非法的地址,即不在任何一個VMA區域。相當于訪問一個非法的地址,這些虛擬地址沒有對應的物理地址。應用程序收到page fault,查看原因,訪問非法位置,返回segv。

在VMA的東西,不等于在內存。調malloc申請了100M內存,立馬會多出一個100M的 VMA,代表這段vma區域有r+w權限。

應用程序訪問內存,必須落在一個VMA里。其次,落在一個VMA里也不一定對。把100M的堆申請出來,100M內存頁全部映射為0頁。頁表里每一頁寫的只讀,頁表和硬件對應,MMU只查頁表。而在頁表項中指向物理地址的權限是只讀,所以在任何時候,去寫其中任何一頁,硬件都會發生缺頁中斷。

Linux 內核在缺頁中斷的處理程序,通過MMU寄存器讀出發生page fault的地址和原因。發現此時page fault的原因是寫一個頁表里記錄只讀的物理地址,而vma記錄的虛擬地址又是r+w,此時,linux會申請一頁內存。同時把頁表中的權限改為r+w。

總結:
Linux 內核通過VMA管理進程每一段虛擬地址空間和權限。一旦發生page fault,如果沒有落在任何一個vma區域,會干掉。VMA的起始地址+size,用來限定程序訪問的地址是否合法。VMA中每一段的權限,是來界定訪問這段地址是否使用正確的方式訪問。把所有的vma加起來,構成進程的虛擬地址空間,但這并不代表進程真實耗費的內存。拿到之后才是真實耗費的內存,RSS。耗費的虛擬內存,是VSS。

pYYBAGJ-ZoWAB9mRAAC8kOW-Vl0528.jpg


1、申請堆內存vma,第一次寫,頁表里的權限是R ,發生page fault,linux會去申請一頁內存,此時把頁表權限設置為 R+W。
2、內存訪問落在空白非法區域,程序收到segv段錯誤。
3、代碼段在VMA記錄是R+X,此時如果對代碼段執行寫,程序會收到segv段錯誤。

【文章福利】小編推薦自己的Linux內核技術交流群:【865977150】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!!

poYBAGJ-ZoWAfnjtAADZ9NmCySQ141.jpg

內核學習網站:

Linux內核源碼/內存調優/文件系統/進程管理/設備驅動/網絡協議棧-學習視頻教程-騰訊課堂?ke.qq.com/course/4032547?flowToken=1040236

minor 和major 缺頁

缺頁,分為兩種情況:主缺頁 和次缺頁。

主缺頁 和次缺頁,區別就是 申請內存時,是否需要讀硬盤。前者需要。

如上圖第4種情況,在代碼段里執行時,出現缺頁。linux申請一頁內存,而且要從硬盤中讀取代碼段的內容,此時產生了IO,稱為 major缺頁。

無論是代碼段還是堆,都是邊執行邊產生缺頁中斷,申請實際的內存給代碼段,且從硬盤中讀取代碼段的內容到內存。這個過程時間比較長。

minor: malloc的內存,產生缺頁中斷。去申請一頁內存,沒有產生IO的行為。major缺頁處理時間,遠大于minor。

pYYBAGJ-ZoWAfBNwAACJx5wvbds660.jpg

vss、rss、pss和uss的區別

poYBAGJ-ZoWAKXSbAACZ-PvEwcw068.jpg
VSS - Virtual Set Size
RSS - Resident Set Size
PSS - Proportional Set Size
USS - Unique Set Size
ASAN - AddressSanitizer
LSAN - LeakSanitizer

如上圖,中間是一根內存條。三個進程分別是1044,1045,1054, 每一個進程對應一個page table,頁表項記錄虛擬地址如何往物理地址轉換。硬件里的寄存器,記錄頁表的物理地址。當linux做進程上下文切換時,頁表也跟著一起切換。

pYYBAGJ-ZoWAALXWAAC2Kx1EUOU143.jpg

三個進程都需要使用libc的代碼段:

VSS = 1 +2 +3
RSS = 4 +5 +6
PSS= 4/3 + 5/2 + 6 比例化的
USS= 6 獨占且駐留的

工具:smem ,查看進程使用內存的情況。
一般來講,進程使用的內存量,還是看PSS,強調公平性。看內存泄漏看USS 就好了。

內存泄漏 界定和檢測方法

界定:連續多點采樣法,隨著時間越久,進程耗費內存越多。主要由內存申請和釋放不是成對引起。RSS/USS曲線,觀察方法:使用smem工具查看多次進程使用內存,USS使用量。

檢查工具:
1、valgrind ,會跑一個虛擬機,運行時檢查進程的內存行為。會放慢程序的速度。不需要重新編譯程序。
2、addressanitizer,需要重新編譯程序。編譯時加參數,-fsanitize
gcc 4.9才支持,只會放慢程序速度2~3倍。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209502
  • 應用程序
    +關注

    關注

    37

    文章

    3268

    瀏覽量

    57706
  • 內存泄漏
    +關注

    關注

    0

    文章

    39

    瀏覽量

    9218
收藏 人收藏

    評論

    相關推薦

    Linux內存管理是什么,Linux內存管理詳解

    Linux內存管理 Linux內存管理是一個非常復雜的過程,主要分成兩個大的部分:內核的內存管理和
    的頭像 發表于 05-11 17:54 ?6062次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>內存</b>管理是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>內存</b>管理<b class='flag-5'>詳解</b>

    Linux內存泄漏檢測實現原理與實現

    在使用沒有垃圾回收的語言時(如 C/C++),可能由于忘記釋放內存而導致內存被耗盡,這叫 內存泄漏。由于內核也需要自己管理內存,所以也可能出
    發表于 12-09 11:11 ?970次閱讀

    Linux進程間如何實現共享內存通信

    這次我們來講一下Linux進程通信中重要的通信方式:共享內存作為Linux軟件開發攻城獅,進程間通信是必須熟練掌握的重要技能,而共享
    發表于 04-26 17:14 ?694次閱讀

    細說Linux內存泄漏檢測實現原理與實現

    在使用沒有垃圾回收的語言時(如 C/C++),可能由于忘記釋放內存而導致內存被耗盡,這叫 內存泄漏。由于內核也需要自己管理內存,所以也可能出
    發表于 07-03 09:22 ?480次閱讀
    細說<b class='flag-5'>Linux</b><b class='flag-5'>內存</b><b class='flag-5'>泄漏</b>檢測實現原理與實現

    Linux內核內存泄漏怎么辦

    Linux內核開發中,Kmemleak是一種用于檢測內核中內存泄漏的工具。
    發表于 07-04 11:04 ?824次閱讀

    Linux進程間通信——使用共享內存

    Linux進程間通信——使用共享內存 圖文詳情見附件
    發表于 11-21 10:53

    Linux上對進程進行內存分析和內存泄漏定位

    Linux產品開發過程中,通常需要注意系統內存使用量,和評估單一進程內存使用情況,便于我們選取合適的機器配置,來部署我們的產品。Linux
    發表于 07-09 08:15

    Linux守護進程詳解

    分享到:標簽:進程控制 Linux 守護進程進程 7.3 Linux守護進程 7.3.1 守
    發表于 10-18 14:24 ?0次下載
    <b class='flag-5'>Linux</b>守護<b class='flag-5'>進程</b><b class='flag-5'>詳解</b>

    Linux進程內存結構

    Linux操作系統采用虛擬內存管理技術,使得每個進程都有各自互不干涉的進程地址空間。該地址空間是大小為4GB的線性虛擬空間,用戶所看到和接觸到的都是該虛擬地址,無法看到實際的物理
    發表于 06-01 09:17 ?1480次閱讀
    <b class='flag-5'>Linux</b>下<b class='flag-5'>進程</b>的<b class='flag-5'>內存</b>結構

    Linux:測試進程占用的虛擬內存大小

    Linux:測試進程占用的虛擬內存大小
    的頭像 發表于 06-23 09:23 ?2888次閱讀
    <b class='flag-5'>Linux</b>:測試<b class='flag-5'>進程</b>占用的虛擬<b class='flag-5'>內存</b>大小

    Linux內核內存泄漏怎么辦?

    什么是內存泄漏: 程序向系統申請內存,使用完不需要之后,不釋放內存還給系統回收,造成申請的內存被浪費. 發現系統中
    的頭像 發表于 02-20 17:14 ?2553次閱讀
    <b class='flag-5'>Linux</b>內核<b class='flag-5'>內存</b><b class='flag-5'>泄漏</b>怎么辦?

    Linux內核源碼分析-進程的哪些內存類型容易引起內存泄漏

    ; 應用程序正在運行時忽然被 OOM kill 掉了; 進程看起來沒有消耗多少內存,但是系統內存就是不夠用了; ……類似問題,很可能就是內存
    發表于 01-14 13:02 ?6次下載
    <b class='flag-5'>Linux</b>內核源碼分析-<b class='flag-5'>進程</b>的哪些<b class='flag-5'>內存</b>類型容易引起<b class='flag-5'>內存</b><b class='flag-5'>泄漏</b>?

    什么是內存泄漏內存泄漏有哪些現象

    內存泄漏幾乎是很難避免的,不管是老手還是新手,都存在這個問題,甚至 Windows 與 Linux 這類系統軟件也或多或少存在著內存泄漏
    的頭像 發表于 09-05 17:24 ?9700次閱讀

    Linux系統的共享內存的使用

    但有時候為了讓不同進程之間進行通信,需要讓不同進程共享相同的物理內存Linux通過 共享內存 來實現這個功能。下面先來介紹一下
    的頭像 發表于 11-14 11:55 ?1319次閱讀

    線程內存泄漏問題的定位

    在下降。確定內存泄漏確實存在。top中可以顯示多種形式內存,進而可以判斷是那種泄漏。比如vss/rss/pss等。 確定哪個進程
    的頭像 發表于 11-13 11:38 ?619次閱讀
    線程<b class='flag-5'>內存</b><b class='flag-5'>泄漏</b>問題的定位
    主站蜘蛛池模板: 手机在线观看a| 美女三级网站| 国产三片理论电影在线| 天堂最新版在线地址| 中文字幕在线一区二区三区| 五月婷婷丁香在线| 国产三级精品三级| 国产精品1区2区3区在线播放| 成年人污视频| 久久国内精品视频| 免费黄色成人| 最新久久免费视频| 久久ww| 久久国产精品99久久久久久牛牛| 美女扒开尿口让男人捅| 女人张开腿让男人桶视频免费大全| 小优视频在线| 亚洲国产人久久久成人精品网站 | 四虎影院在线网址| www.成人av.com| 国产操女| 日本午夜片成年www| 天天干天天狠| 国产精品久久久久久久人热| 久色99| 成人免费一区二区三区| 台湾香港澳门三级在线| 中文天堂资源在线www| 一区二区三区免费在线| 欧美色惰| 国产小视频在线免费观看| 天堂中文在线www| 一级特黄aaaaaa大片| 亚欧成人中文字幕一区| 久青草视频在线播放| 操黄色| 日韩欧美一区二区三区视频| 欧洲亚洲国产精华液| 亚洲国产成人久久77| 亚洲午夜视频在线观看| 免费看的黄网站|