比方说,我在64位Linux机器上运行我的程序与RAM 64 GB。在我很小的C程序后立即启动怎么办
void *p = sbrk(1024ull * 1024 * 1024 * 120);
这个移动我的数据段由120千兆突破前进。
经过我的过程中,上述sbrk
呼叫top
条目显示RES
在一些低价值,VIRT
在120g
,并在SWAP
120g
。
此操作之后,我写的东西到第90千兆上述范围的
memset(p, 0xAB, 1024ull * 1024 * 1024 * 90);
这导致了我的过程中top
进入一些变化:VIRT
果然保持在120g
,RES
变得几乎64g
,SWAP
下降到周围56g
。
在Swap
输出节目标题中的常见top
的统计信息交换文件的使用增加,这是意料之中的,因为我的程序将不得不推约26 GB的内存页到交换文件。
因此,根据上述观察,SWAP
列只是报告我进程的非RES
地址空间,无论此地址空间是否已经被“物化”,即不管是否我已经写的东西到虚拟内存的那个区域。
但有什么办法弄清楚怎么说SWAP
大小的多少实际上已被“物化”,并存储在交换文件的东西备份?即有没有什么办法让top
以显示我的过程,26千兆价值?
行为取决于版本你正在使用中的procps。例如,在版本3.0.5 SWAP值等于:
task->size - task->resident
而正是你所遇到什么。男人TOP.1说:
VIRT = SWAP + RES
procps的-NG,但是,读/ proc /进程/状态,并设置正确SWAP
https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.c#L383
所以,你可以更新或procps的在/ proc /进程/状态直视