这是我的代码
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',但我想显式初始化。
帮助我,谢谢。
答案 0 :(得分:0)
如果没有memset,你永远不会使用“oops”引用的内存。 在您第一次访问内存之前,linux内核不会为您保留内存页。
大小是程序的整个“可访问”内存大小。 RSS是程序中真正存在的内存(这并不意味着所有RSS的总和是使用的总内存RSS也计算共享内存)。
memset接触数组中的每个字节,这会强制内核为您保留内存并将其放入RSS部分。
memset不会在第一次使用它时保留更多内存。
其他信息:Getting information about a process' memory usage from /proc/pid/smaps