我应该使用什么数据类型来解析/ proc / [pid] / smaps中的大小?

时间:2018-05-25 05:10:02

标签: c linux

它们总是4kB的时间吗? 在粉碎中总结所有Sizes有多大?

2 个答案:

答案 0 :(得分:1)

粒度存在内存页面大小。它可能是4096或8192字节(甚至是其他东西,不确定)。通常,您可以使用sysconf(_SC_PAGESIZE)确定它,或者使用预定义的PAGE_SIZE宏(如果可用)。

所有Size条目总和的上限是整个虚拟地址空间大小,即32位系统的2^32字节和64位的2^64字节。 当然,真实情况总是在这个限制之下,至少因为内核占据了地址空间的某些部分而且没有在/proc/<pid>/smaps中报告。

答案 1 :(得分:1)

smaps 包含进程使用的内存页面,如 proc 手册页中所述:

man 5 proc

因此Rss块的总大小不大于主机的RAM。 虚拟内存的总大小受CPU数据总线大小的限制。但是在64位CPU上并没有使用所有64行,因此可以从 cpuinfo 获得可寻址空间的实际大小:

cat /proc/cpuinfo | grep 'address'

输出类似

的内容
address sizes   : 39 bits physical, 48 bits virtual

其中&#39;物理&#39;是支持的物理RAM大小和虚拟&#39;是用于寻址虚拟内存的最大位。因此,2 ^ 48是CPU的最大可寻址空间,也是任何进程的最大虚拟内存总和。

大小是RAM页面大小的倍数。

可以使用

检查RAM页面大小
getconf PAGESIZE

通常是4096。