# TP 1 : Mémoire ## Exercice 1 >Soit le [programme](Exo1/adresses_virtuelles.c) suivant qui affiche les adresses virtuelles de certaines variables lors de l'exécution du processus. >En utilisant le (pseudo) fichier `/proc/pid/maps`, vérifiez à quel segment de pages ces adresses appartiennent. ```console tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ ./adresses_virtuelles ``` >mon pid est 20 ``` main = 0x564bfc70e169 &argc = 0x7ffd8f4ac78c &i = 0x7ffd8f4ac794 &j = 0x564bfc711fe0 t = 0x564bfc711040 m = 0x564bfd7e62a0 ``` ```console tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ cat /proc/20/maps ``` ``` 564bfc70d000-564bfc70e000 r--p 00000000 00:48 3659174697600603 /mnt/c/Users/naser/Documents/scr/TP1/adresses_virtuelles 564bfc70e000-564bfc70f000 r-xp 00001000 00:48 3659174697600603 /mnt/c/Users/naser/Documents/scr/TP1/adresses_virtuelles 564bfc70f000-564bfc710000 r--p 00002000 00:48 3659174697600603 /mnt/c/Users/naser/Documents/scr/TP1/adresses_virtuelles 564bfc710000-564bfc711000 r--p 00002000 00:48 3659174697600603 /mnt/c/Users/naser/Documents/scr/TP1/adresses_virtuelles 564bfc711000-564bfc712000 rw-p 00003000 00:48 3659174697600603 /mnt/c/Users/naser/Documents/scr/TP1/adresses_virtuelles 564bfd7e6000-564bfd807000 rw-p 00000000 00:00 0 [heap] 7f246a43d000-7f246a440000 rw-p 00000000 00:00 0 7f246a440000-7f246a466000 r--p 00000000 08:20 10783 /usr/lib/x86_64-linux-gnu/libc.so.6 7f246a466000-7f246a5bb000 r-xp 00026000 08:20 10783 /usr/lib/x86_64-linux-gnu/libc.so.6 7f246a5bb000-7f246a60e000 r--p 0017b000 08:20 10783 /usr/lib/x86_64-linux-gnu/libc.so.6 7f246a64e000-7f246a658000 r--p 00026000 08:20 10780 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7f246a658000-7f246a65a000 r--p 00030000 08:20 10780 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7f246a65a000-7f246a65c000 rw-p 00032000 08:20 10780 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 7ffd8f48e000-7ffd8f4af000 rw-p 00000000 00:00 0 [stack] 7ffd8f568000-7ffd8f56c000 r--p 00000000 00:00 0 [vvar] 7ffd8f56c000-7ffd8f56e000 r-xp 00000000 00:00 0 [vdso] ``` ``` main appartient au deuxieme segment de pages (564bfc70e000-564bfc70f000) &argc appartient au stack (7ffd8f48e000-7ffd8f4af000) &i appartient aussi au stack (7ffd8f48e000-7ffd8f4af000) &j appartient au heap (564bfd7e6000-564bfd807000) t appartient au heap (564bfd7e6000-564bfd807000) m appartient au heap (564bfd7e6000-564bfd807000) ``` ### Exercice 1 bis >L'interface (pseudo-fichier) `proc/pid/smaps` permet de voir la consommation mémoire d'un processus. On peut le formater avec la commande `pmap -X`. Le but de l'exercice est de voir ce qui se passe au niveau de la mémoire d'un processus suivant les différents mode d'allocation. Le programme `null.c` permet d'avoir un point de comparaison. Dans les cas suivants, vérifiez où se trouve la memoire correspondante : 1. Allocation statique [buf.c](Exo1/ex1bis/buf.c) ```console tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 51 ``` ``` 51: ./buf Address Kbytes RSS Dirty Mode Mapping 000055a1b721c000 4 4 0 r---- buf 000055a1b721d000 4 4 0 r-x-- buf 000055a1b721e000 4 4 0 r---- buf 000055a1b721f000 4 4 4 r---- buf 000055a1b7220000 4 4 4 rw--- buf 000055a1b7221000 24576 16516 16516 rw--- [ anon ] 000055a1b986a000 132 4 4 rw--- [ anon ] 00007f52d26db000 12 8 8 rw--- [ anon ] 00007f52d26de000 152 152 0 r---- libc.so.6 00007f52d2704000 1364 860 0 r-x-- libc.so.6 00007f52d2859000 332 108 0 r---- libc.so.6 00007f52d28ac000 16 16 16 r---- libc.so.6 00007f52d28b0000 8 8 8 rw--- libc.so.6 00007f52d28b2000 52 20 20 rw--- [ anon ] 00007f52d28c4000 8 4 4 rw--- [ anon ] 00007f52d28c6000 4 4 0 r---- ld-linux-x86-64.so.2 00007f52d28c7000 148 148 0 r-x-- ld-linux-x86-64.so.2 00007f52d28ec000 40 36 0 r---- ld-linux-x86-64.so.2 00007f52d28f6000 8 8 8 r---- ld-linux-x86-64.so.2 00007f52d28f8000 8 8 8 rw--- ld-linux-x86-64.so.2 00007ffc3f565000 132 12 12 rw--- [ stack ] 00007ffc3f5a8000 16 0 0 r---- [ anon ] 00007ffc3f5ac000 8 4 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 27036 17936 16612 ``` >L'allocation statique de `buf.c` se trouve à l'adresse 000055a1b7221000 et elle est de 24576 Kbytes 2. Allocation sur la pile [stack.c](Exo1/ex1bis/stack.c) ```console tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 57 ``` ``` 57: ./stack Address Kbytes RSS Dirty Mode Mapping 000055c5f583a000 4 4 0 r---- stack 000055c5f583b000 4 4 0 r-x-- stack 000055c5f583c000 4 4 0 r---- stack 000055c5f583d000 4 4 4 r---- stack 000055c5f583e000 4 4 4 rw--- stack 000055c5f5acb000 132 4 4 rw--- [ anon ] 00007f019bcba000 12 8 8 rw--- [ anon ] 00007f019bcbd000 152 152 0 r---- libc.so.6 00007f019bce3000 1364 804 0 r-x-- libc.so.6 00007f019be38000 332 112 0 r---- libc.so.6 00007f019be8b000 16 16 16 r---- libc.so.6 00007f019be8f000 8 8 8 rw--- libc.so.6 00007f019be91000 52 20 20 rw--- [ anon ] 00007f019bea3000 8 4 4 rw--- [ anon ] 00007f019bea5000 4 4 0 r---- ld-linux-x86-64.so.2 00007f019bea6000 148 148 0 r-x-- ld-linux-x86-64.so.2 00007f019becb000 40 36 0 r---- ld-linux-x86-64.so.2 00007f019bed5000 8 8 8 r---- ld-linux-x86-64.so.2 00007f019bed7000 8 8 8 rw--- ld-linux-x86-64.so.2 00007ffdebac4000 132 36 36 rw--- [ stack ] 00007ffdebbef000 16 0 0 r---- [ anon ] 00007ffdebbf3000 8 4 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 2460 1392 120 ``` >L'allocation sur la pile de `stack.c` se trouve à l'adresse 00007ffdebac4000 et elle est de 132 Kbytes 3. Allocation sur le tas [heap.c](Exo1/ex1bis/heap.c) ```console tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 59 ``` ``` 59: ./heap Address Kbytes RSS Dirty Mode Mapping 000055ac09aae000 4 4 0 r---- heap 000055ac09aaf000 4 4 0 r-x-- heap 000055ac09ab0000 4 4 0 r---- heap 000055ac09ab1000 4 4 4 r---- heap 000055ac09ab2000 4 4 4 rw--- heap 000055ac0a4c2000 50028 49924 49924 rw--- [ anon ] 00007f1e58321000 12 8 8 rw--- [ anon ] 00007f1e58324000 152 152 0 r---- libc.so.6 00007f1e5834a000 1364 844 0 r-x-- libc.so.6 00007f1e5849f000 332 64 0 r---- libc.so.6 00007f1e584f2000 16 16 16 r---- libc.so.6 00007f1e584f6000 8 8 8 rw--- libc.so.6 00007f1e584f8000 52 20 20 rw--- [ anon ] 00007f1e5850a000 8 4 4 rw--- [ anon ] 00007f1e5850c000 4 4 0 r---- ld-linux-x86-64.so.2 00007f1e5850d000 148 148 0 r-x-- ld-linux-x86-64.so.2 00007f1e58532000 40 36 0 r---- ld-linux-x86-64.so.2 00007f1e5853c000 8 8 8 r---- ld-linux-x86-64.so.2 00007f1e5853e000 8 8 8 rw--- ld-linux-x86-64.so.2 00007ffe0d57b000 132 12 12 rw--- [ stack ] 00007ffe0d5fa000 16 0 0 r---- [ anon ] 00007ffe0d5fe000 8 4 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 52356 51280 50016 ``` >L'allocation sur le tas de `heap.c` se trouve à l'adresse 000055ac0a4c2000 et elle est de 50028 Kbytes 4. Allocation (gande quantité) sur le tas [huge.c](Exo1/ex1bis/huge.c) ```console tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 61 ``` ``` 61: ./huge Address Kbytes RSS Dirty Mode Mapping 000055fdf6259000 4 4 0 r---- huge 000055fdf625a000 4 4 0 r-x-- huge 000055fdf625b000 4 4 0 r---- huge 000055fdf625c000 4 4 4 r---- huge 000055fdf625d000 4 4 4 rw--- huge 000055fdf6cef000 132 100 100 rw--- [ anon ] 00007f5bb5f2e000 272 268 268 rw--- [ anon ] 00007f5bb5f72000 152 152 0 r---- libc.so.6 00007f5bb5f98000 1364 852 0 r-x-- libc.so.6 00007f5bb60ed000 332 64 0 r---- libc.so.6 00007f5bb6140000 16 16 16 r---- libc.so.6 00007f5bb6144000 8 8 8 rw--- libc.so.6 00007f5bb6146000 52 20 20 rw--- [ anon ] 00007f5bb6158000 8 4 4 rw--- [ anon ] 00007f5bb615a000 4 4 0 r---- ld-linux-x86-64.so.2 00007f5bb615b000 148 148 0 r-x-- ld-linux-x86-64.so.2 00007f5bb6180000 40 36 0 r---- ld-linux-x86-64.so.2 00007f5bb618a000 8 8 8 r---- ld-linux-x86-64.so.2 00007f5bb618c000 8 8 8 rw--- ld-linux-x86-64.so.2 00007fffa6cae000 132 16 16 rw--- [ stack ] 00007fffa6cf2000 16 0 0 r---- [ anon ] 00007fffa6cf6000 8 4 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 2720 1728 456 ``` >L'allocation (gande quantité) sur le tas de `huge.c` se trouve à l'adresse 00007f5bb5f2e000 et elle est de 272 Kbytes 5. Allocation sur le mapping [mmap.c](Exo1/ex1bis/mmap.c) ```console tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 64 ``` ``` 64: ./mmap Address Kbytes RSS Dirty Mode Mapping 000055c9d1054000 4 4 0 r---- mmap 000055c9d1055000 4 4 0 r-x-- mmap 000055c9d1056000 4 4 0 r---- mmap 000055c9d1057000 4 4 4 r---- mmap 000055c9d1058000 4 4 4 rw--- mmap 000055c9d2214000 132 4 4 rw--- [ anon ] 00007fad683c0000 256 128 128 rw--- 256k 00007fad68400000 64 64 64 rw-s- zero (deleted) 00007fad68410000 44 40 40 rw--- [ anon ] 00007fad6841b000 152 152 0 r---- libc.so.6 00007fad68441000 1364 812 0 r-x-- libc.so.6 00007fad68596000 332 120 0 r---- libc.so.6 00007fad685e9000 16 16 16 r---- libc.so.6 00007fad685ed000 8 8 8 rw--- libc.so.6 00007fad685ef000 52 20 20 rw--- [ anon ] 00007fad685fd000 24 4 4 rw--- [ anon ] 00007fad68603000 4 4 0 r---- ld-linux-x86-64.so.2 00007fad68604000 148 148 0 r-x-- ld-linux-x86-64.so.2 00007fad68629000 40 36 0 r---- ld-linux-x86-64.so.2 00007fad68633000 8 8 8 r---- ld-linux-x86-64.so.2 00007fad68635000 8 8 8 rw--- ld-linux-x86-64.so.2 00007ffdc2360000 132 16 16 rw--- [ stack ] 00007ffdc2384000 16 0 0 r---- [ anon ] 00007ffdc2388000 8 4 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 2828 1612 324 ``` >L'allocation sur le mapping de `mmap.c` se trouve à l'adresse 00007fad683c0000 et elle est de 256 Kbytes ## Exercice 2 >Soit le [programme](Exo2/bss_data.c) suivant. 1. Compilez le programme. Avec la commande `size`, regardez les différents segments du programme. Où se trouve le tableau `t` ? Augmentez la valeur de N. La taille de l'exécutable a-t-elle changé ? pourquoi ? >Le tableau `t` se trouve dans le segment `.bss` et la taille de l'exécutable n'a pas changé car le tableau `t` n'est pas initialisé. 2. Recommencez avec la version 2. Expliquez. >Le tableau `t` se trouve dans le segment `.data` et la taille de l'exécutable a changé car le tableau `t` est initialisé. ## Exercice 3 >Soit le [programme](Exo3/ij_ji.c) suivant. >Le temps d'éxecution de ce programme est-il différent pour les deux versions ? Pourquoi ? >Le temps d'éxecution de ce programme entre les deux versions est différente, elle est plus importante dans la deuxième. Car lors de la boucle `for`, dans la première version, le compilateur a optimisé le code en mettant la valeur de `j` dans un registre, alors que dans la deuxième version, il a mis la valeur de `j` est dans la mémoire, donc il faut aller la chercher à chaque fois, vu que la mémoire est plus lente que le registre, la deuxième version est donc plus lente. ## Exercice 4 >Le programme [sum_array.c](Exo4/sum_array.c) fait la somme des éléments d'un tableau en accédant aux éléments séquentiellement (`-c` croissant, `-d` décroissant) ou de manière aléatoire (`-a`). Testez en faisant varier la taille du tableau. Expliquez.