0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

我快閉嘴 ? 來(lái)源:OSC開(kāi)源社區(qū) ? 作者:OSC開(kāi)源社區(qū) ? 2022-09-16 11:25 ? 次閱讀

理解virt、res、shr之間的關(guān)系(linux系統(tǒng)篇)

前言

想必在linux上寫(xiě)過(guò)程序的同學(xué)都有分析進(jìn)程占用多少內(nèi)存的經(jīng)歷,或者被問(wèn)到這樣的問(wèn)題——你的程序在運(yùn)行時(shí)占用了多少內(nèi)存(物理內(nèi)存)?

通常我們可以通過(guò)top命令查看進(jìn)程占用了多少內(nèi)存。這里我們可以看到VIRT、RES和SHR三個(gè)重要的指標(biāo),他們分別代表什么意思呢?

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

本文將分為三個(gè)部分:

1、分簡(jiǎn)要闡述虛擬內(nèi)存和駐留內(nèi)存這兩個(gè)重要的概念;

2、解釋top命令中VIRT、RES以及SHR三個(gè)參數(shù)的實(shí)際參考意義;

3、向大家介紹一下smaps文件的格式,通過(guò)分析smaps文件我們可以詳細(xì)了解進(jìn)程物理內(nèi)存的使用情況,比如mmap文件占用了多少空間、動(dòng)態(tài)內(nèi)存開(kāi)辟消耗了多少空間、函數(shù)調(diào)用棧消耗了多少空間等等。

01關(guān)于內(nèi)存的兩個(gè)概念

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

(1)虛擬內(nèi)存

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

我們程序中的指針其實(shí)都是這個(gè)虛擬內(nèi)存空間中的地址。比如我們?cè)趯?xiě)完一段C++程序之后都需要采用g++進(jìn)行編譯,這時(shí)候編譯器采用的地址其實(shí)就是虛擬內(nèi)存空間的地址。因?yàn)檫@時(shí)候程序還沒(méi)有運(yùn)行,何談物理內(nèi)存空間地址?凡是程序運(yùn)行過(guò)程中可能需要用到的指令或者數(shù)據(jù)都必須在虛擬內(nèi)存空間中。

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

內(nèi)核會(huì)為系統(tǒng)中每一個(gè)進(jìn)程維護(hù)一份相互獨(dú)立的頁(yè)映射表。頁(yè)映射表的基本原理是將程序運(yùn)行過(guò)程中需要訪(fǎng)問(wèn)的一段虛擬內(nèi)存空間通過(guò)頁(yè)映射表映射到一段物理內(nèi)存空間上,這樣CPU訪(fǎng)問(wèn)對(duì)應(yīng)虛擬內(nèi)存地址的時(shí)候就可以通過(guò)這種查找頁(yè)映射表的機(jī)制訪(fǎng)問(wèn)物理內(nèi)存上的某個(gè)對(duì)應(yīng)的地址?!绊?yè)(page)”是虛擬內(nèi)存空間向物理內(nèi)存空間映射的基本單元。

下圖演示了虛擬內(nèi)存空間和物理內(nèi)存空間的相互關(guān)系,它們通過(guò)Page Table關(guān)聯(lián)起來(lái)。其中虛擬內(nèi)存空間中著色的部分分別被映射到物理內(nèi)存空間對(duì)應(yīng)相同著色的部分。而虛擬內(nèi)存空間中灰色的部分表示在物理內(nèi)存空間中沒(méi)有與之對(duì)應(yīng)的部分,也就是說(shuō)灰色部分沒(méi)有被映射到物理內(nèi)存空間中。這么做也是本著“按需映射”的指導(dǎo)思想,因?yàn)樘摂M內(nèi)存空間很大,可能其中很多部分在一次程序運(yùn)行過(guò)程中根本不需要訪(fǎng)問(wèn),所以也就沒(méi)有必要將虛擬內(nèi)存空間中的這些部分映射到物理內(nèi)存空間上。

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

虛擬內(nèi)存空間到物理內(nèi)存空間映射

到這里為止已經(jīng)基本闡述了什么是虛擬內(nèi)存了。

