(Archi-2) d Exploitation. Sémaphores. Lecture Architecture des Systèmes d Exploitation

Documents pareils
Programmation système

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

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

Le prototype de la fonction main()

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

Arguments d un programme

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

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

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

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

Programmation système de commandes en C

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

Les processus. Système L3, /39

Architecture des ordinateurs

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours Programmation Système

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

Le traitement du temps

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 6 : Tubes anonymes et nommés

OS Réseaux et Programmation Système - C5

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

Programme Compte bancaire (code)

Programmation Classique en langage C

Programmation système en C/C++

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

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

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

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Chapitre 1 : La gestion dynamique de la mémoire

Introduction aux Systèmes et aux Réseaux

Introduction à la programmation concurrente

Introduction à la Programmation Parallèle: MPI

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


Cours de C. Allocation dynamique. Sébastien Paumier

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours de Systèmes d Exploitation

Introduction au langage C

Communication par sockets

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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 :

Programmation système I Les entrées/sorties

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

Programmation C. J.-F. Lalande. 15 novembre 2012

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

Le système de gestion des fichiers, les entrées/sorties.

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

Programmation en langage C

Lier Erlang avec d autres langages de programmation

Introduction au calcul parallèle avec OpenCL

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

TP Temps Réel. Polytech Paris - Mars 2012

Unix : Programmation Système

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

Structurer ses données : les tableaux. Introduction à la programmation

Les structures de données. Rajae El Ouazzani

Programmation C. Apprendre à développer des programmes simples dans le langage C

Premiers Pas en Programmation Objet : les Classes et les Objets

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

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

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

Les structures. Chapitre 3

Communication sous UNIX les sockets

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

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

Le langage C. Séance n 4

Les débordements de tampons et les vulnérabilités de chaîne de format 1

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

Gestion de la mémoire

Table des matières. Chapitre 4 : Variables pointeurs

INFO-F-404 : Techniques avancées de systèmes d exploitation

Rappels Entrées -Sorties

L exclusion mutuelle distribuée

Cours d Algorithmique et de Langage C v 3.0

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

INITIATION AU LANGAGE JAVA

Conventions d écriture et outils de mise au point

Gestion des processus

Corrigés des premiers exercices sur les classes

I. Introduction aux fonctions : les fonctions standards

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

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

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

INFO-F-105 Language de programmation I Séance VI

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

Problèmes liés à la concurrence

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

Programmation Réseau SSH et TLS (aka SSL)

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

Communication Interprocessus

Chapitre 10. Les interfaces Comparable et Comparator 1

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

IFT Systèmes d exploitation - TP n 1-20%

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

Transcription:

(Archi-2) Sémaphores Lecture 2007-2008 Institut Universitaire de Technologie de Montpellier (Archi-2).1

Les objectifs du cours sont : Comprendre les problèmes engendrés par la concurrence Comprendre le concept de Savoir utiliser les s en C sous Linux (Archi-2).2

La programmation dans un environnement multi-tâche nécessite la définition de sections critiques Une section critique est une section du programme qui ne sera exécutée par une seule séquence de contrôle (thread/tâche). La séquence de contrôle qui entre dans la section critique s assure de l exclusivité des ressources de la section critique. (Archi-2).3

Exemple procedure_retrait (retrait) : 1 x = lecture_solde() ; 2 x = x - retrait ; 3 enregistrer_solde(x) ; procedure_depot(depot) : 1 y = lecture_solde() ; 2 y = y + depot ; 3 enregistrer_solde(y) ; (Archi-2).4

Exemple d ordonnancement 1 1 x = lecture_solde() ; 2 x = x - retrait ; 3 enregistrer_solde(x) ; 4 >perte de la CPU< 5 6 1 2 3 4 y = lecture_solde() ; 5 y = y + depot ; 6 enregistrer_solde(y) ; (Archi-2).5

Exemple d ordonnancement 2 1 x = lecture_solde() ; 2 x = x - retrait ; 3 >perte de la CPU< 4 5 6 enregistrer_solde(x) ; 1 2 3 y = lecture_solde() ; 4 y = y + depot ; 5 enregistrer_solde(y) ; 6 >perte de la CPU< (Archi-2).6

