Série n 1 / Solutions



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

Cours de Systèmes d Exploitation

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

Problèmes liés à la concurrence

Algorithmique et structures de données I

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

Programmation C++ (débutant)/instructions for, while et do...while

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

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

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

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

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

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Initiation à LabView : Les exemples d applications :

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

Chapitre 4 : Exclusion mutuelle

Cours d Informatique

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

1 Introduction C+ + Algorithm e. languag. Algorigramm. machine binaire. 1-1 Chaîne de développement. Séance n 4

Introduction à la programmation concurrente

Guide de fonctions du téléphone du système SCI Norstar

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Algorithmique et Programmation, IMA

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours 1 : Qu est-ce que la programmation?

Gestion des transactions et accès concurrents dans les bases de données relationnelles

REALISATION d'un. ORDONNANCEUR à ECHEANCES

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

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

Gestion des processus

Initiation à la programmation en Python

Cours Bases de données 2ème année IUT

Fiche des fonctions du téléphone Business Communications Manager

Cours Programmation Système

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

1. Contexte général page Le compte auprès de la BCGE...page La procuration 2.2 Les accès e-banking 2.3 Le bon de retrait 2.

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

TRANSMETTEUR TELEPHONIQUE TTX = SINTEL X

TP, première séquence d exercices.

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

JEU BOURSIER Séance d introduction à la plateforme de trading SaxoWebTrader. - Pour débutants -

Les différents types de données et leurs opérations de base

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Un ordonnanceur stupide

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

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

1 Année LMD-STSM Algorithmique et Programmation. Série de TD 2

Synchro et Threads Java TM

Solutions du chapitre 4

l'ordinateur les bases

Cours Informatique Master STEP

L'instruction if permet d'exécuter des instructions différentes selon qu'une condition est vraie ou fausse. Sa forme de base est la suivante:

Cours d algorithmique pour la classe de 2nde

Programmation impérative

CORRECTION EXERCICES ALGORITHME 1

Traitement de texte : Quelques rappels de quelques notions de base

Conditions d utilisation

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

Vue d'ensemble OBJECTIFS

Calcul Formel et Numérique, Partie I

ACTIVITÉ DE PROGRAMMATION

Programmation Objet - Cours II

gestion des processus La gestion des processus


Recherche dans un tableau

Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et

Utilisation d'un réseau avec IACA

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Exécutif temps réel Pierre-Yves Duval (cppm)

JaZUp manuel de l'utilisateur v2.4

COMMUNICATION PC/MINITEL

GUIDE DU CANDIDAT BAC S CONCOURS AVENIR 2015 GUIDE DU CANDIDAT BAC «S» Page 1 sur 6

TRAITEMENTS DE FIN D ANNEE

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

Chapitre 4 Pierre, papier, ciseaux

Version française. Serie de serrures SELO SELO-B SELO-BR

Algorithmique et programmation : les bases (VBA) Corrigé

Actions Propres et Consolidation

I- Définitions des signaux.

Chapitre 2 Devine mon nombre!

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

Introduction aux Systèmes et aux Réseaux

Conventions d écriture et outils de mise au point

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Chapitre 2. Eléments pour comprendre un énoncé

Les mises à disposition de personnels ou de matériels

VIII- Circuits séquentiels. Mémoires

Manuel d utilisation du téléphone IP Cisco Small Business Pro SPA525G

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Comment utiliser le lecteur MP3?

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

V 8.2. Vous allez utiliser les services en ligne de la plate forme de dématérialisation de la Salle des Marchés achatpublic.com.

L exclusion mutuelle distribuée

Transcription:

Série n 1 / Solutions Exercice n 1 - les deux processus partagent une variable booléenne interesse qui sera vraie si le processus est en section critique ou demande à y rentrer, et fausse sinon, /* contexte commun */ enum BOOLEEN FAUX,VRAI; enum BOOLEEN interesse = FAUX; void entrer_section_critique(void) while (interesse == VRAI); interesse = VRAI; void sortir_section_critique(void) interesse = FAUX; supposons que interesse soit à la valeur FAUX, si chaque processus teste la variable avant que l'autre ne lui ait affecté la valeur VRAI, les deux processus s'engagerons en section critique. - les deux processus partagent une variable entière tour dont la valeur est égale au numéro du processus autorisé à s'engager en section critique, /* contexte commun */ int tour = 0; while (tour == autre); void sortir_section_critique(int processus) tour = 1 - processus; Le processus i ne peut entrer en section critique que si tour vaut i, donc l'exclusion mutuelle est assurée puisque l'accès à une variable est garanti par l'indivisibilité de

