Ajout de l'exo 1 TP4
This commit is contained in:
parent
fbd393debc
commit
7ccf6d97eb
44
README.md
44
README.md
@ -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.
|
||||
>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
|
||||
```
|
||||
|
||||
@ -19,7 +19,7 @@ t = 0x564bfc711040
|
||||
m = 0x564bfd7e62a0
|
||||
```
|
||||
|
||||
```console
|
||||
```shell
|
||||
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)
|
||||
|
||||
```console
|
||||
```shell
|
||||
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)
|
||||
|
||||
```console
|
||||
```shell
|
||||
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)
|
||||
|
||||
```console
|
||||
```shell
|
||||
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)
|
||||
|
||||
```console
|
||||
```shell
|
||||
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)
|
||||
|
||||
```console
|
||||
```shell
|
||||
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.
|
||||
|
||||
## 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
19
TP4/Exo1/helpers.c
Normal 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
7
TP4/Exo1/helpers.h
Normal 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
67
TP4/Exo1/pi.c
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user