Vous êtes sur la page 1sur 6

INF3600: Systmes dexploitation

Contrle priodique

Aut 2005

cole Polytechnique de Montral Dpartement de Gnie Informatique Cours INF3600 : Systmes dexploitation Contrle priodique Automne 2005

Date : 21 octobre 2005 de 18h30 20h30 Professeurs : Hanifa Boucheneb, Niculina Ignat Documentation permise Calculatrices programmables et cellulaires non permis

Pondration : 30 % Nbre. de questions : 5 Total : 20 points

Question 1 (4 pts) : Gnralits


Rpondez aux questions suivantes (maximum 5 lignes par question). Les rponses doivent tre concises. 1. Un processus peut passer directement de ltat bloqu dans ltat excution. Vrai ou faux? Justifiez. Faux. Lorsquun processus bloqu est dbloqu, il passe dabord ltat prt. Lordonnanceur lancera son excution plus tard, en fonction de la politique dordonnancement. 2. Lorsquun processus demande louverture dun pipe nomm en lecture (respectivement en criture), il est bloqu jusqu ce quun autre processus demande louverture du pipe en criture (respectivement en lecture). Citez un problme qui pourrait survenir si le systme nimposait pas cette synchronisation louverture des pipes. Si un processus crit dans le pipe alors que celui-ci na pas t encore ouvert, le signal SIGPIPE est gnr; ce qui va mettre fin au processus. 3. Un moniteur est un module spcial pour lexclusion mutuelle, dont toutes les donnes et les procdures sont publiques. Vrai ou faux? Justifiez. Page 1 sur 6

INF3600: Systmes dexploitation

Contrle priodique

Aut 2005

Faux. Les donnes sont prives. Un processus peut appeler les procdures du moniteur, pour accder aux sections critiques, mais na pas le droit daccder directement aux donnes internes au moniteur. 4. Lexclusion mutuelle peut tre ralise par la dsactivation de lordonnanceur. Vrai ou faux? Justifiez. Faux. La dsactivation de lordonnanceur protge un processus qui accde une section critique contre les autres processus, mais pas contre les interruptions (qui pourraient accder elles-mmes la section critique).

Question 2 (4 pts) : Processus


Considrez le programme suivant: int main ( ) { pid_t pid; int i, n=3; for (i=0; i<n; i++) { /*1*/ } while (wait(NULL) >= 0); return 0; } 1) Compltez le code prcdent de manire quil cre larborescence illustre ci-dessous :

P F3

F1

F2

F4

F5

F6

F7

Les processus fils du dernier niveau se transforment en a (a est un fichier excutable). Les autres processus fils affichent lcran le message je continue avant de poursuivre la cration de processus. int main ( ) { pid_t pid; int i, n=3; printf("processus racine %d\n", getpid()); for (i=0; i<n; i++) { /*1*/ pid = fork(); Page 2 sur 6

INF3600: Systmes dexploitation

Contrle priodique

Aut 2005

if(pid==0) { printf("creation d'un processus %d par %d\n", getpid(),getppid()); if( i == n-1) execlp("a", "a", NULL); else printf(" Je continue %d\n", getpid()); }else { if(pid==-1) exit(1); printf(" Je suis un pre %d\n", getpid()); } } while (wait(NULL) >= 0); return 0; } 2) Tracez larborescence des processus crs par le programme si lon supprime la ligne while (wait(NULL) >= 0); et la suite de la cration de chaque fils, le pre excute les instructions : wait(NULL); exit(0);
P

F1

F2

F3

Page 3 sur 6

INF3600: Systmes dexploitation

Contrle priodique

Aut 2005

Question 3 (3 pts) : Redirection des sorties standards