總結(jié)一下就是,虛擬內(nèi)存是一個(gè)假象的內(nèi)存空間,在程序運(yùn)行過(guò)程中虛擬內(nèi)存空間中需要被訪(fǎng)問(wèn)的部分會(huì)被映射到物理內(nèi)存空間中。虛擬內(nèi)存空間大只能表示程序運(yùn)行過(guò)程中可訪(fǎng)問(wèn)的空間比較大,不代表物理內(nèi)存空間占用也大。

(2)駐留內(nèi)存

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

進(jìn)程的駐留內(nèi)存就是進(jìn)程實(shí)實(shí)在在占用的物理內(nèi)存。一般我們所講的進(jìn)程占用了多少內(nèi)存,其實(shí)就是說(shuō)的占用了多少駐留內(nèi)存而不是多少虛擬內(nèi)存。因?yàn)樘摂M內(nèi)存大并不意味著占用的物理內(nèi)存大。

02top命令中VIRT、RES和SHR

關(guān)于虛擬內(nèi)存和駐留內(nèi)存這兩個(gè)概念我們說(shuō)到這里。下面一部分我們來(lái)看看top命令中VIRT、RES和SHR分別代表什么意思。

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

搞清楚了虛擬內(nèi)存的概念之后解釋VIRT的含義就很簡(jiǎn)單了。VIRT表示的是進(jìn)程虛擬內(nèi)存空間大小。對(duì)應(yīng)到圖1中的進(jìn)程A來(lái)說(shuō)就是A1、A2、A3、A4以及灰色部分所有空間的總和。也就是說(shuō)VIRT包含了在已經(jīng)映射到物理內(nèi)存空間的部分和尚未映射到物理內(nèi)存空間的部分總和。

RES的含義是指進(jìn)程虛擬內(nèi)存空間中已經(jīng)映射到物理內(nèi)存空間的那部分的大小。對(duì)應(yīng)到圖1中的進(jìn)程A來(lái)說(shuō)就是A1、A2、A3以及A4幾個(gè)部分空間的總和。所以說(shuō),看進(jìn)程在運(yùn)行過(guò)程中占用了多少內(nèi)存應(yīng)該看RES的值而不是VIRT的值。

最后來(lái)看看SHR所表示的含義。

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

為什么會(huì)出現(xiàn)這樣的情況呢?

其實(shí)我們寫(xiě)的程序會(huì)依賴(lài)于很多外部的動(dòng)態(tài)庫(kù)(.so),比如libc.so、libld.so等等。這些動(dòng)態(tài)庫(kù)在內(nèi)存中僅僅會(huì)保存/映射一份,如果某個(gè)進(jìn)程運(yùn)行時(shí)需要這個(gè)動(dòng)態(tài)庫(kù),那么動(dòng)態(tài)加載器會(huì)將這塊內(nèi)存映射到對(duì)應(yīng)進(jìn)程的虛擬內(nèi)存空間中。多個(gè)進(jìn)展之間通過(guò)共享內(nèi)存的方式相互通信也會(huì)出現(xiàn)這樣的情況。

這么一來(lái),就會(huì)出現(xiàn)不同進(jìn)程的虛擬內(nèi)存空間會(huì)映射到相同的物理內(nèi)存空間。這部分物理內(nèi)存空間其實(shí)是被多個(gè)進(jìn)程所共享的,所以我們將他們稱(chēng)為共享內(nèi)存,用SHR來(lái)表示。

某個(gè)進(jìn)程占用的內(nèi)存除了和別的進(jìn)程共享的內(nèi)存之外就是自己的獨(dú)占內(nèi)存了。所以要計(jì)算進(jìn)程獨(dú)占內(nèi)存的大小只要用RES的值減去SHR值即可。

03進(jìn)程的smaps文件

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

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

進(jìn)程是否有被交換到swap空間的內(nèi)存,如果有,被交換出去的大???

mmap方式打開(kāi)的數(shù)據(jù)文件有多少頁(yè)在內(nèi)存中是臟頁(yè)(dirty page)沒(méi)有被寫(xiě)回到磁盤(pán)的?

mmap方式打開(kāi)的數(shù)據(jù)文件當(dāng)前有多少頁(yè)面已經(jīng)在內(nèi)存中,有多少頁(yè)面還在磁盤(pán)中沒(méi)有加載到page cahe中?

等等

