[译]指定进程更新/proc/pid/smaps中PSS值得频率是多久?

来源:互联网 发布:骨架软件 编辑:程序博客网 时间:2024/05/19 10:52

问题:
如果n个进程共享大小为M的库L,那么它们对PSS的贡献是M/n。
现在假定一个进程终止了,那么贡献值变成M/(n-1)。

Q1:我的问题是这种变化在多久反映到仍然运行和使用共享库的进程的PSS值?
Q2:作为一个普通情况,假定只有两个进程使用大小为100
k的共享库L。每个进程的PSS贡献是50K。现在当P2死亡了,只有一个进程使用库L。这样他的PSS将会增加变成100K。多快会发生,P2死亡时,或者其他时刻?之后多久?

回答:
立刻就反映了。没有延误。当读取/proc/<pid>/smaps时,实际触发了该进程的页表遍历。关于映射的信息被计算,之后显示,没有任何延误。

/proc/<pid>/smaps文件背后的代码在fs/proc/task_mmu.c中,特指show_smap函数。
该函数做了一次walk_page_range,将smaps_pte_range作为PTE的回调。smaps_pte_range本身计算了结构mem_size_stat中的信息。
负责PSS的代码如下:

mapcount = page_mapcount(page);if (mapcount >= 2) {    if (pte_dirty(ptent) || PageDirty(page))        mss->shared_dirty += ptent_size;    else        mss->shared_clean += ptent_size;    mss->pss += (ptent_size << PSS_SHIFT) / mapcount;} else {    if (pte_dirty(ptent) || PageDirty(page))        mss->private_dirty += ptent_size;    else        mss->private_clean += ptent_size;    mss->pss += (ptent_size << PSS_SHIFT);}

(你可以看到只有页被映射了多次才被认为在共享部分-佛足额它被认为是私有的。)
page_mapcountlinux/mm.h中定义为内联的,只是简单地访问struct page:

static inline int page_mapcount(struct page *page){    return atomic_read(&(page)->_mapcount) + 1;}

那么PSS“总是最新的”。

0 0
原创粉丝点击