Cours de Systèmes d Exploitation



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

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

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

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

Problèmes liés à la concurrence

Chapitre 4 : Exclusion mutuelle

Un ordonnanceur stupide

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

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

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

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

Introduction aux Systèmes et aux Réseaux

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Cours Programmation Système

Introduction à la programmation concurrente

Synchro et Threads Java TM

STAGE IREM 0- Premiers pas en Python

Cours de Base de Données Cours n.12

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

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

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Réplication des données

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

Threads. Threads. USTL routier 1

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

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

Solutions du chapitre 4

Gestion des processus

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Introduction : les processus. Introduction : les threads. Plan

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

PROJET 1 : BASE DE DONNÉES REPARTIES

Conception des systèmes répartis

Les structures de données. Rajae El Ouazzani

Architecture des ordinateurs

Chapitre 2. Classes et objets

ACTIVITÉ DE PROGRAMMATION

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Ordonnancement temps réel

Classes et Objets en Ocaml.

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

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

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

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

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

Gestion distribuée (par sockets) de banque en Java

Algorithmique et structures de données I

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)

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

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

Programme Compte bancaire (code)

Ordinateurs, Structure et Applications

Cours 14 Les fichiers

Bases de données avancées Concurrence d'accès et reprise

VIII- Circuits séquentiels. Mémoires

Systèmes d exploitation Gestion de processus

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

TD3: tableaux avancées, première classe et chaînes

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Algorithmique et Programmation, IMA

Plan du cours. Historique du langage Nouveautés de Java 7

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Licence Sciences et Technologies Examen janvier 2010

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

Introduction au langage C

TP, première séquence d exercices.

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

Programmation d Applications Concurrentes et Distribuées (INF431)

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

Déploiement d iphone et d ipad Gestion des appareils mobiles (MDM)

Cours A7 : Temps Réel

Le langage C. Séance n 4

1. Utilisation du logiciel Keepass

Network musical jammin

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

1 Lecture de fichiers

Démarrer et quitter... 13

Bases de données et sites WEB Licence d informatique LI345

TP 2 Réseaux. Adresses IP, routage et sous-réseaux

L exclusion mutuelle distribuée

LEs processus coopèrent souvent pour traiter un même problème. Ces

Guide d installation CLX.PayMaker Office (3PC)

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

Installation et utilisation du client FirstClass 11

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

2. Comprendre les définitions de classes

Support de cours système d exploitation

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

OCL - Object Constraint Language

1 Recherche en table par balayage

I. Introduction aux fonctions : les fonctions standards

Projet gestion d'objets dupliqués

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Services téléphoniques supplémentaires. Votre raccordement téléphonique est très doué. Novembre 2008

Une ergonomie intuitive

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

Notice d utilisation

Transcription:

Licence d informatique Synchronisation et Communication inter-processus Hafid Bourzoufi Université de Valenciennes - ISTV

Introduction Les processus concurrents s exécutant dans le système d exploitation peuvent être des processus coopératifs ou indépendants. Un processus est indépendant s il n affecte pas les autres processus ou ne peut pas être affecté par eux. Un processus qui ne partagent pas de données avec d autres processus est indépendant Un processus est coopératif s il peut affecter les autres processus en cours d exécution ou être affecté par eux Un processus qui partage des données avec d autres processus est un processus coopératif Les données partagées par les processus coopératifs peuvent se trouver en mémoire principale ou en mémoire secondaire dans un fichier Les accès concurrents à des données partagées peuvent produire des incohérences de données comme le montre l exemple ci-dessous : Exemple Considérons la procédure suivante de mise à jour d un compte bancaire d un client. Pour simplifier, on considère qu un compte est implémenté par un simple fichier qui contient le solde courant du client: Procedure crediter_compte( entier numero_client, entier somme) entier solde ; debut solde=lire_dans_fichier(numero_client); /* lecture du solde dans le fichier du client */ solde = solde + somme ; ecrire_dans_fichier(numero_client, solde) ; /* écrire dans le fichier le nouveau solde */ fin; Supposons maintenant que cette même procédure est exécutée simultanément par deux processus P0 et P1 dans un système d exploitation à temps partagé. Sans faire aucune hypothèse sur la durée du quantum, on peut faire les exécution suivantes : P0 : crediter_compte( 1233, 1000) P1 : crediter_compte( 1233, 500) solde = lire_dans_fichier(1233) ; /* P0 bloqué car P1 s exécute */ solde = lire_dans_fichier(1233) ; solde=solde+1000 ; /* P1 bloqué car P0 s exécute */ Ecrire_dans_fichier(1233,solde) ; solde=solde+500 ; Ecrire_dans_fichier(1233,solde) ; Comme le montre cet exemple, le résultat final n est pas le résultat escompté (le client a perdu 500F dans cet affaire L ). Université de Valenciennes - ISTV 2

