Les sémaphores et leur implémentation



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

Cours de Systèmes d Exploitation

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

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

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Problèmes liés à la concurrence

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

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

Introduction à la programmation concurrente

Représentation d un entier en base b

GPA770 Microélectronique appliquée Exercices série A

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

Java Licence Professionnelle CISII,

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

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

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

Architecture des ordinateurs

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Concept de machine virtuelle

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

Assembleur. Faculté I&C, André Maurer, Claude Petitpierre

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

KL5121. Pour activer des sorties en fonction de la position d'un codeur

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)

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

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

Introduction aux Systèmes et aux Réseaux

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

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

Synchro et Threads Java TM

TP : Gestion d une image au format PGM

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

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

Introduction à la Programmation Parallèle: MPI

Croisière au cœur d un OS Étape 4 : Mise en place de la pagination

Compilation (INF 564)

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

Conception de circuits numériques et architecture des ordinateurs

Programmation système en C/C++

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INITIATION AU LANGAGE JAVA


Les structures de données. Rajae El Ouazzani

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

as Architecture des Systèmes d Information

Programmer en JAVA. par Tama

Qu'est-ce qu'un processus: Définitions

Rappels d architecture

Programmation système de commandes en C

Gestion mémoire et Représentation intermédiaire

Ordinateurs, Structure et Applications

Java Licence Professionnelle CISII,

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

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

Playing with ptrace() for fun and profit

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

Conception des systèmes répartis

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

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Structure fonctionnelle d un SGBD

Programmation Classique en langage C

1 Lecture de fichiers

Licence Sciences et Technologies Examen janvier 2010

Programmation impérative

Cours Programmation Système

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

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

Claude Delannoy. 3 e édition C++

Impact des robots d indexation sur le cache de second niveau de SPIP IMBERTI Christophe - SG/SPSSI/CP2I/DO Ouest 06/06/2012 mis à jour le 05/07/2012

gestion des processus La gestion des processus

Cours 1 : La compilation

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

Recherche dans un tableau

Chapitre 4 : Exclusion mutuelle

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

Programmation assembleur : aperçu

Conventions d écriture et outils de mise au point

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Présentation du PL/SQL

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

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Mesure de performances. [Architecture des ordinateurs, Hennessy & Patterson, 1996]

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

Notions fondamentales du langage C# Version 1.0

PROJET ALGORITHMIQUE ET PROGRAMMATION II

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

Manuel programmation QUESTOR

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

Introduction à MATLAB R

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

PROJET 1 : BASE DE DONNÉES REPARTIES

Introduction au langage C

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

IV- Comment fonctionne un ordinateur?

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

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

Transcription:

Rappel :Le concept de sémaphore Un sémaphore est une variable entière partagée. Sa valeur est positive ou nulle et elle est uniquement manipulable à l aide de deux opérations wait(s) et signal(s), où s est un identificateur désignant le sémaphore. Les sémaphores et leur implémentation wait(s) décrémente s si s > 0 ; si non, le processus exécutant l opération wait(s) est mis en attente. signal(s) incrémente s. L exécution de signal(s) peut avoir pour effet (pas nécessairement immédiat) qu un processus en attente sur le sémaphore s reprend son exécution. L exécution d une opération wait(s) ou signal(s) se fait sans interaction possible (de façon atomique). 1 2 L implémentation des sémaphores L exclusion mutuelle à l aide de sémaphores Les sémaphores permettent une implémentation très simple de l exclusion mutuelle. Processus 1 : while (True) { nc1: /* section non critique */ ; crit1: /* section critique */ ; semaphore s = 1; Processus 2 : while (True) { nc2: /* section non critique */ crit2: /* section critique */ signal(s) Les sémaphores sont implémentés dans le noyau du système. Lesvaleursdessémaphores se trouvent dans une table conservée dans la mémoire du noyau. Un sémaphore est caractérisé parson numéro qui correspond à une position dans cette table. Il y a des appels systèmes pour créer ou libérer un sémaphore, ainsi que pour exécuter les opérations wait et signal. CesOpérations sont exécutées en mode superviseur et donc de façon indivisible (les interruptions sont interdites en mode superviseur). Dans ULg03, pour exécuter par exemple une opération wait, onplace sur la pile les arguments de l appel système, à savoir le numéro du sémaphore et un code WAIT identifiant l opération. Supposant que le numérodusémaphore a été placée en r0, celaseréalise comme suit. PUSH(r0) 2ième argument CMOVE(WAIT,r1) 1er argument PUSH(r1) SVC() appel système 3 4

Le handler de SVC Avant de détailler les handler des opération sur les sémaphores, examinons le handler général nécessaire pour l instruction SVC. On y accède par le stub suivant. Le handler de SVC (suite) h_stub: ST(r0, User, r31) sauver ST(r1, User+4, r31) les registres... ST(r30, User+30*4, r31) CMOVE(KStack, SP) Charger le SP du système BR(Svc_handler,LP) Appel du Handler LD(r31, User, r0) restaurer LD(r31, User+4, r1) LD(r31, User+30*4, r30) JMP(XP) retour à l application Le programme Svc_handler identifie la nature de l appel et passe la main à la routine correspondante. Une difficulté est que les arguments de SVC se trouvent sur la pile du processus ayant fait l appel, dans son espace virtuel. Il faut donc traduire ces adresses avant de les utiliser. Il faut noter que l adresse sauvée dans XP est celle de l instruction qui suit SVC. 5 6 Le handler de SVC : les structures de données Les structures de données utilisées par le noyau sont les suivantes. struct Mstate { int R0;..., R30; User; /* l état sauvé du processus courant */ struct PTentry {short valid, resid ; int PhysPage;; /* Une entrée dans la table des pages */ struct PTentry PageMap[262144]; /* La table des pages du processus courant, 2^18 entrées */ struct PD {struct Mstate state ; int status, semwait ; struct PTentry PageMap[262144]; Proctbl[N]; /* La table des processus avec table des pages, statut et adresse d un semaphore bloquant éventuel */ int sem[k]; /* la table des valeurs des sémaphores */ int Cur; /* l index du processus courant */ Le handler de SVC : la traduction des adresses virtuelles Pour avoir accès à la pile du processus ayant exécuté le SVC, le système doit traduire en adresse physique, l adresse contenue dans r29 (SP). En effet, même si la cache de table des pages est à jour, la traduction ne se fait pas au niveau matériel puisque l on est en mode superviseur. Cette traduction peut se faire comme suit. int Vmap(int Vaddress) { int VpageNo, PageNo, Offset; VpageNo = Vaddress>>14; Offset = Vaddress & 16383; if (PageMap[VpageNo].valid == 0 PageMap[VpageNo].resid == 0) Pagerror(VpageNo); PageNo = PageMap[VpageNo].PhysPage ; return((pageno<<14) Offset); 7 8

Le handler de SVC : structure générale Le handler de SVC extraitlecodecaractérisant l appel et passe la main à la fonction correspondante. Svc_handler() { int code; code = *Vmap(User.R29-4) switch (code) {... case WAIT : Wait_h(*Vmap(User.R29-8)); break; case SIGNAL : Signal_h(*Vmap(User.R29-8)); break;... Les adresses des arguments de l appel système ne sont pas calculés exactement comme dans le cas d un appel de procédure car, dans le cas de l appel système rien n est ajouté à la pile du processus appelant après l appel. Les handlers Wait_h et Signal_h : première version Wait_h(int semno) { if (sem[semno] <= 0) { User.R30 = User.R30-4; /* SVC sera réexécuté */ Proctbl[Cur].status = WAIT; Proctbl[Cur].semwait = semno; scheduler(); else sem[semno] = sem[semno] - 1; Lorsque le sémaphore n est pas positif, le processus est mis en attente ; il réexécutera l instruction SVC lorsqu il sera réactivé. 9 10 Signal_h(int semno) { for (i = 0; i<n; i++) { if (Proctbl[i].status == WAIT && Proctbl[i].semwait == semno) Proctbl[i].status = RUN; sem[semno] = sem[semno] + 1; Les processus en attente sur le sémaphore sont réactivés et le sémaphore est incrémenté. Tous les processus en attente réexécuteront l appel système wait ;celui qui trouvera le sémaphore non nul peut être n importe lequel. Dans le cadre de l exclusion mutuelle cette implémentation ne garantit pas que chaque processus aura accès à sa section critique. Les handlers Wait_h et Signal_h : deuxième version Wait_h(int semno) { if (sem[semno] <= 0) { Proctbl[Cur].status = WAIT; Proctbl[Cur].semwait = semno; scheduler(); else sem[semno] = sem[semno] - 1; L appel système n est pas réexécuté lorsqu un processus sort de son état d attente. En effet, le handler de signal va se charger de réactiver un processus en attente s il y en a un, sans passer par l incrémentation et la décrémentation du sémaphore. 11 12

Signal_h(int semno) { int i,wokeup = 0; for (i = 0; i<n; i++) { if (Proctbl[i].status == WAIT && Proctbl[i].semwait == semno) { Proctbl[i].status = RUN; wokeup = 1; break; if (wokeup == 0) sem[semno] = sem[semno] + 1; Cette implémentation garantit que, si seuls deux processus utilisent le sémaphore, aucun ne restera indéfiniment en attente. L implémentation des sémaphores sur une machine à plusieurs processeurs Sur une machine à plusieurs processeurs, même l exécution en mode superviseur ne garantit pas l exclusion mutuelle puisqu elle peut simultanément avoir lieu sur plus d un processeur. Il faut donc recourir à un autre mécanisme pour implémenter l exclusion mutuelle. L accès atomique à la mémoire en lecture ou en écriture n est pas suffisant pour une réalisation pratique. Une implémentation équitable pour plus de deux processus utilisera une file d attente par sémaphore pour gérer les processus en attente. On introduit donc une instruction spéciale qui permet de lire et modifier la mémoire de façon indivisible. 13 14 Le microcode de TCLR L instruction Test and Clear Cette instruction copie un mot mémoire dans un registre et le met à0. TCLR(Ra,literal,Rc) : PC PC + 4 EA Reg[Ra] + SEXT(literal) Reg[Rc] Mem[EA] Mem[EA] 0 On lui attribue le code opératoire 0x04.macro TCLR(Ra,Lit,Rc) ENC_LIT(0b000100,Ra,Rc,Lit) TCLR(Ra, Literal, Rc) (mode superviseur) Opcode = 000100 IRQ = * PC31 = 1 Phase Fl. Latch UC/D ALU LD DR PC+ SVR flags F,C in,m SEL SEL 00000 * 1 0 000000 0011 0001 0 0 SMAR <- Ra 00001 * 1 0 000000 0001 0100 0 0 A <- SRAM 00010 * 1 0 000000 0010 0010 0 0 B <- Lit 00011 * 1 0 000000 0011 0000 0 0 SMAR <- Rc 00100 * 1 0 100110 0100 0011 0 0 DMAR <- A+B 00101 * 1 0 000000 0101 0101 0 0 SRAM <- DRAM 00110 * 1 0 001101 0110 0011 0 0 DRAM <- 0 00111 * 1 0 000000 0100 0110 1 0 DMAR <- PC; PC+ 01000 * 1 0 000000 0000 0101 0 0 INSTREG <- DRAM 15 16

L exclusion mutuelle à l aide de TCLR L exclusion mutuelle se réalise très simplement à l aide de TCLR. wait: TCLR(r31,lock,r0) BEQ(r0,wait)... section critique... CMOVE(1,r0) ST(r0,lock,r31) Cette implémentation implique une attente active et ne garantit pas l équité entre les processus en attente. On ne l utilise pas telle quelle pour gérer l exclusion mutuelle en général, mais elle est parfaitement adéquate pour implémenter les sémaphores sur une machine à plusieurs processeurs. Le Problème de la zone tampon(buffer) ou problème du producteur et consommateur Un processus Producteur envoie un flux d informations à un processus Consommateur. Une zone tampon est utilisée pour faire transiter ce flux d informations. Elle est modélisée par un tableau en mémoire partagée utilisé à l aide de deux fonctions (append et take). { buf[in]= v; int in = 0, out = 0; Telles quelles, ces opérations permettent d écrire dans une zone tampon pleine ou de lire dans un zone vide : il faut les synchroniser. 17 18 Le problèmedelazonetampon: Synchronisation du consommateur Pour éviter que le consommateur ne prenne d éléments dans une zone vide, on utilise un sémaphore qui compte le nombre d éléments dans le tampon. int in, out = 0; semaphore n = 0; Le problèmedelazonetampon: Synchronisation du consommateur et du producteur Un deuxième sémaphore, initialisé au nombre de places vides dans le tampon permet de synchroniser le producteur. int in, out = 0; semaphore n = 0, e = N; { buf[in]= v; signal(n); wait(n); Il faut encore limiter le producteur lorsque le tampon est plein. { wait(e); buf[in]= v; signal(n); wait(n); signal(e); 19 20

Le problèmedelazonetampon: Exclusion mutuelle des opérations S il y a plusieurs producteurs ou consommateurs, il faut encore assurer l exclusion mutuelle des opérations de manipulation du tampon. Un sémaphore additionnel le permet. int in, out = 0; semaphore n = 0, e = N, s = 1; { wait(e); buf[in] = v; signal(n); wait(n); signal(e); Les sémaphores binaires Un sémaphore binaire est un sémaphore dont la valeur est limitée à0 et 1. Ce type de sémaphore permet de gérer la mise en attente de processus, mais pas de compter. Un sémaphore général peut toutefois être simulé par un sémaphore binaire et un compteur. Il peut toutefois y avoir quelques difficultés liées au découplage du sémaphore et du compteur. 21 22 La zone tampon avec sémaphores binaires { if (count == N) { wait(e); buf[in] = v; in = (in+1)%n; count = count+1; if (count == 1) signal(n); int in = 0, out = 0, count = 0; semaphore n = 0, e = 0, s = 1; if (count == O) { wait(n); out = (out+1)%n; count = count-1; if (count == N-1) signal(e); Solution incorrecte car on peut exécuter append; take; take. Le problème est que l on signale deux fois la présence d un élément : en mettant count à 1 et par l opération signal(n). La zone tampon avec sémaphores binaires : Solutionpourunproducteuretunconsommateur int in = 0, out = 0, count = 0; int ewait = 0,nwait = 0; semaphore n = 0, e = 0, s = 1; { if (count == N) { ewait = 1; wait(e);ewait = 0; buf[in] = v; in = (in+1)%n; count = count+1; if (nwait > 0) signal(n); if (count == O) { nwait = 1; wait(n);nwait = 0; out = (out+1)%n; count = count-1; if (ewait > 0) signal(e); 23 24

La zone tampon avec sémaphores binaires : Solution pour plusieurs producteurs et consommateurs Pour éviter la double signalisation, on n exécute signal(n) ou signal(e) que s il y a un processus en attente. On peut imaginer d étendre cette solution à plusieurs producteurs et consommateurs en comptant le nombre de processus en attente. Toutefois, il faut éviter que, par exemple, un deuxième consommateur ne dépasse un consommateur qui vient d être libéré et ne consomme l élément destiné à ce dernier. Cela peut se faire en transférant l exclusion mutuelle au processus libéré. { if (count == N) { ewait++;wait(e); ewait--; buf[in] = v;in = (in+1)%n; count = count+1; if (nwait > 0) signal(n); else int in = 0, out = 0, count = 0; int ewait = 0,nwait = 0; semaphore n = 0, e = 0, s = 1; if (count == O) { nwait++; wait(n); nwait--; out = (out+1)%n; count = count-1; if (ewait > 0) signal(e); else 25 26 Conclusions sur les sémaphores Les sémaphores sont un excellent mécanisme pour gérer la mise en attente de processus. Lorsqu il faut gérer la mise en attente en combinaison avec la manipulation d un compteur, les sémaphores sont très bien adaptés. L utilisation des sémaphores binaires indique quelles difficultés apparaissent lorsque l on combine l attente implémentée par un sémaphore avec la manipulation d une autre structure de donnée. Il serait intéressant d avoir une solution systématique pour gérer ce type de problème. 27