linux VIRT,RES,SHR,DATA 含義

linux top命令VIRT,RES,SHR,DATA的含義linux

VIRT:virtual memory usage 虛擬內存
一、進程「須要的」虛擬內存大小,包括進程使用的庫、代碼、數據等
二、假如進程申請100m的內存,但實際只使用了10m,那麼它會增加100m,而不是實際的使用量ios

RES:resident memory usage 常駐內存
一、進程當前使用的內存大小,但不包括swap out
二、包含其餘進程的共享
三、若是申請100m的內存,實際使用10m,它只增加10m,與VIRT相反
四、關於庫佔用內存的狀況,它只統計加載的庫文件所佔內存大小服務器

SHR:shared memory 共享內存
一、除了自身進程的共享內存,也包括其餘進程的共享內存
二、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
三、計算某個進程所佔的物理內存大小公式:RES – SHR
四、swap out後,它將會降下來ide

DATA
一、數據佔用的內存。若是top沒有顯示,按f鍵能夠顯示出來。
二、真正的該程序要求的數據空間,是真正在運行中要使用的。函數

top 運行中能夠經過 top 的內部命令對進程的顯示方式進行控制。內部命令以下:
s – 改變畫面更新頻率
l – 關閉或開啓第一部分第一行 top 信息的表示
t – 關閉或開啓第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 關閉或開啓第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的順序排列表示進程列表
P – 以 CPU 佔用率大小的順序排列進程列表
M – 之內存佔用率大小的順序排列進程列表
h – 顯示幫助
n – 設置在進程列表所顯示進程的數量
q – 退出 top
s – 改變畫面更新週期測試

序號 列名 含義
a PID 進程id
b PPID 父進程id
c RUSER Real user name
d UID 進程全部者的用戶id
e USER 進程全部者的用戶名
f GROUP 進程全部者的組名
g TTY 啓動進程的終端名。不是從終端啓動的進程則顯示爲 ?
h PR 優先級
i NI nice值。負值表示高優先級,正值表示低優先級
j P 最後使用的CPU,僅在多CPU環境下有意義
k %CPU 上次更新到如今的CPU時間佔用百分比
l TIME 進程使用的CPU時間總計,單位秒
m TIME+ 進程使用的CPU時間總計,單位1/100秒
n %MEM 進程使用的物理內存百分比
o VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
p SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。
q RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
r CODE 可執行代碼佔用的物理內存大小,單位kb
s DATA 可執行代碼之外的部分(數據段+棧)佔用的物理內存大小,單位kb
t SHR 共享內存大小,單位kb
u nFLT 頁面錯誤次數
v nDRT 最後一次寫入到如今,被修改過的頁面數。
w S 進程狀態。(D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/中止,Z=殭屍進程)
x COMMAND 命令名/命令行
y WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名
z Flags 任務標誌,參考 sched.hspa

默認狀況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。能夠經過下面的快捷鍵來更改顯示內容。.net

經過 f 鍵能夠選擇顯示的內容。按 f 鍵以後會顯示列的列表,按 a-z 便可顯示或隱藏對應的列,最後按回車鍵肯定。
按 o 鍵能夠改變列的顯示順序。按小寫的 a-z 能夠將相應的列向右移動,而大寫的 A-Z 能夠將相應的列向左移動。最後按回車鍵肯定。
按大寫的 F 或 O 鍵,而後按 a-z 能夠將進程按照相應的列進行排序。而大寫的 R 鍵能夠將當前的排序倒轉。命令行




編寫Linux C++程序如何影響VIRT(虛存)和RES(實存/常駐內存)orm

在Linux命令行中執行top命令,能夠查詢到全部進程使用的VIRT虛擬內存、RES常駐內存和共享內存SHR。

那麼,什麼是VIRT虛擬內存、RES常駐內存和共享內存SHR?咱們編寫的Linux C++程序如何影響它們呢?

查閱資料後,概括一下。


VIRT:

一、進程「須要的」虛擬內存大小,包括進程使用的庫、代碼、數據,以及malloc、new分配的堆空間和分配的棧空間等;

二、假如進程新申請10MB的內存,但實際只使用了1MB,那麼它會增加10MB,而不是實際的1MB使用量。

三、VIRT = SWAP + RES

RES:

一、進程當前使用的內存大小,包括使用中的malloc、new分配的堆空間和分配的棧空間,但不包括swap out量;

二、包含其餘進程的共享;

三、若是申請10MB的內存,實際使用1MB,它只增加1MB,與VIRT相反;