以上這些問(wèn)題都無(wú)法通過(guò)top命令給出答案,但是有時(shí)候這些問(wèn)題正是我們?cè)趯?duì)程序進(jìn)行性能瓶頸分析和優(yōu)化時(shí)所需要回答的問(wèn)題。所幸的是,世界上解決問(wèn)題的方法總比問(wèn)題本身要多得多。linux通過(guò)proc文件系統(tǒng)為每個(gè)進(jìn)程都提供了一個(gè)smaps文件,通過(guò)分析該文件我們就可以一一回答以上提出的問(wèn)題。

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

接下來(lái)8個(gè)字段的含義分別如下:

? Size:表示該映射區(qū)域在虛擬內(nèi)存空間中的大小。

?Rss:表示該映射區(qū)域當(dāng)前在物理內(nèi)存中占用了多少空間

?Shared_Clean:和其他進(jìn)程共享的未被改寫(xiě)的page的大小

?Shared_Dirty:和其他進(jìn)程共享的被改寫(xiě)的page的大小

?Private_Clean:未被改寫(xiě)的私有頁(yè)面的大小。

?Private_Dirty:已被改寫(xiě)的私有頁(yè)面的大小。

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

?Pss:該虛擬內(nèi)存區(qū)域平攤計(jì)算后使用的物理內(nèi)存大小(有些內(nèi)存會(huì)和其他進(jìn)程共享,例如mmap進(jìn)來(lái)的)。比如該區(qū)域所映射的物理內(nèi)存部分同時(shí)也被另一個(gè)進(jìn)程映射了,且該部分物理內(nèi)存的大小為1000KB,那么該進(jìn)程分?jǐn)偲渲幸话氲膬?nèi)存,即Pss=500KB。

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

smaps文件中的一條記錄

有了smap如此詳細(xì)關(guān)于虛擬內(nèi)存空間到物理內(nèi)存空間的映射信息,相信大家已經(jīng)能夠通過(guò)分析該文件回答上面提出的4個(gè)問(wèn)題。

04最后希望大家能夠通過(guò)閱讀本文對(duì)進(jìn)程的虛擬內(nèi)存和物理內(nèi)存有一個(gè)更加清晰認(rèn)識(shí),并能更加準(zhǔn)確理解top命令關(guān)于內(nèi)存的輸出,最后可以通過(guò)smaps文件更進(jìn)一步分析進(jìn)程使用內(nèi)存的情況。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11314

    瀏覽量

    209773
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3031

    瀏覽量

    74119
  • Virt
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6938

