1 Entête des fonctions



Documents pareils
Introduction à la programmation concurrente

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

Problèmes liés à la concurrence

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

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

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours de Systèmes d Exploitation

Les structures de données. Rajae El Ouazzani

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

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

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

Les arbres binaires de recherche

Conventions d écriture et outils de mise au point

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

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

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

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

Solutions du chapitre 4

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

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)

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

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

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

Cours Programmation Système

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

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

Programme Compte bancaire (code)

Java Licence Professionnelle CISII,

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

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

Un ordonnanceur stupide

Algorithmique et Programmation, IMA

Travaux Dirigés n 1 : chaînes de caractères

Cours de Programmation Impérative: Zones de mémoires et pointeurs

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

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

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

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

Programmer en JAVA. par Tama

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

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

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Introduction à la Programmation Parallèle: MPI

Les structures. Chapitre 3

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Projet gestion d'objets dupliqués

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

Algorithmique, Structures de données et langage C

Introduction : les processus. Introduction : les threads. Plan

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

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

COMPARAISONDESLANGAGESC, C++, JAVA ET

Programmation client-serveur sockets - RPC

Programmation Par Objets

Synchro et Threads Java TM

Introduction aux systèmes temps réel. Iulian Ober IRIT

Systèmes d exploitation Gestion de processus

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

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Chap III : Les tableaux

PROJET ALGORITHMIQUE ET PROGRAMMATION II

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

Cours 1 : Qu est-ce que la programmation?

ENSP Strasbourg (Edition ) Les Systèmes Temps Réels - Ch. DOIGNON. Chapitre 3. Mise en œuvre : signaux, gestion du temps et multi-activités

Architecture des ordinateurs

4. Groupement d objets

Programmation Classique en langage C

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

Métriques de performance pour les algorithmes et programmes parallèles

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

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

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

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

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

Cours 6 : Tubes anonymes et nommés

Génération de code binaire pour application multimedia : une approche au vol

Threads. Threads. USTL routier 1

Cours d Algorithmique et de Langage C v 3.0

Initiation à l algorithmique

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

SUPPORT DE COURS. Langage C

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Algorithmique et structures de données I

Premiers Pas en Programmation Objet : les Classes et les Objets

Méthodes de programmation systèmes UE n NSY103. Notes de cours. Nombre d'heures : 55h (~ cours de 3 heures)

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

et Programmation Objet

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Gestion des processus


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

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

Transcription:

Le lecteur rédacteur est un problème de synchronisation qui suppose que l on peut accéder aux données partagées de 2 manières : en lecture, c est a dire sans possibilité de modification; en écriture. Il est simple de voir que les lectures peuvent être faites simultanément. Par contre, on ne doit pas permettre à deux threads d être en état de modifier les données, ni permettre la modification en même temps que la lecture. Le but de ce cours est de construire pas à pas une solution à ce problème. 1 Entête des fonctions Les primitives de synchronisations sont basées sur 4 fonctions : Deux fonctions sont nécessaires pour la lecture : pour signaler/demander le début de lecture; pour signaler la fin de la lecture. Deux fonctions équivalentes sont nécessaires l écriture pour signaler/demander le début de l écriture; pour signaler la fin. De plus, ces fonctions manipuleront une variable de synchronisation commune. Cette variable permet de gérer l accès aux données manipulées. Cette variable sera un objet complexe contenant les compteurs, mutex et variables de condition nécessaires à son fonctionnement. Le but de cette variable est de pouvoir décider ou non de l accès au donnée pour le thread qui en fait la demande. Concrètement, c est en fonction du contenu de cette variable que les fonctions de début de lecture ou de début d écriture seront blocantes ou pas. Cela donne donc : Une structure : typedef struct LectRed {... // à définir LectRed 2 fonctions d initialisation et de destruction void LR init (LectRed m); void LR destroy(lectred m); 4 fonctions pour l utilisation void LR demande lecture(lectred m); void LR fin lecture (LectRed m); void LR demande ecriture(lectred m); void LR fin ecriture(lectred m); 2 Compter les lecteurs et les rédacteurs Pour faire cela, le premier problème à résoudre est de compter les lecteurs et les rédacteurs. Cela se fait très simplement en incrémentant ou décrémentant 1

une variable compteur. Mais, il faut faire attention à protéger cette variable par des muttex. La structure LectRed doit donc au moins contenir 2 compteurs (un pour chaque) et 1 muttex (pour protéger les compteurs). typedef struct LectRed { int nb lect ; int nb red ; pthread mutex t mut; LectRed Les fonctions doivent permettre de compter le nombre de threads en section critique. void LR demande lecture(lectred m) { m >nb lect ++; void LR fin lecture (LectRed m) { m >nb lect ; void LR demande ecriture(lectred m) { 2

m >nb red ++; void LR fin ecriture(lectred m) { m >nb red ; 3 Attente L algorithme est alors simple : Pour les lecteurs : S il y a un rédacteur alors attendre Sinon passer Pour les rédacteurs S il y a un lecteur alors attendre. S il y a un rédacteur alors attendre. Sinon passer. De même pour sortir de la section critique, le thread doit réveiller ceux qui sont en attente : Un lecteur ne doit réveiller les rédacteurs en attente que s il est le dernier thread à sortir. Un rédacteur doit réveiller soit les lecteurs en attente, soit un autre rédacteur. 3

Pour le cas du rédacteur il faut être capable de savoir s il y a un lecteur en attente ou alors réveiller systématiquement les deux. Le deuxième cas est plus simple, mais il oblige à re-tester systématiquement la présence de threads en section critique. void LR demande lecture(lectred m) { while (m >nb red!= 0) { // la boucle while sert à retester l attente en sortant. // Elle est nécessaire car les rédacteurs réveillent systématiquement // les lecteurs et les rédacteurs pthread cond wait(&(m >attente lect ), &(m >mut)); m >nb lect ++; void LR fin lecture (LectRed m) { m >nb lect ; if (m >nb lect == 0) { // C est le dernier thread en lecture, on réveille les rédacteurs en // attente. pthread cond signal(&(m >attente red )); void LR demande ecriture(lectred m) { 4

while (m >nb red!= 0 m >nb lect!= 0) { pthread cond wait(&(m >attente red ), &(m >mut)); m >nb red ++; void LR fin ecriture(lectred m) { m >nb red ; pthread cond broadcast(&(m >attente lect )); pthread cond signal(&(m >attente red )); 4 Famine Que se passe-t il s il y a des lecteurs qui arrivent régulièrement? Dans ce cas, les rédacteurs ne peuvent jamais obtenir le passage. En effet, si un rédacteur est en attente, les lecteurs qui arrivent lui passent devant et 5

l empêchent d accéder aux données. Pour résoudre le problème, il faut empêcher l arrivée de nouveaux lecteurs dès qu un rédacteur est en attente. Un bon moyen pour cela est d utiliser un mutex partagé par les lecteurs et les rédacteurs pendant leur fonction de demande d accès. Ainsi, si un thread est bloqué dans cette fonction, plus aucun autre thread ne peut y accéder. Ce mutex permet alors de conserver l ordre d arrivée dans la file d attente. 6