2015-11-12 4 views
2

environnement: gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04) 3.16.0-30-generiC# 40 ~ 14.04.1-Ubuntu SMP jeu 15 janvier 17:45:15 UTC 2015 i686 i686 i686 GNUPourquoi le tableau global (initialisé) en C n'est pas totalement compté comme PSS

Code C a2.c: possède un tableau global de 40 Mo, et chaque élément est affecté.

int b[10000000];//40M global array 
void main() { 
    int i = 0; 
    for(i = 0; i<10000000; i++) {b[i]=i;} 
    while(1); 
} 

et je construis comme gcc -o a2 a2.c

Quand je lance ce code et voir le fichier SMAP cat /proc/25739/smaps, le contenu sont comme suit

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 

Pourquoi est-ce que cela se produise?

+1

Qu'est-ce que vous voulez exactement faire? – Irshad

+0

salut Irshad, je viens de trouver la chose étrange par accident et je veux savoir la raison. – ddnionio

Répondre

0

Je ne sais pas pourquoi vous voyez, je courais votre programme de test et obtenir un résultat différent, conformément à ce que vous attendiez:

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 

Ma version du noyau est 3.19.0-30-generiC#34-Ubuntu SMP. Etes-vous sûr que vous exécutez le programme exactement comme vous l'avez posté? Il est également possible que le rapport de mémoire du noyau ait changé à un moment donné, ou que ce comportement dépende de la façon dont le noyau est construit.

+0

Je suis confus. Je peux reproduire le problème SEULEMENT dans mon hôte. Mon test sur un autre hôte, et le test de mon collègue sont tous deux en accord avec le vôtre. Curieux de ce qui est arrivé. – ddnionio

1

Vous avez le soutien des pages énormes transparents (THP) activés et BSS de votre exécutable est soutenu par pages énormes:

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 

Si vous regardez attentivement, la valeur Pss déclarée de 2196 Kio est exactement la quantité de des mappages de mémoire anonymes soutenus par des pages régulières de 4 KiB, c'est-à-dire la différence entre Anonymous et AnonHugePages. Je suppose que la comptabilité de THP dans PSS est cassée en 3.16.0-30-générique. Entre la version de votre noyau et la version du noyau de @ Evan, il y a plusieurs validations affectant la partie du noyau Linux qui génère le contenu du fichier smaps (fs/proc/task_mmu.c), plus précisément ce changement between 3.18 and 3.19 choses probablement fixes.

+0

donc c'est le bug de mon noyau, non? – ddnionio

+0

Oui, c'est un bug dans votre noyau. –