精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

top命令中VIRT、RES和SHR的含義

我快閉嘴 ? 來源:OSC開源社區 ? 作者:OSC開源社區 ? 2022-09-16 11:25 ? 次閱讀

理解virt、res、shr之間的關系(linux系統篇)

前言

想必在linux上寫過程序的同學都有分析進程占用多少內存的經歷,或者被問到這樣的問題——你的程序在運行時占用了多少內存(物理內存)?

通常我們可以通過top命令查看進程占用了多少內存。這里我們可以看到VIRT、RES和SHR三個重要的指標,他們分別代表什么意思呢?

這是本文需要跟大家一起探討的問題。當然如果更加深入一點,你可能會問進程所占用的那些物理內存都用在了哪些地方?這時候top命令可能不能給到你你所想要的答案了,不過我們可以分析proc文件系統提供的smaps文件,這篇文章詳盡地列出了當前進程所占用物理內存的使用情況。

本文將分為三個部分:

1、分簡要闡述虛擬內存和駐留內存這兩個重要的概念;

2、解釋top命令中VIRT、RES以及SHR三個參數的實際參考意義;

3、向大家介紹一下smaps文件的格式,通過分析smaps文件我們可以詳細了解進程物理內存的使用情況,比如mmap文件占用了多少空間、動態內存開辟消耗了多少空間、函數調用棧消耗了多少空間等等。

01關于內存的兩個概念

要理解top命令關于內存使用情況的輸出,我們必須首先搞清楚虛擬內存(Virtual Memory)和駐留內存(Resident Memory)兩個概念。

(1)虛擬內存

首先需要強調的是虛擬內存不同于物理內存,雖然兩者都包含內存字眼但是它們屬于兩個不同層面的概念。進程占用虛擬內存空間大并非意味著程序的物理內存也一定占用很大。虛擬內存是操作系統內核為了對進程地址空間進行管理(process address space management)而精心設計的一個邏輯意義上的內存空間概念。

我們程序中的指針其實都是這個虛擬內存空間中的地址。比如我們在寫完一段C++程序之后都需要采用g++進行編譯,這時候編譯器采用的地址其實就是虛擬內存空間的地址。因為這時候程序還沒有運行,何談物理內存空間地址?凡是程序運行過程中可能需要用到的指令或者數據都必須在虛擬內存空間中。

既然說虛擬內存是一個邏輯意義上(假象的)的內存空間,為了能夠讓程序在物理機器上運行,那么必須有一套機制可以讓這些假象的虛擬內存空間映射到物理內存空間(實實在在的RAM內存條上的空間)。這其實就是操作系統中頁映射表(page table)所做的事情了。

內核會為系統中每一個進程維護一份相互獨立的頁映射表。頁映射表的基本原理是將程序運行過程中需要訪問的一段虛擬內存空間通過頁映射表映射到一段物理內存空間上,這樣CPU訪問對應虛擬內存地址的時候就可以通過這種查找頁映射表的機制訪問物理內存上的某個對應的地址。“頁(page)”是虛擬內存空間向物理內存空間映射的基本單元。

下圖演示了虛擬內存空間和物理內存空間的相互關系,它們通過Page Table關聯起來。其中虛擬內存空間中著色的部分分別被映射到物理內存空間對應相同著色的部分。而虛擬內存空間中灰色的部分表示在物理內存空間中沒有與之對應的部分,也就是說灰色部分沒有被映射到物理內存空間中。這么做也是本著“按需映射”的指導思想,因為虛擬內存空間很大,可能其中很多部分在一次程序運行過程中根本不需要訪問,所以也就沒有必要將虛擬內存空間中的這些部分映射到物理內存空間上。

8158a178-34f7-11ed-ba43-dac502259ad0.png

虛擬內存空間到物理內存空間映射

到這里為止已經基本闡述了什么是虛擬內存了。

總結一下就是,虛擬內存是一個假象的內存空間,在程序運行過程中虛擬內存空間中需要被訪問的部分會被映射到物理內存空間中。虛擬內存空間大只能表示程序運行過程中可訪問的空間比較大,不代表物理內存空間占用也大。

(2)駐留內存

駐留內存,顧名思義是指那些被映射到進程虛擬內存空間的物理內存。上圖中,在系統物理內存空間中被著色的部分都是駐留內存。比如,A1、A2、A3和A4是進程A的駐留內存;B1、B2和B3是進程B的駐留內存。

進程的駐留內存就是進程實實在在占用的物理內存。一般我們所講的進程占用了多少內存,其實就是說的占用了多少駐留內存而不是多少虛擬內存。因為虛擬內存大并不意味著占用的物理內存大。

02top命令中VIRT、RES和SHR

關于虛擬內存和駐留內存這兩個概念我們說到這里。下面一部分我們來看看top命令中VIRT、RES和SHR分別代表什么意思。

