0% ont trouvé ce document utile (0 vote)
24 vues2 pages

TP 4

Le document présente des exercices sur les opérations de processus en C, incluant l'utilisation de fork et des appels système comme exec. Il aborde également la gestion des signaux et l'ordonnancement des processus avec différents algorithmes. Enfin, des exercices pratiques sont fournis pour illustrer ces concepts, notamment des calculs de temps d'attente et de réponse.

Transféré par

chickendarna27
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
24 vues2 pages

TP 4

Le document présente des exercices sur les opérations de processus en C, incluant l'utilisation de fork et des appels système comme exec. Il aborde également la gestion des signaux et l'ordonnancement des processus avec différents algorithmes. Enfin, des exercices pratiques sont fournis pour illustrer ces concepts, notamment des calculs de temps d'attente et de réponse.

Transféré par

chickendarna27
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

TP n°4 : Operations sur les processus (2)

Exercice 1 : Exécutez les programmes 1 et 2 en ajoutant (stdio.h et unistd.h). Expliquez leurs résultats
/*programme 1*/ /*programme 2*/
int main () { int main () {
int p; int p;
p=fork(); p=fork();
if (p==-1) { printf("ERREUR \n");} if (p==-1) { printf("ERREUR \n");}
else if (p>0) { printf(" Je suis else if (p>0) { printf(" je suis le
le père mon pid %d et j'ai créé le pere mon pid %d et j’ai créé le fils
fils %d\n",getpid(),p);} %d\n",getpid(),p);}
else if (p==0) { printf("Je suis else if (p==0) { printf("je suis le
le fils mon PID = %d et je vais fils mon PID = %d et je vais
exécuter le code suivant exécuter le code suivant
\n",getpid()); \n",getpid());
char *const arg[] = {"ls", char *envp[] = {"HOME=
"-l","/",NULL}; /home/user",NULL};
execv("/bin/ls",arg);} char *argv[] = {"ls","-l",NULL};
return 0; } execve("/bin/ls",argv,envp);}
return 0; }

Modifiez le programme 1 en utilisant les appels systèmes execlp et execvp


Modifiez le programme 2 en utilisant l’appel système execle

Exercice 2 : Exécutez les programmes suivant en ajoutant (stdio.h, unistd.h, stdlib.h, sys/types.h et signal.h).
Expliquez leurs résultats
/*programme 1 */ /*programme 2 */
int main() { int main() {
void erreur () { void fin_attente() {
printf("erreur division par zero printf("signal reçu arret de la
\n");exit(1) ;} pause");}
signal(SIGFPE,erreur); signal(SIGINT,fin_attente);
int p; pause();
int z=0; printf("je vais faire mon travail
printf("Chiffre \n"); \n");
scanf("%d",&p); return 0;}
p=p/z;return 0;}
/*programme 4 */ /*programme 3 */
int k; void alarme_handler() {
void segv(){printf("Signal SIGSEGV printf("10 secondes
%d Reçu, %d a provoqué la violation écoulées\n"); }
de mémoire\n",SIGSEGV,k); int main() {
exit(EXIT_FAILURE);} signal(SIGALRM,
int main() { alarme_handler);
signal(SIGSEGV,segv); alarm(10);
char pause();
*buffer[2]={"Hello1","Hello2"}; return 0;}
for (k=0;;k++) {printf("%s num
%d\n",buffer[k],k);}return 0;}

1
Remarque : Les numéros des signaux peuvent être obtenues avec la commande kill -l
/*Programme 5*/
int main() {
int p =fork();
if (p==-1) {printf("erreur \n");}
else if (p==0) { printf("i am %d \n" ,getpid());
while(1) {printf("hello \n");}}
else if (p>0) {
sleep(1);
printf("Le processus %d est stopé par le signal %d \n",p,SIGSTOP);
kill(p,SIGSTOP);
sleep(1);
printf(“le processus %d peut reprendre après le signal %d \n",p,SIGCONT) ;
kill(p,SIGCONT);
sleep(1);
printf("Le processus %d est tué par le signal %d \n",p,SIGKILL);
kill(p,SIGKILL);}
return 0;}

Modifier le programme 2 de tel sorte à ce que l’action par défaut sera attaché au signal SIGINT avec SIG_DFL
ensuite appliqué SIG_IGN pour que le signal soit ignoré.

Exercice 3 : Ordonnanceur des processus (TD)


Soit un système monoprocesseur ordonnance l’exécution des processus des deux tableaux suivant ou chaque processus est
caractérisé par son numéro, son temps d'arrivée (TA), et son temps d'exécution (TE)
Processus TA TE 1. Donnez le diagramme de Gantt pour chaqu’un des algorithmes suivants : FIFO,
P1 0 3 SJF, SRTF, Round Robin (quantum = 5 unités de temps)
P2 2 6 2. Calculez le temps de résidence, le temps d’attente et le temps de réponse (pour
P3 4 4 chaque processus)
P4 6 5 3. Calculez le temps de séjour moyen/le temps d’attente moyen.
4. Calculez le temps moyen de réponse pour l’algorithme SRTF
P5 8 2

Processus TA TE Priorité 5. Donnez le diagramme de Gantt pour l’algorithme de priorité avec


P1 0 5 4 réquisition, sachant que la priorité la plus élevé est celle qui est la plus
P2 2 4 2 grande (exemple : P3)
P3 2 2 6 6. Calculez le temps de résidence, le temps d’attente et le temps de
P4 4 4 3 réponse (pour chaque processus)
7. Calculez le temps de séjour moyen/le temps d’attente moyen.

Exercice 4 :
5 processus arrivent pratiquement en même instant t=0 leur temps d’exécution respectif est estimé à 10, 6, 2, 4
et 8 unités de temps leur priorités respectives sont 3, 5, 2, 1 et 4 respectivement, la valeur 1 correspond à une
priorité la plus élevé (selon Linux), en utilisant l’algorithme d’ordonnancement avec priorité (files multi-
niveaux) et réquisition, les quantums sont les suivant Q1=6 unités, Q2 = 4 unités, Q3=Q4=Q5 = 5 unités
1. Donnez le schéma d’exécution des processus (Diagramme de Gantt)
2. Déterminez le temps moyen d’exécution des processus et le temps de moyen d’attente

Vous aimerez peut-être aussi