Vous pouvez vous aider du programme suivant :



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

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

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

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

Problèmes liés à la concurrence

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

Cours de Systèmes d Exploitation

Cours Programmation Système

Introduction à la programmation concurrente

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

Cours 6 : Tubes anonymes et nommés

Compression de Données - Algorithme de Huffman Document de Conception

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

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

Programmation Système (en C sous linux) Rémy Malgouyres LIMOS UMR 6158, IUT département info Université Clermont 1, B.P.

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

Chap III : Les tableaux

Plateforme PAYZEN. Définition de Web-services

I. Introduction aux fonctions : les fonctions standards

REALISATION d'un. ORDONNANCEUR à ECHEANCES

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

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

TP Temps Réel. Polytech Paris - Mars 2012

Les structures. Chapitre 3

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)

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

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

GESTION DES FICHIERS C/UNIX

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

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Programmation système de commandes en C

3IS - Système d'exploitation linux - Programmation système

DAns un système d exploitation multiprogrammé en temps partagé, plusieurs

Chapitre 1 : La gestion dynamique de la mémoire

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

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

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

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

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

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

Algorithmique avec Algobox

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

1.6- Génération de nombres aléatoires

Programmation système en C/C++

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

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

Programmation en langage C

Synchro et Threads Java TM

Le prototype de la fonction main()

KeePass - Mise en œuvre et utilisation

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Gestion des processus

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

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

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

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


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

Programmation Objet - Cours II

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

Introduction à la Programmation Parallèle: MPI

Configuration d'un annuaire LDAP

Créer votre propre modèle

Examen Médian - 1 heure 30

Les structures de données. Rajae El Ouazzani

Série TD 3. Exercice 4.1. Exercice 4.2 Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible! Exercice 4.3. Exercice 4.

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

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

Le langage C. Séance n 4

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

Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés

TeamViewer 9 Manuel Management Console

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Comment utiliser le lecteur MP3?

Petit guide à l'usage des profs pour la rédaction de pages pour le site Drupal du département

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

Manuel d'utilisation d'apimail V3

Sixième partie. Programmation multi-activités Java & Posix Threads. Généralités Java Threads POSIX Threads Autres approches

Performances de la programmation multi-thread

Serveur Acronis Backup & Recovery 10 pour Linux. Update 5. Guide d'installation

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Initiation au HPC - Généralités

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

Les arbres binaires de recherche

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

La gestion des boîtes aux lettres partagées

TP2 : tableaux dynamiques et listes chaînées

Timy. Programme Doublage ("Backup") Français

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

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

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.

Cours 3 : Python, les conditions

PROJET ALGORITHMIQUE ET PROGRAMMATION II

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

Un ordonnanceur stupide

GE Security. KILSEN série KSA700 Centrale de détection et d alarme Incendie analogique adressable. Manuel d utilisation

Transcription:

TP MULTITÂCHE DÉCOUVERTE DES MUTEX ET DES SEMAPHORES Exercice 1 Exclusion mutuelle : Mutex Ecrire un programme qui permet à 5 threads d'écrire un message complet à l'écran (par exemple "Message du thread n 2") sans être dérangé par les autres threads. L'affichage du message se fera lettre par lettre grâce à une temporisation de 0,5 seconde entre chaque affichage de lettre. Le but est d'illustrer l'utilisation d'un mutex. Vous créerez vos threads dans la boucle principale et chaque thread doit pouvoir ensuite afficher son message sans être interrompu. Vous pouvez vous aider du programme suivant : #include <stdio.h> #include <stdlib.h> #include <time.h> //Ne pas oublier d'inclure le fichier time.h #include <pthread.h> /* strcat example */ #include <string.h> pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; #define NB_THREADS 10 typedef struct int n; data; void printcharbychar(char *s, int n) int i=0; while(s[i]!='\0' ) printf("%c",s[i]); i++; sleep(1); printf("%d \n",n); sleep(1);

void *mytask(void *p_data) char s1[50]="message du thread numero "; data *info =p_data; pthread_mutex_lock( &mutex1 ); printcharbychar(s1,info- >n); pthread_mutex_unlock( &mutex1 ); int main (void) printf("main start\n"); int i; pthread_t threads[nb_threads]; data infos[nb_threads]; for(i=0;i<nb_threads;i++) infos[i].n=i; pthread_create (&threads[i], NULL, mytask,&infos[i]); for(i=0;i<nb_threads;i++) pthread_join (threads[i], NULL); printf("main end\n");

Exercice 2 Exclusion mutuelle : Semaphore Réaliser le même programme que l exercice 1 mais avec un sémaphore. Vous pouvez vous aider du bout de code suivant : #include <semaphore.h> #define SEMNAME "monsem" sem_t *attente; int main (void) printf("main start\n"); int i,val; attente = sem_open(semname, O_CREAT O_EXCL, 0777, 1); if(attente == SEM_FAILED) perror("unable to create semaphore"); sem_unlink(semname); exit( - 1 ); //sem_wait(attente); //sem_post(attente); /* Close the semaphore */ sem_close(attente); /* Remove the semaphore */ sem_unlink(semname); printf("main end\n");

