A alteração é refletida imediatamente. Não há cache ao longo do caminho. Quando você lê /proc/<pid>/smaps , você na verdade aciona uma passagem da tabela de páginas desse processo. Informações sobre os mapeamentos são acumuladas ao longo do caminho e exibidas, sem nenhum armazenamento em cache.
O código por trás do arquivo /proc/<pid>/smaps está em fs/proc/task_mmu.c , especificamente o show_smap função.
Essa função faz um walk_page_range com smaps_pte_range como o retorno de chamada de PTE. smaps_pte_range acumula as informações em struct mem_size_stats .
A parte desse código responsável por PSS faz:
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);
}
(Você pode ver aqui que as páginas só podem ser contabilizadas na Shared parte se for realmente mapeada mais de uma vez - é contabilizada como particular caso contrário.)
page_mapcount é definido in-line em linux/mm.h e simplesmente acessa um struct page :
static inline int page_mapcount(struct page *page)
{
return atomic_read(&(page)->_mapcount) + 1;
}
Portanto, o Atendimento Microsoft está "sempre atualizado".