l'opération. Cependant, cette solution impose un fonctionnement en bascule de deux processus, ce qui est contraire avec la propriété d'indépendance (si un processus s'arrête après l'exécution de la fonction sortir_section_critique alors l'autre ne peut y rentre qu'une seule fois). - à chaque processus est associée une variable booléenne qui sera vraie si le processus est en section critique ou demande à y rentrer, et fausse sinon. /* contexte commun */ enum BOOLEEN FAUX,VRAI; enum BOOLEEN interesse[2] = FAUX,FAUX; while (interesse[autre] == VRAI); interesse[processus] = VRAI; void sortir_section_critique(int processus) interesse[processus] = FAUX; A la suite de la séquence suivante : - le processus 0 consulte interesse[1] est le trouve FAUX, - le processus 1 consulte interesse[0] est le trouve FAUX, - le processus 0 met interesse[0] à VRAI et entre en section critique, - le processus 1 met interesse[1] à VRAI et entre en section critique, l'exclusion mutuelle n'est donc pas assurée. On peut essayer de corriger la situation en faisant l'affectation avant le test : interesse[processus] = VRAI; while(interesse[autre] == VRAI); L'exclusion mutuelle est garantie : en effet, si le processus i trouve interesse[j] à FAUX, il entre en section critique, et si plus tard le processus j souhaite rentrer en section critique, il trouvera interesse[i] à VRAI et attendra. Toutefois, à la suite de la séquence suivante :

- le processus 0 met interesse[0] à VRAI, - le processus 1 met interesse[1] à VRAI, - le processus 1 consulte interesse[0] est le trouve VRAI, il boucle, - le processus 0 consulte interesse[1] est le trouve VRAI, il boucle, les deux processus rentre en boucle infinie, ce qui est contraire à la deuxième règle. Exercice n 2 enum BOOLEEN NON,OUI; int tour, interesse[2]; interesse[processus] = OUI; /* je veux rentrer */ tour = num_processus; /* c'est mon tour */ while (tour == processus && interesse(autre) == OUI); void sortir_section_critique(int processus) interesse[processus] = NON; Le programme ci-dessus a été imaginé par Peterson en 1980 (suite aux travaux de Dekker et Dijkstra en 1965). Le principe est simple : chaque processus doit avant d'utiliser les variables partagées, appeler entrer_section_critique, et lorsqu'il finit de les utiliser appeler sortir_section_critique. Au départ, aucun processus n'est en section critique. Le processus 0 appelle entrer_section_critique, indique qu'il est intéressé en mettant sa position à OUI, positionne tour à 0, et la fonction se termine. Si le processus 1 appelait entrer_section_critique, il devrait attendre jusqu'à ce que interesse[o] passe à FAUX, événement qui ne se produira que lorsque le processus 0 appellera sortir_section_critique. Considérons la situation où les deux processus appellent entrer_section_critique presque simultanément. Les deux sauvegarderons leur numéro dans tour, la dernière valeur sauvée efface donc la première. Si le processus 1 enregistre son numéro en dernier, lorsque les deux processus arrive sur la boucle while, le processus 0 rentre en section critique tandis que le processus 1 boucle.

