c - 为什么C中的全局数组(已初始化)不完全算作PSS

标签 c linux shared-memory memory-mapped-files

环境:gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 3.16.0-30-generic#40~14.04.1-Ubuntu SMP Thu Jan 15 17:45:15 UTC 2015 i686 i686 i686 GNU

C代码a2.c:有一个40MB的全局数组,每一项都赋值。

int b[10000000];//40M global array
void main() {
  int i = 0;
  for(i = 0; i<10000000; i++) {b[i]=i;}
  while(1);
}

然后我构建成 gcc -o a2 a2.c

当我运行这段代码,看到smap文件cat/proc/25739/smaps,内容如下

08048000-08049000 r-xp 00000000 08:11 46930087   /home/jzd/test/a2
Size:                  4 kB
Rss:                   4 kB
Pss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         4 kB
Private_Dirty:         0 kB
Referenced:            4 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd ex mr mw me dw
//here I hide some sections 
0804b000-0a670000 rw-p 00000000 00:00 0
Size:              39060 kB
Rss:               39060 kB // the RSS is the global array's size
Pss:                2196 kB // the array is only used by the program
                            // why it's pss is not equal with rss
Shared_Clean:          0 kB // all shared size is 0
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:     39060 kB
Referenced:        39060 kB
Anonymous:         39060 kB
AnonHugePages:     36864 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
//here I hide other sections

为什么会这样?

最佳答案

您启用了对透明大页面 (THP) 的支持,并且您的可执行文件的 BSS 由大页面支持:

0804b000-0a670000 rw-p 00000000 00:00 0
Size:              39060 kB
Rss:               39060 kB
Pss:                2196 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:     39060 kB
Referenced:        39060 kB
Anonymous:         39060 kB
AnonHugePages:     36864 kB <------
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac

如果仔细观察,报告的 Pss 值 2196 KiB 恰好是常规 4 KiB 页面支持的匿名内存映射量,即 AnonymousAnonHugePages

我的猜测是 PSS 中 THP 的计算在 3.16.0-30-generic 中被破坏了。在你的内核版本和@Evan 的内核版本之间,有几个提交影响了生成 smaps 文件内容的 Linux 内核部分(fs/proc/task_mmu.c),更具体地说,这个变化 between 3.18 and 3.19可能是固定的东西。

关于c - 为什么C中的全局数组(已初始化)不完全算作PSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33665108/

相关文章:

c++ - 共享内存中彼得森锁的问题

c - 在 C 中将 argv[1] 存储为 char 或 int

c - 打印数组元素给出错误的输出

c - 在 C 程序中轮询其他线程写入的变量是否安全?

android - 如何在没有用户交互的情况下创建 AVD?

windows - 当不区分大小写的客户端联系和网络服务器时会发生什么?

c - 获取c和windows中进程组的用户时间

c - 宏名称的有效字符是什么?

c++ - Qt:文件名中的非 ASCII 字符被替换为 '?'

c# - 从另一个进程访问对象