1. 程式人生 > >[譯]指定程序更新/proc/pid/smaps中PSS值得頻率是多久?

[譯]指定程序更新/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“總是最新的”。