Ajout de l'exo 1 TP4

This commit is contained in:
Tom MOGULJAK 2023-09-28 22:17:42 +02:00
parent fbd393debc
commit 7ccf6d97eb
4 changed files with 131 additions and 8 deletions

View File

@ -4,7 +4,7 @@
>Soit le [programme](TP1/Exo1/adresses_virtuelles.c) suivant qui affiche les adresses virtuelles de certaines variables lors de l'exécution du processus. >Soit le [programme](TP1/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. >En utilisant le (pseudo) fichier `/proc/pid/maps`, vérifiez à quel segment de pages ces adresses appartiennent.
```console ```shell
tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ ./adresses_virtuelles tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ ./adresses_virtuelles
``` ```
@ -19,7 +19,7 @@ t = 0x564bfc711040
m = 0x564bfd7e62a0 m = 0x564bfd7e62a0
``` ```
```console ```shell
tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ cat /proc/20/maps tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1$ cat /proc/20/maps
``` ```
@ -57,7 +57,7 @@ m appartient au heap (564bfd7e6000-564bfd807000)
1. Allocation statique [buf.c](TP1/Exo1/ex1bis/buf.c) 1. Allocation statique [buf.c](TP1/Exo1/ex1bis/buf.c)
```console ```shell
tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 51 tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 51
``` ```
@ -94,7 +94,7 @@ total kB 27036 17936 16612
2. Allocation sur la pile [stack.c](TP1/Exo1/ex1bis/stack.c) 2. Allocation sur la pile [stack.c](TP1/Exo1/ex1bis/stack.c)
```console ```shell
tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 57 tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 57
``` ```
@ -130,7 +130,7 @@ total kB 2460 1392 120
3. Allocation sur le tas [heap.c](TP1/Exo1/ex1bis/heap.c) 3. Allocation sur le tas [heap.c](TP1/Exo1/ex1bis/heap.c)
```console ```shell
tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 59 tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 59
``` ```
@ -167,7 +167,7 @@ total kB 52356 51280 50016
4. Allocation (gande quantité) sur le tas [huge.c](TP1/Exo1/ex1bis/huge.c) 4. Allocation (gande quantité) sur le tas [huge.c](TP1/Exo1/ex1bis/huge.c)
```console ```shell
tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 61 tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 61
``` ```
@ -203,7 +203,7 @@ total kB 2720 1728 456
5. Allocation sur le mapping [mmap.c](TP1/Exo1/ex1bis/mmap.c) 5. Allocation sur le mapping [mmap.c](TP1/Exo1/ex1bis/mmap.c)
```console ```shell
tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 64 tom@Error404:/mnt/c/Users/naser/Documents/scr/TP1/Exo1/ex1bis$ pmap -x 64
``` ```
@ -395,3 +395,33 @@ tom@Error404:/mnt/c/Users/naser/Documents/scr/r305_dm/TP3/Exo6$ ps -o pid,ppid,p
> On peut voir qu'on a bien créé un processus fils, mais vu qu'on est pas leader de session on ne peut pas créer de nouvelle session, c'est pourquoi `sess` et `tpgid` sont les mêmes que le père. > On peut voir qu'on a bien créé un processus fils, mais vu qu'on est pas leader de session on ne peut pas créer de nouvelle session, c'est pourquoi `sess` et `tpgid` sont les mêmes que le père.
## Exercice 7 ## Exercice 7
> Écrire un programme qui pour `n>0` donné sur la ligne de commande, engendre l'arbre généalogique :
```
0|
|\ 1
| \
| |\ 2
| | \
| | |\ ...
| | | \
| | | |\ n
x x x x x
```
> Chaque processus choisit un nombre au hasard entre 0 et 127. Le processus 0 affichera la plus grande valeur choisie par tous les processus.
> Remarque : on pourra modifier la séquence de nombres aléatoires en utilisant srand dans chaque processus créé. (pourquoi ?)
# TP 4 : Signaux
## Exercice 1
> Pour calculer le nombre pi, on utilise la méthode de Monte-Carlo. On tire aléatoirement des couples (x,y) de nombres de [0,1] x [0,1]. La probabilité qu'il tombe dans le disque de rayon 1 est exactement de pi/4. On procède à plusieurs tirages pour estimer la probilité correspondante.
> En utilisant les signaux, mettre en place :
- avec `SIGALRM`, toutes les 5 secondes, l'affichage de la valeur pi en cours et le nombre de tirs effectués.
- avec `SIGINT` l'arrêt du programme (après la demande d'une confirmation), avec l'affichage du temps écoulé depuis son lancement, quand on fait `ctrl+C` au terminal.
- avec `SIGQUIT` la réinitialisation du calcul avec ctrl+\ depuis le terminal. (faites en sorte que toutes les valeurs restent cohérentes)
> Dans chaque handler, les 2 autres signaux seront bloqués.

19
TP4/Exo1/helpers.c Normal file
View File

@ -0,0 +1,19 @@
#include "helpers.h"
#include <signal.h>
#include <time.h>
int set_signal_handler(int signo, void (*handler)(int)) {
struct sigaction sa;
sa.sa_handler = handler; // call `handler` on signal
sigemptyset(&sa.sa_mask); // don't block other signals in handler
sa.sa_flags = SA_RESTART; // restart system calls
return sigaction(signo, &sa, NULL);
}
double tstamp(void) {
struct timespec tv;
clock_gettime(CLOCK_REALTIME, &tv);
return tv.tv_sec + tv.tv_nsec * 1.0e-9;
}

7
TP4/Exo1/helpers.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef _HELPERS_H
#define _HELPERS_H
int set_signal_handler(int signo, void (*handler)(int));
double tstamp(void);
#endif

67
TP4/Exo1/pi.c Normal file
View File

@ -0,0 +1,67 @@
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <stdint.h>
#include <assert.h>
#include "helpers.h"
#include "helpers.c"
uint64_t shots = 0,
shots_in = 0;
double pi = 0,
t1;
void alarm_handler(int)
{
printf("pi = %f\n", pi);
printf("le nombre de tirs est de %f\n", (double)shots);
alarm(5);
}
void int_handler(int)
{
char c;
alarm(0);
printf("Voulez-vous quitter ? (y/n)\n");
c = getchar();
if (c == 'y' || c == 'Y')
{
printf("Le temps écoulé est de %f\n", tstamp() - t1);
exit(0);
}
alarm(5);
}
void quit_handler(int)
{
shots = 0;
shots_in = 0;
t1 = tstamp();
}
int main(int argc, char *argv[])
{
double x, y;
t1 = tstamp();
alarm(5);
set_signal_handler(SIGALRM, &alarm_handler);
set_signal_handler(SIGINT, &int_handler);
set_signal_handler(SIGQUIT, &quit_handler);
while (1)
{
x = ((double)rand()) / (double)RAND_MAX;
y = ((double)rand()) / (double)RAND_MAX;
shots++;
if ((x * x + y * y) <= 1)
shots_in++;
pi = 4 * (double)(shots_in) / shots;
}
}