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

问题:
如果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“总是最新的”。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值