Considrez le programme suivant qui a en entre trois paramtres : deux fichiers excutables et un nom de fichier. Ce programme cre deux processus pour excuter les deux fichiers excutables. Compltez le code de manire excuter, lun aprs lautre, les deux fichiers excutables et rediriger les sorties standards des deux excutables vers le fichier spcifi comme troisime paramtre. On rcuprera ainsi dans ce fichier les rsultats du premier excutable suivis de ceux du deuxime. int main(int argc, char* argv[]) { /*0*/ if (fork()==0) { /*1*/ execvp(argv[1], &argv[1]); /*2*/ } /*3*/ if (fork()==0) { /*4*/ execvp(argv[2], &argv[2]); /*5*/ } /*6*/ } int main(int argc, char* argv[]) { int fd; if ( (argc!=4) or (fd = open(argv[3],O_CREAT|O_WRONLY)) < 0) { perror("error"); exit(0); } if (fork()==0) { close(1); dup2(fd,1); close(fd); argv[2] = NULL; execvp(argv[1], &argv[1]); perror("Error EXECVP"); exit(0); } wait(NULL); if (fork()==0) { close(1); dup2(fd,1); close(fd); argv[3]=NULL; execvp(argv[2], &argv[2]); perror("Error EXECVP"); exit(0); } wait(NULL); }

Page 4 sur 6

INF3600: Systmes dexploitation

Contrle priodique

Aut 2005

Question 4 (3 pts) : Signaux


Considrez le programme suivant : void sigintP(int sig) { /*1*/ } void sigalrm(int sig) { /*2*/ } void sigintF(int sig) { /*3*/ } void sigchld(int sig) { wait(NULL); exit(0);
}

int main(void) { signal(SIGCHLD, sigchld); if (fork() == 0) { signal(SIGINT, sigintF); while(1) { printf (ici fils \n); sleep(1); } } while(1) { signal(SIGINT, sigintP); printf(ici pere \n); sleep(1); } return 0; } Compltez le code prcdent de manire raliser les traitements suivants : 1. Si lutilisateur presse les touches Ctrl-C lorsque le programme sexcute, les processus pre et fils ne se terminent pas immdiatement, mais aprs un dlai de 5 secondes. 2. Lorsque lutilisateur presse les touches Ctrl-C, le pre affiche son identificateur PID (sans se terminer); le fils effectue un appel systme alarm(5) qui envoie automatiquement le signal SIGALRM aprs 5 secondes. sigintP() { } sigalrm() { printf("pid=%d\n",getpid()); signal(SIGINT, sigintP); exit(1); }

sigintF() { signal(SIGINT, SIG_IGN); signal(SIGALRM,sigalrm); alarm(5); } Page 5 sur 6

INF3600: Systmes dexploitation

Contrle priodique

Aut 2005

Question 5 (6 pts) : Synchronisation


Deux processus A et B communiquent au moyen dun tampon T pouvant contenir quun seul message la fois. Ce tampon est utilis, de faon alterne, pour la communication dans les deux sens (attention un seul processus utilise la fois ce tampon). Le processus A envoie un message via le tampon B puis attend la rponse de B. la rception de la rponse, il envoie un autre message B, et ainsi de suite Lorsque B reoit un message de A, il envoie sa rponse A avant de se mettre en attente dun autre message de A, et ainsi de suite 1) Synchronisez au moyen de smaphores les processus A et B. Pour rpondre la question, compltez le pseudocode suivant : semaphore WM=0,WR=0; /*0*/ char T[256] ; void envoyer (char buf[] ) ; //construit et dpose un message dans T void recevoir(char buf[] ) ; // rcupre un message de T Processus A Processus B { char mess[256], rep[256] ; { char mess[256] , rep[256] ; while (1) { /* 1 */ envoyer (mess ) ; /* 2*/ V(WM) ; P(WR) ; recevoir(rep) ; /*3*/ } } } while (1) { /* 4 */ P(WM); recevoir (mess) ; /*5*/ envoyer(rep); /* 6*/ V(WR) ; }

2) Supposez maintenant quun troisime processus C dsire communiquer avec B en utilisant lunique tampon T. Les processus A et C se comportent de la mme manire. B peut donc recevoir un message de A ou de C. La rponse de B doit tre rcupre par le processus expditeur du message. Synchronisez au moyen de smaphores les processus A, B et C. Pour rpondre la question compltez le pseudocode suivant : /*0*/ semaphore WM=0,WR=0, mutex=1; char T[256] ; void envoyer (char buf[] ) ; //construit et dpose un message dans T void recevoir(char buf[] ) ; // rcupre un message de T Processus A ou C Processus B { char mess[256], rep[256] ; { char mess[256] , rep[256] ; while (1) { P(mutex); envoyer (mess ) ; V(WM) ; P(WR) ; recevoir(rep) ; V(mutex); } } } Page 6 sur 6 while (1) { P(WM); recevoir (mess) ; envoyer(rep); V(WR) ; }