根据打印:
/proc/2723/statm,4269829,
4206482,3793083,3565,0,458960,0!
这个红字表示的意思是,准备执行fork前,线程已占用的物理内存大小,即rss,为
4206482个页,约16G。
下面来估算一下进程fork的时候,可能消耗的最大内存。
由于x86_64是4级页表,因此任何进程页表最大可能占用内存的是:
pgd :4k
pud: 4k ×512
pmd: 4k × 512 × 512
pte: 4K × 512 × 512×512
----------------------------------------------
因为执行到fork前,进程的物理页有4206482个,小于 512 × 512×512,
因此最多占用pte表的个数为4206482。
同理,最多占用pmd表的个数为 512×512 , 最多占用pud表的个数为512,最多占用pgd的个数是1.
因此最坏情况下,进程占用页表的上限为(4206482+512×512+512+1)×4k
但实际情况下,基本不可能运气这么背,耗了这么多内存。
其实还有的信息可以参考,通过/proc/meminfo可以知道,当前系统的总共页表PTE的个数N。
这个页表数指的是pte一级的个数,因此在四级分页下,可能的最大页表消耗内存为N × min(N ,512×512) × min(N, 512) × PAGE_SIZE