linux – 在/ proc / pid / smaps中为给定进程更新PSS值的频率
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 在/ proc / pid / smaps中为给定进程更新PSS值的频率,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1412字,纯文字阅读大概需要3分钟。
内容图文
![linux – 在/ proc / pid / smaps中为给定进程更新PSS值的频率](/upload/InfoBanner/zyjiaocheng/957/542a8d705e054428918b3bc53ea26f61.jpg)
因此,如果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 – 在/ proc / pid / smaps中为给定进程更新PSS值的频率全部内容,希望文章能够帮你解决linux – 在/ proc / pid / smaps中为给定进程更新PSS值的频率所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。