Sections critiques Le problème dans le programme précédent est dû aux conflits d accès au même fichier. Ces accès sont en lecture et en écriture. Evidemment, il ne peut y avoir de conflit si les accès aux données ne sont qu en lecture seule. ½ On appelle section critique la partie d un programme où se produit le conflit d accès ½ Comment éviter ces conflits d accès? Il faut trouver un moyen d interdire la lecture ou l écriture des données partagées à plus d un processus à la fois Il faut une exclusion mutuelle qui empêche les autres processus d accéder à des données partagées si celles-ci sont en train d être utilisées par un processus Dans l exemple précédent, il faut obliger le processus P1 à attendre la terminaison de P0 avant d exécuter à son tour la même procédure Pour une bonne coopération entre processus Pour que les processus qui partagent des objets (données en mémoire centrale ou dans fichiers) puissent coopérer correctement et efficacement, quatre conditions sont nécessaires : 1. Exclusion mutuelle : deux processus ne peuvent être en même temps en section critique 2. Famine : aucun processus ne doit attendre trop longtemps avant d entrer en section critique 3. Interblocage (deadlock) : aucun processus suspendu en dehors d une section critique ne doit bloquer les autres d y entrer. La dernière section sera consacrée à l étude de ce problème 4. Aucun hypothèse ne doit être faite sur les vitesses relatives des processus Université de Valenciennes - ISTV 3

Exclusion mutuelle par attente active q Un processus désirant entrer dans une section critique doit être mis en atente si la section critique devient libre q Un processus quittant la section critique doit le signaler aux autres processus q Protocole d accès à une section critique : <entrer_section_critique> /* attente si SC non libre */ <Section_Critique> /* Un seule processus en SC */ <Quitter_Section_Critique> q L attente peut être : ½ Active : la procédure entrer_section_critique est une boucle dont la condition est un test qui porte sur des variables indiquant la présence ou non d un processus en Section critique ½ Non active : le processus passe dans l état endormi et ne sera réveillé que lorsqu il sera autorisé à entrer en section critique q Que contiennent les procédures entrer_section_critique et quitter_section_critique? 1 ère Solution : Masquage des interruptions q Le moyen le plus simple est que chaque processus puisse masquer les interruptions avant d entrer en section critique Õ l interruption horloge qui permet d interrompre un processus lorsqu il a épuisé son quantum (temps CPU), serait ignorée Õ plus de commutation de processus q Lorsqu un processus quitte la section critique, doit restaurer les interruptions q Solution dangereuse en mode utilisateur : ½ Si dans un processus, le programmeur a oublié de restaurer les interruptions, c est la fin du système L 4

