輸出解釋
CPU 以及CPU0。。。 的每行的每個參數意思(以第一行為例)為:
參數 解釋 /proc//status
Size (total pages) 任務虛擬地址空間的大小 VmSize/4
Resident(pages) 應用程序正在使用的物理內存的大小 VmRSS/4
Shared(pages) 共享頁數 0
Trs(pages) 程序所擁有的可執行虛擬內存的大小 VmExe/4
Lrs(pages) 被映像到任務的虛擬內存空間的庫的大小 VmLib/4
Drs(pages) 程序數據段和用戶態的棧的大小 (VmData+ VmStk )4
dt(pages) 髒頁數量
通過內核代碼,我們可以更加清楚的了解其含義:
顯示該信息主要是通過 proc_pid_statm 該函數來實現的。如果對proc的機制不了解,請參考《Linux設備驅動程序》。
其調用過程:proc_pid_statm->statm_pmd_range->statm_pte_range。目的是從地址區間逐漸轉化成具體的每個頁表。閱讀代碼,只需了解一個大概,不用了解很多細節,要比寫起來輕松許多。
其中totals,pages,shared,dirty的是通過虛擬地址的頁表來進行判斷。
do { pte_t page = *pte; strUCt page *ptpage; address += PAGE_SIZE; pte++; if (pte_none(page)) continue; ++*total; //是合法的頁都計算在內。 if (!pte_present(page)) continue; ptpage = pte_page(page); if ((!VALID_PAGE(ptpage)) PageReserved(ptpage)) continue; ++*pages; //只有頁表中含有present標記的,計算在內。 if (pte_dirty(page)) ++*dirty; //頁表中dirty標記,計算在內。 if (page_count(pte_page(page)) > 1) ++*shared; //頁表的所有者超過1的,就認為共享。 } while (address < end); trs、drs、lrs是通過線性地址區間來進行區分的。 int proc_pid_statm(struct task_struct *task, char * buffer) 。。。。。 while (vma) { 。。。。。。。。。。。 if (vma->vm_flags & VM_EXECUTABLE) //該線性區間的flags標志為可執行。 trs += pages; /* text */ else if (vma->vm_flags & VM_GROWSDOWN) //該線性區間的flags標志為向下增長。 drs += pages; /* stack */ else if (vma->vm_end > 0x60000000) //結尾線性地址大於0x60000000。 lrs += pages; /* library */ else //這塊區間應該是數據區與堆。 drs += pages; vma = vma->vm_next; } pages=trs+drs+lrs
因此說,trs drs lrs 與totals,pages,shared,dirty兩組,分別從兩個角度觀察內存。
(T002)