top命令中VIRT、RES和SHR的含義

搞清楚了虛擬內存的概念之后解釋VIRT的含義就很簡單了。VIRT表示的是進程虛擬內存空間大小。對應到圖1中的進程A來說就是A1、A2、A3、A4以及灰色部分所有空間的總和。也就是說VIRT包含了在已經映射到物理內存空間的部分和尚未映射到物理內存空間的部分總和。

RES的含義是指進程虛擬內存空間中已經映射到物理內存空間的那部分的大小。對應到圖1中的進程A來說就是A1、A2、A3以及A4幾個部分空間的總和。所以說,看進程在運行過程中占用了多少內存應該看RES的值而不是VIRT的值。

最后來看看SHR所表示的含義。

SHR是share(共享)的縮寫,它表示的是進程占用的共享內存大小。在上圖中我們看到進程A虛擬內存空間中的A4和進程B虛擬內存空間中的B3都映射到了物理內存空間的A4/B3部分。咋一看很奇怪。

為什么會出現這樣的情況呢?

其實我們寫的程序會依賴于很多外部的動態庫(.so),比如libc.so、libld.so等等。這些動態庫在內存中僅僅會保存/映射一份,如果某個進程運行時需要這個動態庫,那么動態加載器會將這塊內存映射到對應進程的虛擬內存空間中。多個進展之間通過共享內存的方式相互通信也會出現這樣的情況。

這么一來,就會出現不同進程的虛擬內存空間會映射到相同的物理內存空間。這部分物理內存空間其實是被多個進程所共享的,所以我們將他們稱為共享內存,用SHR來表示。

某個進程占用的內存除了和別的進程共享的內存之外就是自己的獨占內存了。所以要計算進程獨占內存的大小只要用RES的值減去SHR值即可。

03進程的smaps文件

通過top命令我們已經能看出進程的虛擬空間大小(VIRT)、占用的物理內存(RES)以及和其他進程共享的內存(SHR)。但是僅此而已,如果我想知道如下問題:

進程的虛擬內存空間的分布情況,比如heap占用了多少空間、文件映射(mmap)占用了多少空間、stack占用了多少空間?

進程是否有被交換到swap空間的內存,如果有,被交換出去的大小?

mmap方式打開的數據文件有多少頁在內存中是臟頁(dirty page)沒有被寫回到磁盤的?

mmap方式打開的數據文件當前有多少頁面已經在內存中,有多少頁面還在磁盤中沒有加載到page cahe中?

等等

以上這些問題都無法通過top命令給出答案,但是有時候這些問題正是我們在對程序進行性能瓶頸分析和優化時所需要回答的問題。所幸的是,世界上解決問題的方法總比問題本身要多得多。linux通過proc文件系統為每個進程都提供了一個smaps文件,通過分析該文件我們就可以一一回答以上提出的問題。

在smaps文件中,每一條記錄(如下圖所示)表示進程虛擬內存空間中一塊連續的區域。其中第一行從左到右依次表示地址范圍、權限標識、映射文件偏移、設備號、inode、文件路徑。詳細解釋可以參見understanding-linux-proc-id-maps。

接下來8個字段的含義分別如下:

? Size:表示該映射區域在虛擬內存空間中的大小。

?Rss:表示該映射區域當前在物理內存中占用了多少空間

?Shared_Clean:和其他進程共享的未被改寫的page的大小

?Shared_Dirty:和其他進程共享的被改寫的page的大小

?Private_Clean:未被改寫的私有頁面的大小。

?Private_Dirty:已被改寫的私有頁面的大小。

?Swap:表示非mmap內存(也叫anonymous memory,比如malloc動態分配出來的內存)由于物理內存不足被swap到交換空間的大小。

?Pss:該虛擬內存區域平攤計算后使用的物理內存大小(有些內存會和其他進程共享,例如mmap進來的)。比如該區域所映射的物理內存部分同時也被另一個進程映射了,且該部分物理內存的大小為1000KB,那么該進程分攤其中一半的內存,即Pss=500KB。

816f9be4-34f7-11ed-ba43-dac502259ad0.jpg

smaps文件中的一條記錄

有了smap如此詳細關于虛擬內存空間到物理內存空間的映射信息,相信大家已經能夠通過分析該文件回答上面提出的4個問題。

04最后希望大家能夠通過閱讀本文對進程的虛擬內存和物理內存有一個更加清晰認識,并能更加準確理解top命令關于內存的輸出,最后可以通過smaps文件更進一步分析進程使用內存的情況。

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

    關注

    87

    文章

    11229

    瀏覽量

    208927
  • 內存
    +關注

    關注

    8

    文章

    3002

    瀏覽量

    73884
  • Virt
    +關注

    關注

    0

    文章

    2

    瀏覽量

    6933

