Soit l ensemble de processus suivant, où les contraintes de précédence sont données par le graphe ci-dessous :



Documents pareils
INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Problèmes liés à la concurrence

Chapitre 2. Les processus. 2.1 Introduction. 2.2 les différents états d un processus

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Cours de Systèmes d Exploitation

Introduction à la programmation concurrente

On appelle variable condition une var qui peut être testée et

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

1 Mesure de la performance d un système temps réel : la gigue

Le langage C. Séance n 4

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Cours 2: Exclusion Mutuelle entre processus (lourds, ou légers -- threads)

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Programmation système

Partie 7 : Gestion de la mémoire

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Chapitre 4 : Exclusion mutuelle

TP3 : Manipulation et implantation de systèmes de fichiers 1

Premiers Pas en Programmation Objet : les Classes et les Objets

Gestion des processus

UE C avancé cours 1: introduction et révisions

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

4. Outils pour la synchronisation F. Boyer, Laboratoire Sardes

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Exercices INF5171 : série #3 (Automne 2012)

Java Licence Professionnelle CISII,

Synchro et Threads Java TM

Initiation au HPC - Généralités

Un ordonnanceur stupide

Cours Programmation Système

Licence Sciences et Technologies Examen janvier 2010

Introduction aux Systèmes et aux Réseaux

Chp. 4. Minimisation d une fonction d une variable

Les processus légers : threads. Système L3, /31

Introduction à la Programmation Parallèle: MPI

Les RPV (Réseaux Privés Virtuels) ou VPN (Virtual Private Networks)

Ordonnancement temps réel

Temps Réel. Jérôme Pouiller Septembre 2011

Network musical jammin

MATHÉMATIQUES FINANCIÈRES

Simulation d une économie monétaire (programmation impérative, sujet 3)

CEG4566/CSI4541 Conception de systèmes temps réel

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Les systèmes de gestion de version

LE PROBLEME DU PLUS COURT CHEMIN

Transmission d informations sur le réseau électrique

alg - Classes, instances, objets [oo] Exercices résolus

L exclusion mutuelle distribuée

DAns un système multi-utilisateurs à temps partagé, plusieurs processus

Systèmes d exploitation Gestion de processus

Installation Serveur DNS Bind9 Ubuntu LTS

Définition des Webservices Ordre de paiement par . Version 1.0

Capacité Métal-Isolant-Semiconducteur (MIS)

Ry Moran Directeur de la consignation des déclarations de la CVR, responsable du Centre national de recherches

Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Système de Gestion de Fichiers

Feuille TD n 1 Exercices d algorithmique éléments de correction

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Bases de programmation. Cours 5. Structurer les données

Programmation système I Les entrées/sorties

Cryptographie et fonctions à sens unique

Guide d installation de Java et des pilotes de lecture des supports

S initier aux probabilités simples «Question de chance!»

Programmation système en C/C++

Programmation linéaire

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Cours de Génie Logiciel

Organigramme / Algorigramme Dossier élève 1 SI

Chapitre 1 : Introduction aux bases de données

Représentation d un entier en base b

Gestion de mémoire secondaire F. Boyer, Laboratoire Sardes

1 Recherche en table par balayage

Algorithmique et Programmation, IMA

Algorithme. Table des matières

4. Groupement d objets

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Introduction. Adresses

Plateforme PAYZEN. Définition de Web-services

Cours d initiation à la programmation en C++ Johann Cuenin

COMMUNICATION ENTRE DEUX ORDINATEURS PAR LASER MODULE EN CODE MORSE OU BINAIRE.

Définitions. Numéro à préciser. (Durée : )

Université Paris-Dauphine DUMI2E 1ère année, Applications

Plus courts chemins, programmation dynamique

Rappel d un lot de réactif Wash Buffer II Utilisé sur les systèmes d Immunoanalyse Unicel DxI et DxC 880i Access

En face du commanditaire, on met un chef de projet qui connait le domaine (banque, administration, etc.)

Programmation Objet - Cours II

C f tracée ci- contre est la représentation graphique d une

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Cours 6 : Tubes anonymes et nommés

STANDARD DE CONSTRUCTION CONDUITS, ATTACHES ET RACCORDS DE

Chapitre VI- La validation de la composition.

Transcription:

O r s a y Travaux Dirigés n o 3 : Sémaphores DUT Informatique 2010 / 2011 Objectifs : comprendre le concept de sémaphore, son utilité pour réaliser l exclusion mutuelle et savoir utiliser son implémentation Unix. 1 Notes de cours 1.1 Concept de sémaphore Un sémaphore est un mécanisme de synchronisation de processus inventé par le physicien et informaticien hollandais Edsger Dijkstra en 1965. Il s agît d une structure de données qui comprend (1) une variable entière non négative donnant le nombre de ressources disponibles et (2) une file d attente de processus. On manipule un sémaphore uniquement au travers de trois opérations qui ont la particularité d être atomiques, c est à dire qu elles s exécuteront jusqu à terminaison sans être interrompues par un autre processus : Init(semaphore sem, int nombre_de_ressources); P(semaphore sem); V(semaphore sem); 1. Init(sem,nombre_de_ressources) est la procédure d initalisation du sémaphore : le nombre de ressources disponibles de sem est initialisé à nombre_de_ressources et la file de processus de sem est vide. Cette opération n est effectuée qu une et une seule fois. 2. P(sem) (du hollandais Proberen : tester, en français «Puis-je?») met le processus dans la file d attente si le nombre de ressources du sémaphore sem est à 0 et décrémente le nombre de ressources sinon. 3. V(sem) (du hollandais Verhogen : incrémenter, en français «Vas-y!») incrémente le nombre de ressources du sémaphore sem ou réveille un processus s il y en a en attente. 1.2 Implantation Unix L implantation Unix est beaucoup plus riche qu une simple transposition des primitives P et V. Elle permet en effet l acquisition simultanée d exemplaires multiples de plusieurs ressources différentes (c est à dire n 1 exemplaires d une ressource R 1, n 2 exemplaires d une ressource R 2,, n p exemplaires d une ressource R p ). De plus cette implantation permet une nouvelle opération Z qui permet d attendre qu un sémaphore devienne nul. Les opérations sont décrites à l aide de la structure de données suivante : # i n c l u d e < s y s / sem. h> s t r u c t sembuf { unsigned s h o r t i n t sem_num ; / Numero de semaphore. / s h o r t sem_op ; / O p e r a t i o n s u r l e semaphore. / s h o r t sem_flg ; / Option. / } ;

Travaux Dirigés n o 3 Sémaphores 2/5 Le premier champ, sem_num, donne le numéro de sémaphore (les numéros commençant à 0). Le second champ, sem_op, donne l opération en elle même, son signe indique l opération : négatif opération P(sem_num), positif opération V(sem_num), nul opération Z(sem_num). Nous n entrerons pas dans les détails du dernier champ. Il y a simplement trois primitives fondamentales pour la manipulation des sémaphores Unix : # i n c l u d e < s y s / sem. h> i n t semget ( k e y _ t cle, i n t nb_semaphores, i n t o p t i o n s ) ; i n t semop ( i n t i d e n t i f i c a t e u r, s t r u c t sembuf tab_op, i n t nb_op ) ; i n t s e m c t l ( i n t i d e n t i f i c a t e u r, i n t semnum, i n t o p e r a t i o n ) ; 1. semget(cle,nb_semaphores,options) sert à créer ou à acquérir l identificateur d un ensemble de sémaphores à partir de sa clé (cle). On peut utiliser la clé IPC_PRIVATE pour la création quand il n est pas utile ensuite d acquérir l identificateur. Le paramètre nb_semaphores est le nombre de sémaphores de l ensemble (s il a déjà été créé, le nombre doit être inférieur ou égal au nombre lors de la création). Le paramètre option est une combinaison (par OU bit à bit) de constantes (telles que IPC_CREAT pour la création et IPC_EXCL pour renvoyer une erreur si l ensemble existe déjà) et de droits d accès (comme 0666). Par exemple pour créer un ensemble on utilisera typiquement l option IPC_CREAT IPC_EXCL 0666, et pour l acquisition simplement 0. 2. semop(identificateur,tab_op,nb_op) réalise sur l ensemble de sémaphores d identificateur identificateur les nb_op opérations passées en argument sous la forme d un tableau tab_op de nb_op structures de type sembuf atomiquement. Cela signifie qu elles sont toutes réalisées ou qu aucune ne l est (chaque opération étant bien sûr atomique). La fonction retourne 0 en cas de succès ou -1 en cas d échec. 3. semctl(identificateur,semnum,operation) sert à la gestion de l ensemble de sémaphores d identificateur identificateur. Son action et sa valeur de retour dépendent de la valeur du paramètre operation. Par exemple, si operation est IPC_RMID, semctl supprime l ensemble de sémaphores et retourne 0 en cas de succès ou -1 en cas d échec. Si operation est GETNCNT, semctl retourne le nombre de processus en attente d augmentation du sémaphore numéro semnum. 2 Exercices 2.1 Exercice 1 : synchronisation Soit l ensemble de processus suivant, où les contraintes de précédence sont données par le graphe ci-dessous : 1 2 3 4 5 6 1. Donner une solution utilisant les sémaphores pour synchroniser ces processus de manière à respecter les contraintes de précédence (on ne demande pas de code C, mais un

