Examen CS333 : Systèmes d'exploitation
Examen CS333 : Systèmes d'exploitation
3. (3 points) lequel des éléments suivants est la méthode la plus rapide pour écrire un programme qui multiplie deux
matrices en parallèle ?
A. Serial program.B. Multi-threaded. C. Diviser le travail sur plusieurs processus.
D. Distribuez le travail sur plusieurs machines en utilisant par exemple MapReduce.
5. (3 points) Lequel des resources suivants n'est pas partagé par les threads du même processus ?
A. Program code.B. CPU registers.C. Heap. D. Variables globales.
6. (5 points) Considérez la perspective d'un développeur qui code une application multithread.
des primitives existantes telles que les verrous et les variables de condition. Qu'est-ce qui est plus difficile, écrire cette application-
Solution : Les deux sont identiques du point de vue d'un développeur d'application.
7. (5 points) Consider the perspective of a developer who codes an operating system. Which is
plus difficile, mettant en œuvre des primitives de synchronisation telles que des verrous et des variables de condition pour un
8. (5 points) Considérez un environnement dans lequel il existe une correspondance un à un entre le niveau utilisateur
threads and kernel-level threads that allows one or more threads within a process to issue block-
appels système en cours pendant que d'autres threads continuent à s'exécuter. Expliquez pourquoi ce modèle peut rendre mul-
Les programmes multithreadés s'exécutent plus rapidement que leurs homologues monocœurs sur un processeur unique.
puter.
1 sur 4
Solution : Les programmes multi-threadés sont exécutés à très grande vitesse (comparé à
leurs homologues à un seul fil) sur une machine uniprocesseur, où il existe une carte 1-1
ping entre les threads au niveau utilisateur et les threads au niveau noyau. Cela est dû au fait que le thread au niveau noyau
dans un programme multi-thread, permet à au moins un thread d'émettre un appel système bloquant de manière indépendante
sans influencer d'autres fils et permettant ainsi à d'autres fils de fonctionner sans interruption
continuez avec leur exécution. Cependant, dans les équivalents à un seul thread des programmes multi-threadés
Un programme, une machine passe généralement une quantité significative de temps à attendre les opérations d'E/S.
pour être complet. Par conséquent, sur une machine à processeur unique, un processus qui a été autorisé à être bloqué
continue d'exécuter ses autres threads.
9. (5 points) Listez au moins deux types d'opérations matérielles qui sont utilisées pour mettre en œuvre des niveaux supérieurs
primitives de synchronisation telles que des verrous, des sémaphores et des moniteurs.
Solution :
10. (5 points) Expliquez la différence entre le mode utilisateur et le mode noyau. Pourquoi deux modes d'exécution ?
Les modes sont importants pour atteindre les objectifs d'un système d'exploitation ?
Solution : En mode utilisateur, certaines zones de la mémoire sont protégées de l'utilisation par les utilisateurs, certaines
les registres sont inaccessibles, et certaines instructions peuvent ne pas être exécutées.
La distinction entre les deux modes est importante pour que le système d'exploitation maintienne le contrôle sur le
matériel et se protéger contre d'éventuels changements apportés par les programmes.
2 of 4
11. (8 points) Considérez le programme suivant.
(b) (4 points) Si nous échangeons deux lignes dans le code pour que la fonction p() ressemble à ce qui suit, le programme va-t-il
provide mutual exclusion for two processes? Justify your answer.
void P (int id){
tant que (vrai) {
/ * acquérir le verrou / *
tourner = 1 - id;
locked[id] = true;
tant que (verrouillé[1-id] && tour == (1 - id)) / ne rien faire /;* *
/ * section critique / *
/ * libérer le verrou / *
locked[id] = false;
}
}
3 sur 4
12. (12 points) Dans le laboratoire #1, vous avez appris à propos des appels système fork et waitpid. Considérez le
programme suivant qui les utilise :
int i;
void forkProcess() {
pid_t pid;
int statut;
i++;
pid = fork();
si (pid == 0){ / enfant* / *
printf("%d", i);
retour;
} sinon { / *parent / *
i--;
waitpid(pid, &status, 0);
printf("%d", i);
retour;
}
}
void main(){
i = 0;
forkProcess();
forkProcess();
}
(a) (4 points) Quel est le nombre total de processus (y compris le processus principal parent) qui
sera créé lorsque ce programme sera exécuté ?
(b) (4 points) Montrez la sortie qui sera imprimée lorsque ce programme sera exécuté à cause de la
statementprintf("%d", i);. La sortie doit être une séquence de chiffres imprimée par tous les
processus qui sont créés lorsque ce programme s'exécute.
Solution : Notez que la fourchette crée un clone du processus. Le processus enfant aura
ses propres variables globales, pourtant leur valeur sera la même que celle du parent au moment de
fourche. 1 2 1 0 1 0
Solution : Les valeurs imprimées par chaque processus sont les mêmes que dans la partie (b), cependant, le
L'ordre de l'impression changera en fonction de la planification des processus. Contraintes :
•At least one 0 must precede the last 1. This is to guarantee that the main process
a imprimé "0" avant d'avoir forké son deuxième enfant.
Réponses correctes possibles : 1 1 0 0 2 1, 0 0 1 1 1 2, 0 1 0 1 2 1
4 sur 4