原文標(biāo)題:理解virt、res、shr之間的關(guān)系(linux系統(tǒng)篇)

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PADS2007PCB上元件屬性的Label 項(xiàng)有5個(gè)Res.Des 和Part type

    PADS2007PCB上元件屬性的Label 項(xiàng)中有5個(gè)Res.Des 和5個(gè)Part type ,即Res.Des -1 ,Res.D
    發(fā)表于 07-12 18:15

    PCB各層的含義

    PCB有很多的層,初學(xué)者在一開(kāi)始學(xué)畫(huà)板子的時(shí)候,很容易被各種各樣的層給弄迷,所以在這里我們把所有的層以及含義作一個(gè)總結(jié),以幫助大家更好地理解PCB的設(shè)計(jì)。 英文中文定義Top Layer頂層信號(hào)層
    發(fā)表于 07-04 07:01

    SHR702P 中繼接口電路

    概述 SHR702P 是在SHR202P 基礎(chǔ)上將收發(fā)時(shí)鐘和時(shí)隙分開(kāi),其他性能指標(biāo)完全相同。 應(yīng)用專(zhuān)利技術(shù)設(shè)計(jì),先進(jìn)新穎。 采用傳統(tǒng)變壓器藕合方式,抗干擾能力
    發(fā)表于 05-06 09:44 ?16次下載

    PCBTOP PASTE和TOP SOLDER的區(qū)別_PCB層的含義詳解

    本文首先介紹了PCB的作用及特點(diǎn),其次闡述了PCBTOP PASTE和TOP SOLDER的區(qū)別,最后介紹了PCB層的含義詳解,具體的跟隨小編一起來(lái)了解一下。
    發(fā)表于 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的區(qū)別_PCB層的<b class='flag-5'>含義</b>詳解

    用30個(gè)實(shí)例探索top命令的細(xì)節(jié)

    最全Linux TOP命令使用教程!
    的頭像 發(fā)表于 05-20 10:20 ?4311次閱讀
    用30個(gè)實(shí)例探索<b class='flag-5'>top</b><b class='flag-5'>命令</b>的細(xì)節(jié)

    你會(huì)使用top命令了解 Fedora 的內(nèi)存使用情況

    如果你使用過(guò) top 命令來(lái)查看 Fedora 系統(tǒng)的內(nèi)存使用情況,你可能會(huì)驚訝,看起來(lái)消耗的數(shù)量比系統(tǒng)可用的內(nèi)存更多。
    發(fā)表于 04-22 17:49 ?1156次閱讀

    PADS的快捷命令字符和命令含義及用途的詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是PADS的快捷命令字符和命令含義及用途的詳細(xì)說(shuō)明。
    發(fā)表于 03-03 08:00 ?0次下載
    PADS的快捷<b class='flag-5'>命令</b>字符和<b class='flag-5'>命令</b><b class='flag-5'>含義</b>及用途的詳細(xì)說(shuō)明

    在Linux系統(tǒng)下使用top命令查看CPU使用情況

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

    linux的top命令詳解

    top命令是UNIX/Linux系統(tǒng),用于查看系統(tǒng)詳情的第一入口,一般我們查看機(jī)器運(yùn)行狀態(tài)的時(shí)候,總是第一個(gè)使用top命令,而實(shí)際上
    發(fā)表于 07-13 11:24 ?3544次閱讀
    linux的<b class='flag-5'>top</b><b class='flag-5'>命令</b>詳解

    top命令CPU使用率的意義

    平常我們使用 top 命令來(lái)查看系統(tǒng)的性能情況,在 top 命令可以看到很多不同類(lèi)型的 CPU 使用率,如下圖紅框中標(biāo)出部分: 下面,我們
    的頭像 發(fā)表于 09-01 14:41 ?4644次閱讀

    分享一篇關(guān)于講解top命令的硬核干貨

    Linuxtop命令顯示系統(tǒng)上正在運(yùn)行的進(jìn)程。它是系統(tǒng)管理員最重要的工具之一。被廣泛用于監(jiān)視服務(wù)器的負(fù)載。
    的頭像 發(fā)表于 09-13 09:52 ?734次閱讀

    一文講解Linuxtop命令

    今天浩道跟大家分享一篇關(guān)于講解top命令的硬核干貨,個(gè)人覺(jué)得本文羅列的實(shí)例比我平時(shí)關(guān)注的要詳細(xì)得多,所以分享給大家學(xué)習(xí)!
    的頭像 發(fā)表于 01-30 17:30 ?5144次閱讀

    shell命令提示符的具體含義

    Shell命令提示符的含義因操作系統(tǒng)和Shell類(lèi)型而異。在Linux系統(tǒng),Shell命令提示符通常由以下幾部分組成: 用戶(hù)名:顯示當(dāng)前登錄用戶(hù)的用戶(hù)名。 主機(jī)名:顯示當(dāng)前系統(tǒng)的主機(jī)
    的頭像 發(fā)表于 11-08 10:37 ?1528次閱讀

    linuxtop命令詳解

    Linux系統(tǒng)top命令是一個(gè)非常強(qiáng)大和常用的命令,用于實(shí)時(shí)監(jiān)控和管理系統(tǒng)的運(yùn)行狀態(tài)。它能夠顯示系統(tǒng)的整體性能數(shù)據(jù),以及各個(gè)進(jìn)程的資源占用情況。在本文中,我們將詳細(xì)解釋
    的頭像 發(fā)表于 11-17 10:25 ?2119次閱讀

    top命令如何進(jìn)入選項(xiàng)

    top命令是一個(gè)常用的Linux系統(tǒng)性能監(jiān)控工具,可以實(shí)時(shí)地監(jiān)視系統(tǒng)的整體運(yùn)行情況。通過(guò)使用top命令,我們可以查看系統(tǒng)的負(fù)載情況、進(jìn)程的CPU和內(nèi)存使用情況等。想要進(jìn)入
    的頭像 發(fā)表于 11-17 10:27 ?1477次閱讀