Comprendre le problème Nous avons besoin de définir une section critique pour n autoriser qu une seule séquence d exécution La section critique dans l exemple précédant se trouve entre la lecture du solde et sa sauvegarde (Archi-2).7

La solution Pour se prémunir des problèmes causés par l accès concurrent à des ressources partagées nous allons : définir un mécanisme à base de jeton(s) seule la séquence d exécution qui s octroie un jeton peut accéder à la section critique (Archi-2).8

Edsger Dijkstra On peut réaliser ce mécanisme de plusieurs façons (plus ou moins faciles à utiliser) Edsger Dijkstra a défini le concept de qui est très général et très facile à utiliser (Archi-2).9

C est quoi un On peut comprendre le comme une variable spéciale sur laquelle on peut effectuer deux opérations : 1 P(sem) (Puis-je y aller?) 2 V(sem) (Vas-y!) (Archi-2).10

Sémaphore Le le plus simple est un binaire qui peut donc prendre deux valeurs : 0 ou 1. Les s qui peuvent prendre des valeurs > 1 sont appelés des s généralisé (Archi-2).11

Algorithme de P() et V() Si sem est une variable alors : P(sem) : Si sem > 0, décrémenter sem. Si sem = 0 alors suspendre l activité de la séquence de contrôle appelante. V(sem) : Si un processus a été suspendu en attendant sem alors reprendre son activité. Si aucun processus n est suspendu alors incrémenter sem. (Archi-2).12

Revenons sur notre exemple On rajoute le sem initialisé à 1. procedure_retrait (retrait) : procedure_depot(depot) : 1 P(sem) ; 1 P(sem) ; 2 x = lecture_solde() ; 2 y = lecture_solde() ; 3 x = x - retrait ; 3 y = y + depot ; 4 enregistrer_solde(x) ; 4 enregistrer_solde(y) ; 5 V(sem) ; 5 V(sem) ; (Archi-2).13

exemple d ordonnancement 2 avec 1 P(sem) ; 2 x = lecture_solde() ; 3 x = x - retrait ; 4 >perte de la CPU< 5 6 7 enregistrer_solde(x) ; 8 V(sem) ; 1 2 3 4 P(sem) ; 5 >suspension du processus< 6 7 8 9 y = lecture_solde() ; 10 y = y + depot ; 11 enregistrer_solde(y) ; 12 V(sem) ; (Archi-2).14

Sémaphore Linux Nous allons maintenant voir comment programmer concrètement avec les s sous Linux Attention : Les fonctions s de Linux opèrent sur des tableaux de s (Archi-2).15

Sémaphore Linux #include <sys/sem.h> int semctl(int sem_id, int sem_num, int command,...); int semget(key_t key, int num_sems, int sem_flags); int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops); Signatures des fonctions de gestion des s Linux. (Archi-2).16

semget int semget(key_t key, int num_sems, int sem_flags); Cette fonction permet de créer un et de retourner un identifiant local (une sorte de descripteur pour le ) key : ce paramètre représente une clé qui permet à plusieurs processus indépendants de parler du même. Si on chercher à créer un interne au processus (entre threads) il faut mettre : IPC_PRIVATE num_sems : nombre de s désirés (1 en général) sem_flags : des drapeaux pour spécifier des droits sur le. On peut également rajouter des drapeaux comme : 0666 IPC_CREAT pour demander création du s il n existe pas ; 0666 IPC_CREAT IPC_EXCL pour préciser la création d un nouveau qui ne doit pas déjà exister. (Archi-2).17

semop int semop(int sem_id, struct sembuf *sem_ops,\ size_t num_sem_ops); Cette fonction est utilisée pour changer la valeur du. sem_id : est l identifiant retourné par semget sem_ops : un pointeur vers un tableau de structures qui précise l opération à effectuer num_sem_ops : nombre d opérations dans le tableau. (Archi-2).18

