【问题标题】:(linux) non-dynamic struct array use Rss memory when memset use; why?(linux) 非动态struct数组在memset使用时使用Rss内存;为什么?
【发布时间】:2016-02-19 18:02:59
【问题描述】:

这是我的代码

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”,但我想显式初始化。

帮帮我,谢谢。

【问题讨论】:

    标签: linux memory-management


    【解决方案1】:

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

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

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

    memset 不会保留更多内存,它只是第一次使用它。

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

    【讨论】:

    • 我可以在没有 memset 的情况下访问“oops”,例如)oops[0][1][2][5].test = 1; 成功了...(然后 smaps 与 memset 相同)将其放入 RSS 部分有什么不同,或者不放入跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多