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".