struct sembuf struct sembuf { short sem_num; short sem_op; short sem_flg; Cette structure précise les opérations qu il faut effectuer sur un. sem_num : précise le numéro du dans le tableau. sem_op : la valeur par laquelle modifier le : -1 correspond à P() et +1 correspond à V(). sem_flg : on mettra ce flag à SEM_UNDO pour que le système d exploitation puisse relâcher le si le processus se termine sans le libérer. (Archi-2).19

xxx int semctl(int sem_id, int sem_num, int command,...); Cette fonction permet un contrôle direct du. sem_id : l identifiant du retourné par semget sem_num : l indice du dans le tableau de s command : une commande... : un argument de la commande qui est une union. (Archi-2).20

union semun La structure de l union qui représente l argument de la commande doit contenir au moins : union semun { int val; struct semid_ds *buf; unsigned short *array; (Archi-2).21

Les commandes de semctl On dispose de plusieurs commandes, mais on ne présentera ici que deux : SETVAL : initialise un avec une valeur. On utilisera le champs val dans l union. Attention : L initialisation d un est une étape très importante! IPC_RMID : utilisé pour effacer/libérer l identifiant d un. Pour les commandes SETVAL et IPC_RMID, la fonction semctl retourne 0 en cas de succès et -1 en cas d erreur. (Archi-2).22

Exemple de fonction générique : initialisation int semaphore_init(int semid, { union semun sem_union; sem_union.val = val; int num, int val) if (semctl(semid, num, SETVAL, sem_union) == -1) return(0); return(1); (Archi-2).23

Exemple de fonction générique : libération void semaphore_liberer(int sem_id) { union semun sem_union; if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1) { fprintf(stderr, "Erreur d effacement du semaphore\n"); (Archi-2).24

Exemple de fonction générique : opération P() int semaphore_p(int sem_id, int num) { struct sembuf sem_b; sem_b.sem_num = num; sem_b.sem_op = -1; /* Je fais un Puis-je */ sem_b.sem_flg = SEM_UNDO; if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "erreur de semaphore_p\n"); return(0); return(1); (Archi-2).25

Exemple de fonction générique : opération V() int semaphore_v(int sem_id, int num) { struct sembuf sem_b; sem_b.sem_num = num; sem_b.sem_op = 1; /* Je fais un Vas-y */ sem_b.sem_flg = SEM_UNDO; if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "erreur de semaphore_v\n"); return(0); return(1); (Archi-2).26

Exemple #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/sem.h> #include "semaphore.h" #define CLE_SEMAPHORE 1234 int main(int argc, char *argv[]) { int i, temps_pause,semid; char open_char = ( ; char close_char = ) ; //demande de creation d un semaphore. //si le semaphore existe semget retourne egalement sans erreur. semid = semget((key_t)cle_semaphore, 1, 0666 IPC_CREAT); //Initialisation du semaphore if (!semaphore_init(semid,0,1)) { fprintf(stderr, "Erreur\n"); exit(exit_failure); i = fork();... (Archi-2).27

Exemple... if(i==0){//je suis le fils. //initialisation du generateur aleatoire srand((unsigned int)getpid()); open_char = { ; close_char = ; for(i = 0; i < 10; i++) { if (!semaphore_p(semid,0)) { exit(exit_failure); printf("%c", open_char); fflush(stdout); temps_pause = rand() % 3; sleep(temps_pause); printf("%c", close_char); fflush(stdout); if (!semaphore_v(semid,0)) exit(exit_failure); temps_pause = rand() % 2; sleep(temps_pause);... (Archi-2).28

Exemple... else{//le pere srand((unsigned int)getpid()); for(i = 0; i < 10; i++) { if (!semaphore_p(semid,0)) {exit(exit_failure); printf("%c", open_char); fflush(stdout); temps_pause = rand() % 3; sleep(temps_pause); printf("%c", close_char); fflush(stdout); if (!semaphore_v(semid,0)) exit(exit_failure); temps_pause = rand() % 2; sleep(temps_pause); sleep(10); semaphore_liberer(semid); (Archi-2).29