2015-11-12 23 views
2

envirenment: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中並沒有完全算作PSS

C code 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 

爲什麼會發生呢?

+1

你究竟想做什麼? – Irshad

+0

嗨Irshad,我偶然發現了奇怪的事情,想知道原因。 – ddnionio

回答

0

我不知道爲什麼你看到的是,我跑你的測試程序,並得到不同的結果,符合你期待什麼:

00602000-02c27000 rw-p 00000000 00:00 0 
Size:    39060 kB 
Rss:    39060 kB 
Pss:    39060 kB 
Shared_Clean:   0 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:  39060 kB 
Referenced:  38824 kB 
Anonymous:   39060 kB 
AnonHugePages:  8192 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 
Locked:    0 kB 

我的內核版本是3.19.0-30-generiC#34-Ubuntu SMP。你確定你正在運行該程序完全按照你發佈的程序嗎?內核內存報告也有可能在某些時候發生變化,或者這種行爲取決於內核如何構建。

+0

我很困惑。我只能在我的主機中重現問題。我對另一位主持人的測試,以及我的同事的測試都符合你的要求。好奇發生了什麼事。 – ddnionio

1

您有啓用透明大頁面(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 

如果你仔細觀察,2196昆明植物研究所的報告Pss值精確的量匿名內存映射由常規4 KiB頁面支持,即AnonymousAnonHugePages之間的差異。

我的猜測是PSS中THP的計算在3.16.0-30-generic中被破壞了。在您的內核版本和@Evan內核的版本之間,有幾個提交會影響生成smaps文件(fs/proc/task_mmu.c)內容的Linux內核部分,更具體地說,這個更改可能是固定的東西。

+0

所以這是我內核的bug,對吧? – ddnionio

+0

是的,這是你內核中的一個bug。 –

相關問題