(linux)非动态struct数组在memset使用时使用Rss内存;为什么?

时间:2015-11-18 05:47:00

标签: linux memory-management

这是我的代码

struct test oops[4][2][3][40960];  // global struct (maybe .data section)
...
{
...
//memset(oops, 0, sizeof(struct test) * 40960 * 3 * 2 * 4);
...
}

有疑问。

当我使用memset时,

cat / proc / PID / smaps

...
Size:             756480 kB
Rss:              721208 kB
Pss:              721208 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:    721208 kB
Referenced:       361252 kB
Anonymous:        721208 kB
AnonHugePages:      6144 kB
Swap:              35272 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
...

但是,不要使用memset

Size:             756480 kB
Rss:                2048 kB
Pss:                2048 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      2048 kB
Referenced:         2048 kB
Anonymous:          2048 kB
AnonHugePages:      2048 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

为什么memset使用RSS?

什么是Pss,Private_dirty,Referenced,Anonymous?

全局结构可能已设置' 0',但我想显式初始化。

帮助我,谢谢。

1 个答案:

答案 0 :(得分:0)

如果没有memset,你永远不会使用“oops”引用的内存。 在您第一次访问内存之前,linux内核不会为您保留内存页。

大小是程序的整个“可访问”内存大小。 RSS是程序中真正存在的内存(这并不意味着所有RSS的总和是使用的总内存RSS也计算共享内存)。

memset接触数组中的每个字节,这会强制内核为您保留内存并将其放入RSS部分。

memset不会在第一次使用它时保留更多内存。

其他信息:Getting information about a process' memory usage from /proc/pid/smaps