したがって、n個のプロセスがサイズMのライブラリLを共有する場合、そのPSSへの寄与はM / nです。
それでは、プロセスの1つが終了すると想像してみてください。したがって、寄与度はM/(n-1)になります。
Q1:私の質問は、この変更はまだ実行されており、共有ライブラリを使用しているプロセスのPSS値にどのくらい速く反映されていますか?
Q2:簡単な例として、2つのプロセスのみが100Kサイズの共有ライブラリLを使用しているとします。プロセスあたりのPSS寄与は50Kです。今、P2が死んだ場合、Lを使用する唯一のプロセスです。したがって、PSSは増加して100Kになるはずです。これはどのくらいの頻度で発生しますか? P2が死んだ直後に発生しますか、それともしばらくすると発生しますか?どのくらいの時間が経過しましたか?
答え1
変更はすぐに反映されます。途中でキャッシュはありません。を読むと、/proc/<pid>/smaps
実際にプロセスのページテーブルに移動します。マッピングに関する情報は、途中で蓄積された後にキャッシュなしで表示されます。
ファイルの後ろのコードは特に/proc/<pid>/smaps
ありますfs/proc/task_mmu.c
。show_smap
機能。
この関数はwalk_page_range
次のことを行います。smaps_pte_range
PTEコールバックで。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);
}
Shared
(ページが実際に複数回マッピングされている場合は、そのセクションでのみ計算できることをここで見ることができます。そうしないと、プライベートと見なされます。)
page_mapcount
インラインで定義され、linux/mm.h
簡単にアクセスされますstruct page
。
static inline int page_mapcount(struct page *page)
{
return atomic_read(&(page)->_mapcount) + 1;
}
したがって、PSSは「常に最新の状態」です。