r305_dm/README.md

259 lines
13 KiB
Markdown
Raw Normal View History

2023-09-07 15:38:31 +02:00
# TP 1 : Mémoire
## Exercice 1
2023-09-12 08:40:38 +02:00
>Soit le [programme](Exo1/adresses_virtuelles.c) suivant qui affiche les adresses virtuelles de certaines variables lors de l'exécution du processus.
2023-09-12 08:40:38 +02:00
>En utilisant le (pseudo) fichier `/proc/pid/maps`, vérifiez à quel segment de pages ces adresses appartiennent.
>Soit le [programme](Exo1/adresses_virtuelles.c) suivant qui affiche les adresses virtuelles de certaines variables lors de l'exécution du processus.
2023-09-12 08:40:38 +02:00
>En utilisant le (pseudo) fichier `/proc/pid/maps`, vérifiez à quel segment de pages ces adresses appartiennent.
2023-09-11 21:49:01 +02:00
```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)
2023-09-12 08:40:38 +02:00
```
### 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 ?
2. Recommencez avec la version 2. Expliquez.
## 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.