TP Noté - LIF12 système d`exploitation
Transcription
TP Noté - LIF12 système d`exploitation
Département d’Informatique TP Noté - LIF12 système d’exploitation 1h30 tout document autorisé 1er décembre 2015 Les programmes qui vous sont demandés doivent être écrits en C sur les machines de la salle. Vous n’êtes pas autorisés à échanger d’information (notamment par le réseau), ni à vous connecter aux réseaux extérieurs de la salle. Les machines de la salle vous permettent de vous connecter localement avec le login moi et le mot de passe moi. Vous sauvegarderez votre travail sur ce compte, et vous le déposerez à la fin sous la forme d’une archive nom_prenom.tar.gz sur le serveur http://10.0.10.15/LIF12/. Sans cela, votre travail ne pourra pas être considéré. I Daisy Town Vous allez devoir simuler le célèbre duel de Daisy Town opposant Lucky Luke aux frères Dalton. Lucky Luke est le plus rapide mais il se mesure à 4 personnes... Pour cela vous allez devoir utiliser les fonctions qui ont été préparées pour vous : — tire () est la fonction qui simule un tire via l’appel à pthread_cancel() ce qui nécessite le numéro du thread à éliminer via le paramètre pthread_t cible. temps est le paramètre qui permet de simuler des réflexes plus ou moins rapides, les deux autres paramètres permettent de faire des affichages. — void luckyLuke(pthread_t daltons[4]) permet de simuler le comportement de Lucky Luke, il a besoin du numéro de thread de chacun des 4 frères Dalton pour la fonction tire () . — void daltons(pthread_t luke, int num) est la fonction qui simule le comportement d’un des Dalton, luke doit être le numéro du thread « Lucky Luke » et num est le numéro du Dalton (par ordre de taille). Ces fonction se trouvent dans le fichier duel.c sur le site http://10.0.10.15/LIF12/ II Travail à faire Q.II.1) - Vous devez faire un programme qui lance 5 threads (un pour chaque protagoniste). La difficulté de cette question est que les threads doivent avoir connaissance du numéro des autres threads. Or les premiers à être lancés le sont forcément avant que les numéros des autres soient fixés. Pour cela il y a 2 méthodes : — faire attendre tous les threads pendant 1 seconde avant de lire une variable partagée ; — bloquer les threads uniquement le temps nécessaire grâce à des outils de synchronisation vus en cours. Bien sûr, la seconde méthode doit être préférée, mais il est préférable de rendre un programme qui fonctionne. Q.II.2) - De plus, vous devez faire en sorte que le thread principal soit capable de connaître les threads survivants et affiche : — « Luke a gagné » si Lucky Luke élimine tous les Dalton ; — le nombre de Dalton survivants sinon. Q.II.3) - Enfin, les Dalton tirent en même temps sur Lucky Luke ce qui va provoquer une erreur s’ils sont plusieurs à le faire. En effet, le second essayera d’envoyer un pthread_cancel() à une tâche terminée. Pour éviter cela, vous devez modifier la fonction tire () pour que seul le premier Dalton à parvenir au niveau du pthread_cancel() utilise la fonction. Université Claude Bernard Lyon I 1