(linux) อาร์เรย์โครงสร้างที่ไม่ใช่ไดนามิกใช้หน่วยความจำ Rss เมื่อใช้ memset ทำไม

นี่คือรหัสของฉัน

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.cat

...
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' แต่ฉันต้องการการเริ่มต้นที่ชัดเจน

ช่วยฉันด้วย ขอบคุณ


person Jaeyeon Baek    schedule 18.11.2015    source แหล่งที่มา


คำตอบ (1)


หากไม่มี memset คุณจะไม่มีทางใช้หน่วยความจำที่อ้างอิงโดย "โอ๊ะโอ" เคอร์เนล linux จะไม่สำรองหน้าหน่วยความจำสำหรับคุณจนกว่าคุณจะเข้าถึงหน่วยความจำในครั้งแรก

Size คือขนาดหน่วยความจำ "ที่สามารถเข้าถึงได้" ทั้งหมดสำหรับโปรแกรมของคุณ RSS คือหน่วยความจำในโปรแกรมของคุณที่มีอยู่จริง (ไม่ได้หมายความว่าผลรวมของ RSS ทั้งหมดคือหน่วยความจำทั้งหมดที่ใช้ RSS ก็นับหน่วยความจำที่แชร์ด้วย)

memset จะสัมผัสทุกไบต์ในอาเรย์ของคุณ ซึ่งบังคับให้เคอร์เนลจองหน่วยความจำสำหรับคุณและใส่ไว้ในส่วน RSS

memset ไม่จองหน่วยความจำเพิ่ม มันเพิ่งใช้ครั้งแรก

ข้อมูลเพิ่มเติม: การรับข้อมูลเกี่ยวกับกระบวนการ ' การใช้หน่วยความจำจาก /proc/pid/smaps

person mknjc    schedule 18.11.2015
comment
ฉันสามารถทำได้โดยไม่ต้องเข้าถึง memset อ๊ะ เช่น) oops[0][1][2][5].test = 1; มันประสบความสำเร็จ... (แล้ว smaps ก็ไม่มี memset เหมือนกัน) สิ่งที่แตกต่างกันที่ใส่ไว้ในส่วน RSS หรือไม่ใส่ - person Jaeyeon Baek; 18.11.2015