四、關於庫佔用內存的狀況,它只統計加載的庫文件所佔內存大小。

五、RES = CODE + DATA

SHR:

一、除了自身進程的共享內存,也包括其餘進程的共享內存;

二、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小;

三、計算某個進程所佔的物理內存大小公式:RES – SHR;

四、swap out後,它將會降下來。

測試以下:

一)

[cpp] view plaincopy

  1. #include <iostream>  

  2.   

  3. int main()  

  4. {  

  5.     char * p = new char [1024*1024*512];  

  6.     getchar();  

  7.     return 0;  

  8. }  


top結果以下:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

401 huyiyang  17   0  523m  916  792 S  0.0  0.0   0:00.00 ./main


VIRT包含了new出來的512MB空間,可是RES不包含該空間。即剛new出來的空間,若是沒有使用,會放入SWAP中,並不在內容中真實的分配物理內存。

二)

[cpp] view plaincopy

  1. #include <iostream>  

  2.   

  3. int main()  

  4. {  

  5.     char * p = new char [1024*1024*512];  

  6.     memset(p, 0, 1024*1024*512);  

  7.     getchar();  

  8.     return 0;  

  9. }  


top結果以下:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                              

32604 huyiyang  17   0  523m 512m  792 S  0.0 26.2   0:00.33 ./main


VIRT包含new出來的512MB空間,RES包含目前使用的memset的512M空間。即new出來的空間被使用後,會真實分配物理內存。

三)

[cpp] view plaincopy

  1. #include <iostream>  

  2.   

  3. int main()  

  4. {  

  5.     char * p = new char [1024*1024*512];  

  6.     memset(p + 1024*1024*128, 0, 1024*1024*128);  

  7.     getchar();  

  8.     return 0;  

  9. }  


top結果以下:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
456 huyiyang  17   0  523m 128m  792 S  0.0  6.6   0:00.07 ./main


VIRT包含new出來的512MB空間,RES包含目前使用的memset的128M空間。即new出來的空間,若是隻使用部分,則只分配部分物理內存。

四)

[cpp] view plaincopy

  1. #include <iostream>  

  2.   

  3. int main()  

  4. {  

  5.     char p[1024*1024*10];  

  6.     getchar();  

  7.     return 0;  

  8. }  


top結果以下:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

544 huyiyang  17   0 21568  884  760 S  0.0  0.0   0:00.00 ./main


沒有使用的棧空間,VIRT會包含(沒有使用的棧空間會在SWAP中)。

五)

[cpp] view plaincopy

  1. #include <iostream>  

  2.   

  3. int main()  

  4. {  

  5.     char p[1024*1024*10];  

  6.     memset(p, 0, 1024*1024*10);  

  7.     getchar();  

  8.     return 0;  

  9. }  


top結果以下:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

  561 huyiyang  17   0 21568  10m  760 S  0.0  0.6   0:00.00 ./main

已經使用的棧空間,VIRT和RES都會包含。

六)

[cpp] view plaincopy

  1. #include <iostream>  

  2.   

  3. int main()  

  4. {  

  5.     char ** pp = new char * [1024];  

  6.     for(int i=0;i<1024;i++)  

  7.     {  

  8.         pp[i] = new char [1024*1024*512];  

  9.         memset(pp[i], 0, 1024*1024*512);  

  10.         printf("p%d\n", i);  

  11.         getchar();  

  12.     }  

  13.     return 0;  

  14. }  

第一個循環時:

  PID USER       PR  NI  VIRT    RES   SHR S %CPU %MEM    TIME+  SWAP COMMAND

 3627 huyiyang  18   0  523m 512m  836   S       0.0        26.2    0:00.34  10m ./main

第二個循環時:

  PID USER       PR  NI  VIRT    RES   SHR S %CPU %MEM    TIME+  SWAP COMMAND

 3627 huyiyang  18   0 1035m 1.0g  836    S     0.0      52.4      0:00.69  10m     ./main

第三個循環時:

  PID   USER      PR  NI  VIRT   RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND                                                                                                         
 3627 huyiyang  18   0 1547m 1.5g    836 S     0.0       78.5   0:01.03    10m     ./main

在個人服務器上,當執行到第四個循環時,而且有其餘程序佔用較大內存的狀況下,top結果以下:

  PID USER       PR  NI  VIRT    RES   SHR S %CPU %MEM    TIME+  SWAP COMMAND 

 3427 huyiyang  16   0 2059m 711m  836 S  0.0        36.4       0:01.45 1.3g     ./main

出現了swap out的狀況。

相關文章
相關標籤/搜索