top使用參數詳解

linux下的top命令參數說明 (virt,res,shr,data 的意義)

%mem 內存使用率
virt 是虛擬內存
res是常駐內存
shr是共享內存

top命令下按f鍵可以看到詳細說明
* A: PID        = Process Id
* E: USER       = User Name
* H: PR         = Priority
* I: NI         = Nice value
* O: VIRT       = Virtual Image (kb)
* Q: RES        = Resident size (kb)
* T: SHR        = Shared Mem size (kb)
* W: S          = Process Status
* K: %CPU       = CPU usage
* N: %MEM       = Memory usage (RES)
* M: TIME+      = CPU Time, hundredths
b: PPID       = Parent Process Pid
c: RUSER      = Real user name
d: UID        = User Id
f: GROUP      = Group Name
g: TTY        = Controlling Tty
j: P          = Last used cpu (SMP)
p: SWAP       = Swapped size (kb)
l: TIME       = CPU Time
r: CODE       = Code size (kb)
s: DATA       = Data+Stack size (kb)
u: nFLT       = Page Fault count
v: nDRT       = Dirty Pages count
y: WCHAN      = Sleeping in Function
z: Flags      = Task Flags <sched.h>
* X: COMMAND    = Command name/line

top命令下要查看某個用戶啓動的進程:先輸入u,然後輸入用戶名,再回車

VIRT:virtual memory usage。Virtual這個詞很神,一般解釋是:virtual adj.虛的, 實質的, [物]有效的, 事實上的。到底是虛的還是實的?讓Google給Define之後,將就明白一點,就是這東西還是非物質的,但是有效果的,不發生在真實世界的,發生在軟件世界的等等。這個內存使用就是一個應用佔有的地址空間,只是要應用程序要求的,就全算在這裏,而不管它真的用了沒有。寫程序怕出錯,又不在乎佔用的時候,多開點內存也是很正常的。
RES:resident memory usage。常駐內存。這個值就是該應用程序真的使用的內存,但還有兩個小問題,一是有些東西可能放在交換盤上了(SWAP),二是有些內存可能是共享的。
SHR:shared memory。共享內存。就是說這一塊內存空間有可能也被其他應用程序使用着;而Virt - Shr似乎就是這個程序所要求的並且沒有共享的內存空間。
DATA:數據佔用的內存。如果top沒有顯示,按f鍵可以顯示出來。這一塊是真正的該程序要求的數據空間,是真正在運行中要使用的。

============================================

sleep是讓線程去睡覺,它釋放資源,讓CPU切換到別的線程的執行,會消耗切換時間。

      感覺還是wait*系列函數更好一些
       因爲可以在完成相同功能的情況佔用更少的CPU資源,實時性要好一些。
      比如串口通訊的握手過程,使用Wait*系列函數,可以發送完畢後設置超值爲30秒,當是當有數據到達時以立即停止等待,處理數據。
      如果使用Sleep只能有兩種方法,循環執行多個短時間的Sleep,或者Sleep(30000)。如果前一種情況因爲在循環,所以會佔用CPU資源。如果有後一種方法,當數據在30內到達時將會反應遲鈍。

=============================================

        linux中利用pthread庫做多線程編程,如果使用簡單的sleep系統調用,如果對pthread的實現不是很清楚的話,或者linux內核的sleep系統調用和pthread庫配合的不是很好的話,在線程裏面進行sleep系統調用的話,可能導致所有的線程休眠。或者在main函數裏面調用sleep,在特定版本的linux內核中可能導致程序所有線程都休眠。這可能是不希望的,所以可以用異步IO實現“安全”的線程休眠。具體用select實現即可:

top裏面描述進程內存使用量的數據來源於/proc/$pid/statm這個文件。通過觀察kernel的代碼就能弄清楚SHR,VIRT和RES這些數值的具體含義。

Linux通過一個叫做 task_statm 的函數來返回進程的內存使用狀況

int task_statm(struct mm_struct *mm, int *shared, int *text,
               int *data, int *resident)
{
        *shared = get_mm_counter(mm, file_rss);
        *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
                                                           >> PAGE_SHIFT;
        *data = mm->total_vm - mm->shared_vm;
        *resident = *shared + get_mm_counter(mm, anon_rss);
        return mm->total_vm;
}
上面的代碼中shared就是page cache裏面實際使用了的物理內存的頁數,text是代碼所佔用的頁
數,data是總虛擬內存頁數減去共享的虛擬內存頁數,resident是所有在使用的物理內存的頁
數。最後返回的mm->total_vm是進程虛擬內存的尋址空間大小。

函數get_mm_counter並不會做什麼計算,它的功能是保證數值讀取的原子性。

上面的數值最後會通過 procfs輸出 到/proc/$pid/statm中去。他們與top顯示的數值對應關係如下。

SHR: shared
RES: resident
VIRT: mm->total_vm
CODE: code
DATA: data

=======================================

o: VIRT (Virtual Image) - 進程使用的總虛擬內存 (virtual memory) 大小,包括進程的程序碼、資料和共享程序庫再加上被置換 (swap out) 的空間。VIRT = SWAP + RES
p: SWAP (Swapped size) - 進程被置換的虛擬內存空間大小。
q: RES (Resident size) - 進程非被置換的實體內存大小。RES = CODE + DATA
r: CODE' (Code size) - 進程的程序碼在實體內存佔用空間大小,亦叫作 text resident set (TRS)。
s: DATA (Data+Stack size) - 進程佔用實體內存中的非程序碼部份大小,亦叫作 data resident set (DRS)。
t: SHR (Shared Mem size) - 進程使用的共享內存大小,即可以和其他進程共享的內存空間。
n: %MEM (Memory usage) - 進程佔用實體內存大小對系統總實體內存大小的比例,以百分比顯示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章