Travaux Dirigés n o 3 Sémaphores 3/5 pseudo-code pour chaque processus avec les appels aux primitives P et V nécessaires à la synchronisation ; vous préciserez combien de sémaphores vous sont nécessaires et à combien de ressources chacun est initialisé). 2. Il existe une solution n utilisant pas plus de trois sémaphores, laquelle (si vous ne l aviez pas trouvée à la question précédente)? 2.2 Exercice 2 : problème des producteurs/consommateurs Les problèmes de type producteur consommateur sont ceux dans lesquels certains processus consomment des données produites par d autres. Ce qui rend le problème délicat, c est que la place pour stocker les choses produites est limitée et que le nombre de processus qui produisent ou consomment n est pas connu a priori. Par conséquent le problème introduit plusieurs types de contraintes de synchronisation : Un producteur doit arrêter de produire quand il n a plus de place pour stocker ce qu il produit. Un consommateur doit arrêter de consommer des choses quand l espace est vide. Producteurs et consommateurs doivent éviter de se marcher sur les pieds : deux producteurs qui produisent en même temps ne doivent pas placer leur production au même endroit (en mémoire), deux consommateurs ne doivent pas consommer la même donnée, etc. Dans cet exercice, on vous demande de compléter les trous dans les squelettes suivants.vous disposez en tout de 3 sémaphores : mutex, full et empty, dont il faudra compléter l initialisation. On suppose que les données produites sont de taille fixe, et que l espace pour les stocker est un tampon circulaire de dimension n. Vous n avez pas à vous préoccuper de l ajout/retrait d éléments dans le tampon, qui est réalisé automatiquement par les instruction add et remove. En revanche, invoquer add lorsque le buffer est plein ou remove lorsqu il est vide est interdit. Attention : le nombre de lignes pointillées ne correspond pas forcément au nombre d instructions qu il faut utiliser! Initialisation Producteur Consommateur Init(mutex, 1 ) Init(full, 0 ) Init(empty,) tant_que vrai faire P(mutex) add(objet) tant_que vrai faire remove(objet) V(empty) 2.3 Exercice 3 : implémentation Implémentez les primitives de base des sémaphores définies par Dijkstra (voir notes de cours, section 1.1), Init, V et P à l aide des primitives standard Unix. 3 Entraînement : exercice corrigé 3.1 Énoncé : interblocage Un étudiant qui se spécialise en anthropologie et accessoirement en informatique s est embarqué dans un projet de recherche pour voir s il était possible d enseigner les interblocages aux babouins d Afrique. Il repère un profond canyon et y jette une corde au travers, de sorte que

Travaux Dirigés n o 3 Sémaphores 4/5 les babouins puissent le traverser à bout de bras. Plusieurs babouins peuvent traverser en même temps, pourvu qu ils aillent tous dans la même direction. Si des babouins qui se dirigent vers l est et d autres vers l ouest se trouvent sur la corde au même moment, cela conduit à un interblocage (les babouins sont bloqués au point de rencontre sur la corde) : en effet, ils n ont pas la possibilité de passer les uns par-dessus les autres alors qu ils sont suspendus au-dessus du canyon. Si un babouin souhaite traverser le canyon, il doit vérifier qu aucun autre babouin ne traverse en sens inverse. 1. Au moyen de sémaphores, écrivez un programme pour éviter l interblocage. Ne traitez pas le cas d un groupe infini de babouins se déplaçant d un côté et interdisant tout passage à ceux qui se déplacent vers l autre côté. 2. Reprenez la question précédente, mais en évitant la privation de ressources (famine). Lorsqu un babouin qui souhaite traverser le canyon vers l est arrive à la corde et trouve un babouin qui traverse vers l ouest, il attend jusqu à ce que la corde soit vide, mais aucun babouin se déplaçant vers l ouest n est autorisé à démarrer jusqu à ce qu au moins un babouin ait traversé dans l autre sens. 3.2 Correction (essayez d abord!!!) 3.2.1 Question 1 On doit ici se méfier des solutions trop simples. Pour commencer, on peut écrire un programme dans le cas simplifié où un seul babouin peut être sur la corde à un moment donné. Dans ce cas la solution est simple : la ressource est la corde et tous les babouins auront le même code. À présent, il s agit de répondre à la question où plusieurs babouins peuvent avancer dans la même direction. La difficulté est que seul le premier babouin de la file doit prendre la ressource corde, et seul le dernier de la file, quand il a fini de traverser, doit rendre la ressource. Il faut donc un sémaphore supplémentaire pour la gestion de la corde. Babouins de l Est nb_babouin_est ++ si nb_babouin_est == 1 alors si nb_babouin_est == 0 alors Babouins de l Ouest nb_babouin_ouest ++ si nb_babouin_ouest == 1 alors si nb_babouin_ouest == 0 alors Il faut bien remarquer que : sans le sémaphore de gestion, la condition nb_babouin_est == 1 pourrait par exemple ne jamais être vraie (deux incrémentations pourraient avoir lieu suite à un changement de processus au mauvais moment), il y a famine car si des babouins sont engagés, il n y a aucune garantie pour ceux de l autre côté de passer un jour.

Travaux Dirigés n o 3 Sémaphores 5/5 3.2.2 Question 2 Pour éviter la famine, il suffit de modifier l algorithme en ajoutant un sémaphore ordre_arrivee autour du protocole d entrée. C est donc le système qui gère la file d attente de ceux ayant demandé la ressource qui garantira le respect de l ordre des demandes. Babouins de l Est P(ordre_arrivee) nb_babouin_est ++ si nb_babouin_est == 1 alors V(ordre_arrivee) si nb_babouin_est == 0 alors Babouins de l Ouest P(ordre_arrivee) nb_babouin_ouest ++ si nb_babouin_ouest == 1 alors V(ordre_arrivee) si nb_babouin_ouest == 0 alors