Exercice 3 Barrière de synchronisation Une barrière de synchronisation permet de garantir qu'un certain nombre de tâches aient passé un point spécifique. Ainsi, chaque tâches qui arrivera sur cette barrière devra attendre jusqu'à ce que le nombre spécifié de tâches arrivées à cette barrière soient atteint. Algorithme Pour réaliser une barrière de synchronisation, il faut disposer de deux sémaphores et d'une variable : Un sémaphore MUTEX (initialisé à 1) protégeant la variable. Un sémaphore ATTENTE (initialisé à 0) permettant de mettre en attente les tâches. Une variable Nb_Att (initialisée à 0) permettant de compter le nombre de tâches déjà arrivées à la barrière de synchronisation. Il faut encore définir la constante N qui indique le nombre de tâches devant arriver à la barrière avant de l'ouvrir. La barrière de synchronisation utilise l'algorithme suivant : Barriere : P(MUTEX) Nb_Att++ SI Nb_Att==N ALORS POUR I DE 1 à N- 1 FAIRE V(ATTENTE) FIN POUR Nb_Att=0 V(MUTEX) SINON V(MUTEX) P(ATTENTE) FIN SI Exemple d'utilisation Les barrières de synchronisation peuvent être utilisées pour Garantir qu'une ou plusieurs tâches ont effectué une opération particulière. Attendre la fin d'un ensemble de tâches. - Ecrivez un programme qui lance 10 threads qui ne font rien pendant un temps aléatoire (max 5 sec) et qui s'attendent grâce au mécanisme décrit ci- dessus.

Exercice 3 Problème du lecteur- rédacteur Le problème Supposons qu'une base de données ait des lecteurs et des rédacteurs, et qu'il faille programmer les lecteurs et les rédacteurs de cette base de données. Les contraintes sont les suivantes : plusieurs lecteurs doivent pouvoir lire la base de données en même temps ; si un rédacteur est en train de modifier la base de données, aucun autre utilisateur (ni rédacteur, ni même lecteur) ne doit pouvoir y accéder. Solutions Il est assez simple de faire en sorte que le rédacteur soit mis en attente tant qu'il y a encore des lecteurs. Mais cette solution présente de gros problèmes, si le flux de lecteurs est régulier, le rédacteur pourrait avoir à patienter un temps infini. Il existe donc une deuxième solution, qui consiste à mettre en attente tous les lecteurs ayant adressé leur demande d'accès après celle d'un rédacteur. Solution avec utilisation des sémaphores et priorité aux lecteurs La solution suivante permet de résoudre le problème des lecteurs et des rédacteurs en donnant priorité aux lecteurs. Cette solution nécessite trois sémaphores et une variable, à savoir : Un sémaphore M_Lect, initialisé à 1 qui permet de protéger la variable Lect. Il s'agit donc d'un mutex. Un sémaphore M_Red, initialisé à 1 qui permet de bloquer les tâches de rédaction. Il s'agit donc à nouveau d'un mutex. Un sémaphore Red, initialisé à 1 qui permet aussi de bloquer les tâches de rédaction. Une variable Lect qui compte le nombre de lecteurs. Cette solution utilise les quatre méthodes suivantes : Commencer une lecture Commencer_Lire : P(M_Lect) Lect++ SI Lect==1 ALORS P(Red) FIN SI V(M_Lect) Cette méthode incrémente le nombre de lecteurs. Ensuite, s'il s'agit du premier lecteur à essayer d'entrer, elle n'autorise l'entrée que s'il n'y a pas de rédaction en cours. Dans le cas contraire, la méthode doit attendre que la rédaction soit finie. L'utilisation de deux sémaphores pour les rédacteurs permet d'induire la priorité aux lecteurs. Finir une lecture Finir_Lire : P(M_Lect) Lect- - SI Lect==0 ALORS V(Red) FIN SI V(M_lect)

Cette méthode décrémente le nombre de lecteurs. Ensuite, s'il s'agit du dernier lecteur à sortir, elle autorise les rédacteurs à entrer (si nécessaire). Commencer une écriture Commencer_Ecrire P(M_Red) P(Red) Finir une écriture Finir_Ecrire V(Red) V(M_Red) Ecrivez un programme qui lance 10 threads lecteurs qui ne font rien pendant un temps aléatoire (max 5 sec) et qui viennent lire la donnée (un char déclaré en variable globale) au bout d'un certain temps (affichage de la donnée lue). Le programme lancera aussi 2 autres threads rédacteurs qui iront écrire dans la donnée une information aléatoire (la lettre A,B,C,D,E ou F) au bout d'un temps aléatoire. Les threads tourneront en boucle.