系统相关
首页 > 系统相关> > linux – 在/ proc / pid / smaps中为给定进程更新PSS值的频率

linux – 在/ proc / pid / smaps中为给定进程更新PSS值的频率

作者:互联网

因此,如果n个进程共享大小为M的库L,则对其PSS的贡献是M / n.

现在假设其中一个进程终止.因此贡献将是M /(n-1).

问题1:我的问题是这个变化多久反映在仍在运行和使用共享库的进程的PSS值中?

Q2:作为一个简单的例子,假设只有两个进程正在使用大小为100K的共享库. PSS对每个过程的贡献是50K.现在当P2死亡时,它是唯一使用L的过程.因此它的PSS应该增加并变为100K.一旦P2死亡或一段时间后,这会发生多久?经过多少时间?

解决方法:

这一变化立即得到反映.沿途没有缓存.当您读取/ proc /< pid> / smaps时,实际上会触发该进程的页表的遍历.有关映射的信息会在此过程中累积,然后显示,而不进行任何缓存.

/ proc /< pid> / smaps文件后面的代码在fs / proc / task_mmu.c中,特别是show_smap函数.
该函数使用smaps_pte_range作为PTE回调执行walk_page_range. smaps_pte_range本身在struct mem_size_stats中累积信息.

负责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_mapcount在linux / mm.h中内联定义,只需访问结构页面:

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

因此PSS“始终是最新的”.

标签:linux,memory,process,kernel,virtual-memory
来源: https://codeday.me/bug/20190816/1666029.html