原文標題:理解virt、res、shr之間的關系(linux系統篇)

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    PADS2007PCB上元件屬性的Label 項有5個Res.Des 和Part type

    PADS2007PCB上元件屬性的Label 項中有5個Res.Des 和5個Part type ,即Res.Des -1 ,Res.D
    發表于 07-12 18:15

    PCB各層的含義

    PCB有很多的層,初學者在一開始學畫板子的時候,很容易被各種各樣的層給弄迷,所以在這里我們把所有的層以及含義作一個總結,以幫助大家更好地理解PCB的設計。 英文中文定義Top Layer頂層信號層
    發表于 07-04 07:01

    SHR702P 中繼接口電路

    概述 SHR702P 是在SHR202P 基礎上將收發時鐘和時隙分開,其他性能指標完全相同。 應用專利技術設計,先進新穎。 采用傳統變壓器藕合方式,抗干擾能力
    發表于 05-06 09:44 ?16次下載

    PCBTOP PASTE和TOP SOLDER的區別_PCB層的含義詳解

    本文首先介紹了PCB的作用及特點,其次闡述了PCBTOP PASTE和TOP SOLDER的區別,最后介紹了PCB層的含義詳解,具體的跟隨小編一起來了解一下。
    發表于 05-17 18:11 ?7w次閱讀
    PCB<b class='flag-5'>中</b><b class='flag-5'>TOP</b> PASTE和<b class='flag-5'>TOP</b> SOLDER的區別_PCB層的<b class='flag-5'>含義</b>詳解

    用30個實例探索top命令的細節

    最全Linux TOP命令使用教程!
    的頭像 發表于 05-20 10:20 ?4275次閱讀
    用30個實例探索<b class='flag-5'>top</b><b class='flag-5'>命令</b>的細節

    你會使用top命令了解 Fedora 的內存使用情況

    如果你使用過 top 命令來查看 Fedora 系統的內存使用情況,你可能會驚訝,看起來消耗的數量比系統可用的內存更多。
    發表于 04-22 17:49 ?1133次閱讀

    PADS的快捷命令字符和命令含義及用途的詳細說明

    本文檔的主要內容詳細介紹的是PADS的快捷命令字符和命令含義及用途的詳細說明。
    發表于 03-03 08:00 ?2次下載
    PADS的快捷<b class='flag-5'>命令</b>字符和<b class='flag-5'>命令</b><b class='flag-5'>含義</b>及用途的詳細說明

    在Linux系統下使用top命令查看CPU使用情況

    在Linux系統下,使用top命令查看CPU使用情況。
    發表于 07-10 11:46 ?4351次閱讀
    在Linux系統下使用<b class='flag-5'>top</b><b class='flag-5'>命令</b>查看CPU使用情況

    linux的top命令詳解

    top命令是UNIX/Linux系統,用于查看系統詳情的第一入口,一般我們查看機器運行狀態的時候,總是第一個使用top命令,而實際上
    發表于 07-13 11:24 ?3516次閱讀
    linux的<b class='flag-5'>top</b><b class='flag-5'>命令</b>詳解

    top命令CPU使用率的意義

    平常我們使用 top 命令來查看系統的性能情況,在 top 命令可以看到很多不同類型的 CPU 使用率,如下圖紅框中標出部分: 下面,我們
    的頭像 發表于 09-01 14:41 ?4522次閱讀

    分享一篇關于講解top命令的硬核干貨

    Linuxtop命令顯示系統上正在運行的進程。它是系統管理員最重要的工具之一。被廣泛用于監視服務器的負載。
    的頭像 發表于 09-13 09:52 ?701次閱讀

    一文講解Linuxtop命令

    今天浩道跟大家分享一篇關于講解top命令的硬核干貨,個人覺得本文羅列的實例比我平時關注的要詳細得多,所以分享給大家學習!
    的頭像 發表于 01-30 17:30 ?5056次閱讀

    shell命令提示符的具體含義

    Shell命令提示符的含義因操作系統和Shell類型而異。在Linux系統,Shell命令提示符通常由以下幾部分組成: 用戶名:顯示當前登錄用戶的用戶名。 主機名:顯示當前系統的主機
    的頭像 發表于 11-08 10:37 ?1402次閱讀

    linuxtop命令詳解

    Linux系統top命令是一個非常強大和常用的命令,用于實時監控和管理系統的運行狀態。它能夠顯示系統的整體性能數據,以及各個進程的資源占用情況。在本文中,我們將詳細解釋
    的頭像 發表于 11-17 10:25 ?2025次閱讀

    top命令如何進入選項

    top命令是一個常用的Linux系統性能監控工具,可以實時地監視系統的整體運行情況。通過使用top命令,我們可以查看系統的負載情況、進程的CPU和內存使用情況等。想要進入
    的頭像 發表于 11-17 10:27 ?1369次閱讀