2 ème solution : les variables de verrouillage q Un verrou est une variable binaire partagée qui indique la présence d un processus en Section Critique : Õ si verrou = 0 alors la section critique est libre Õ si verrou = 1 alors la section critique est occupée q Procédure entrer_section_critique () : void entrer_section_critique () { if (verrou == 0) verrou=1 ; else while (verrou == 1) ; /* attente active */ verrou=1 ; q Procédure quitter_section_critique () void quitter_section_critique () { verrou=0 ; q L exclusion mutuelle n est assurée que si le test et le positionnement du verrou est ininterruptible (sinon le verrou constitue une section critique) Õ Pour cela il faut disposer d une instruction (test and set) qui teste et modifie le contenu d un mot en mémoire centrale de façon indivisible. 3 ème Solution : l alternance q On utilise une variable partagée (tour) qui mémorise le numéro du processus autorisé à entrer en section critique q Exemple d utilisation pour N processus : Õ void entrer_section_critique (int MonNumero) { while (tour!= monnumero) ; /* attente active */ Õ void quitter_section_critique () { tour=(monnumero +1) % N ; /* au suivant! */ q Avantage : simple et facile à utiliser q Inconvénient : problème de famine, un processus possédant tour, peut ne pas être intéressé immédiatement par la section critique 5

Solution de Peterson (1981) q Pour le cas de deux processus P0 et P1 : #define FAUX 0 #define VRAI 1 #define N 2 int tour ; /* à qui le tour */ int interesse[n] ; /* initialisé à FAUX */ void entrer_section_critique (int process) /* n de processus : 0 ou 1*/ { int autre ; autre = 1-process ; interesse[process]=vrai ; /* indiquer qu on est intéressé */ tour = process ; /* lever le drapeau */ while (tour == process && interesse[autre] == VRAI) ; void quitter_section_critique(int process) { interesse[process]=faux ; q Pourquoi l exclusion mutuelle est assurée par cette solution? Réponse : Considérons la situation où les deux processus appellent entrer_section_critique simultanément. Les deux processus sauvegarderont leur numéro dans la variable tour. La valeur sauvegardée en dernier efface la première. Le processus qui entrera en SC est celui qui a positionné la valeur tour en premier. q Cette solution malgré qu elle fonctionne bien, elle présente un gros inconvénient : elle basée sur l attente active ; un processus ne pouvant entrer en SC utiliserait l UC inutilement. 6

Solution évitant l attente active q Idée : un processus ne pouvant entrer en section critique, passe dans un état endormi, et sera réveillé lorsqu il pourra y entrer. Õ nécessite un mécanisme de réveil Õ Le SE fournit deux appels système : Œ Sleep (dormir) qui suspend le processus appelant Œ Wakeup (réveiller) qui réveille le processus donné en argument q Application au modèle Producteur/Consommateur Producteur Tampon de taille Consommateur Les deux processus coopèrent en partageant un même tampon Õ Le producteur produit des objets qu il dépose dans le tampon Õ Le consommateur retire des objets du tampon pour les consommer Conflits Õ Le producteur veut déposer un objet alors que le tampon est déjà plein Õ Le consommateur veut retirer un objet du tampon alors que celui-ci est vide Õ Le producteur et le consommateur ne doivent pas accéder simultanément au tampon 7

Code des processus producteur et consommateur #define N 100 /* nbre d emplacement ds tampon */ int compteur = 0 ; /* nbre d objets ds tampon */ void producteur () { while (VRAI) { produire_objet( ) ; if (compteur == N) sleep () ; mettre_objet( ) ; compteur = compteur + 1 ; if (compteur == 1) wakeup(consommateur) ; void consommateur () { while (TRUE) { if (compteur == 0) sleep() ; retirer_objet( ) compteur = compteur 1 ; if (compteur == N-1) wakeup (producteur) ; consommer_objet( ) ; Analyse de cette solution : 1. L accès à la variable compteur n est pas protégé, ce qui peut entraîner des incohérences dans les valeurs prises par cette variable 2. Réveils perdus : c est le principal défaut de ce mécanisme. Un signal wakeup envoyé à un processus qui ne dort pas (encore) est perdu. 8