Exercice n 3 - priorité des lecteurs sur les rédacteurs : le seul cas d'attente d'un lecteur se produit quand un rédacteur écrit dans le fichier ; un rédacteur ne peut accéder au fichier que si aucun lecteur n'est en attente ou en cours de lecture. int nl = 0; semaphore mutex1 = 1, mutex2 = 1, w = 1; LECTEURS P(mutex1) nl = nl + 1; si (nl == 1) P(W); V(mutex1) lecture du fichier P(mutex1) nl = nl - 1; si (nl == 0) ; V(mutex1) REDACTEURS P(mutex2) P(W) ecrire dans le fichier V(mutex2) w est un sémaphore d'exclusion mutuelle pour tous les rédacteurs. Il sert également au premier lecteur qui occupe le fichier et au dernier qui le libère. mutex1 est un sémaphore d'exclusion mutuelle pour les lecteurs uniquement, il protège la variable nl. Si un lecteur est bloqué par w, tous les autres le seront par mutex1. mutex2 est un sémaphore d'exclusion mutuelle pour les rédacteurs uniquement. Il assure la priorité des lecteurs sur les rédacteurs car il empêche plusieurs rédacteurs de se bloquer sur w. - priorité des lecteurs sur les rédacteurs si et seulement si un lecteur occupe déjà le fichier : les lecteurs et les rédacteurs ont la même priorité quand aucun lecteur ne lit ; dès qu'un lecteur lit, tous les autres lecteurs peuvent lire et ce quelque soit le nombre de rédacteurs en attente. int nl = 0; semaphore mutex = 1, w = 1; LECTEURS nl = nl + 1; si (nl == 1) P(W); lecture du fichier nl = nl - 1; si (nl == 0) ; REDACTEURS P(W) ecrire dans le fichier

w est un sémaphore d'exclusion mutuelle pour tous les rédacteurs. Il sert également au premier lecteur qui occupe le fichier et au dernier qui le libère. mutex est un sémaphore d'exclusion mutuelle pour les lecteurs uniquement, il protège la variable nl. Si un lecteur est bloqué par w, tous les autres le seront par mutex. - les lecteurs et les rédacteurs ont la même priorité : si un lecteur utilise le fichier, alors les nouveaux lecteurs y accèdent également et ce jusqu'à l'arrivée d'un rédacteur, à ce moment là les nouveaux arrivants attendent sans distinction de catégorie ; de même si un rédacteur utilise le fichier, les nouveaux arrivants attendent, et quand le rédacteur aura fini, il réveillera le premier processus en attente ; si plusieurs lecteurs se suivent dans une file d'attente, ils accèdent ensemble au fichier. int nl = 0; semaphore mutex = 1, r = 1, w = 1; LECTEURS P(r) nl = nl + 1; si (nl == 1) P(W); V(r) lecture du fichier REDACTEURS P(r) P(w) ecrire dans le fichier nl = nl - 1; si (nl == 0) ; V(r) V(r) Le sémaphores r bloque tous les lecteurs nouveaux dès qu'un rédacteur est arrivé. Le sémaphore w bloque toute écriture tant que les lectures ne sont pas finies ; il y a au plus un rédacteur bloqué dans la file associée à w. Dès qu'un lecteur passe ou est réveillé, il incrémente le compteur des lecteurs, bloque éventuellement la ressource et réveille le processus suivant de la file associée à r. L'ordre P(r) P(w) évite l'étreinte fatale ; on peut aussi faire V(r) puis V(w). L'ordre FIFO est assuré si les file associées aux sémaphores sont gérées suivant ce principe.

Exercice n 4 - le carrefour peut contenir une voiture semaphores mutex1 = 1, mutex2 = 1, feu1 = 1, feu2 = 0 Traversée 1 Changement Traversée 2 P(mutex1) a est un booleen VRAI; P(mutex2) P(feu1) boucle infinie P(feu2) traversée attendre(m) traversée V(feu1) si (a) alors V(feu2) V(mutex1) P(feu1) V(mutex2) V(feu2) a <- FAUX sinon P(feu2) V(feu1) a <- VRAI fin si fin boucle infinie feu1 et feu2 règle chaque file. Ils évitent aussi toute modification de feu tant qu'une voiture est dans le carrefour. mutex1 et mutex2 évite une coalition de voiture visant à bloquer un feu => une seule voiture bloqué sur feu1 ou feu2. - le carrefour peut contenir k voitures semaphores mutex1 = k, mutex2 = k, feu1 = 1, feu2 = 0, mutex = 1, w = 0 Traversée 1 Changement P(mutex1) a est un booleen VRAI; P(feu1) boucle infinie attendre(m) n <- n+1 si (a) si (n=1) P(W) P(feu1) P(W) V(feu1) V(feu2) traversée a <- FAUX sinon n <- n-1 P(feu2) si (n=0) P(W) P(W) V(feu21) V(mutex1) a <- VRAI fin si fin boucle w bloque le changement de feu tant qu'il y a des voitures dans le carrefour. A cause de P(feu) est P(w) seul le changement peut-être bloqué sur w. feu1 et feu2 règle chaque file. mutex1 et mutex2 laissent passer au plus k voitures.