通过Linux内核观察_proc_pid_statm

文章作者 100test 发表时间 2007:04:06 21:44:47
来源 100Test.Com百考试题网


输出解释

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)



相关文章


Linux操作系统静态路由设置技巧介绍
在Linux系统下面架设Sendmail服务器
通过Linux内核观察_proc_pid_statm
使用Linux操作系统命令来发送信息
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