Linux 提交的_AS和VSZ列之和(以ps为单位)之间的差异

Linux 提交的_AS和VSZ列之和(以ps为单位)之间的差异,linux,memory-management,Linux,Memory Management,我在我的系统上运行以下两个命令,并得出不同的数字: [root@rhel6 ~] grep Committed_AS /proc/meminfo Committed_AS: 82964 kB [root@rhel6 ~]# ps aux | awk '{vsz+=$5}END{print vsz}' 1580824 我的理解是,Committed_AS是系统上当前分配的虚拟内存量。在第二个命令中,我对“ps aux”输出的VSZ列(以kB报告的已分配虚拟内存)求和 为什么这些数字不

我在我的系统上运行以下两个命令,并得出不同的数字:

[root@rhel6 ~] grep Committed_AS /proc/meminfo
Committed_AS:      82964 kB

[root@rhel6 ~]# ps aux | awk '{vsz+=$5}END{print vsz}'
1580824
我的理解是,Committed_AS是系统上当前分配的虚拟内存量。在第二个命令中,我对“ps aux”输出的VSZ列(以kB报告的已分配虚拟内存)求和

为什么这些数字不一样?它们很不一样,所以我显然不理解其中的一些东西


有什么帮助吗?

这些数字如此不同的一个原因是进程可以将虚拟地址范围保留为不可访问,以防止将来的调用(如mmap())意外使用它们。这种不可访问的范围包括在VSS中,但不包括在提交的\u AS中

以下是使用此类不可访问范围的两个示例:

1) 如果在多线程进程中使用libcmalloc,它通常会创建多个“竞技场”,以帮助减少同时执行malloc的线程之间的锁争用。对于第一个竞技场(称为主竞技场)以外的每个竞技场,内存都保留在固定大小的堆中。在64位的情况下,这些堆每个都是64兆字节,但是当最初创建堆时,只有开始部分才被授予RW访问权限。堆的尾部变得不可访问,随着堆的增长,进程逐渐扩展可读写部分,收缩不可访问部分

2) 加载共享库时,在最近的64位Linux进程中,某些部分的对齐约束高达2MB。通常,这在每个共享库所使用的地址范围中间留下一个不可访问的区域,并且这些区域通常大小为2MB或2MB-4K。