typedef... sem_t ; void sem_init(sem_t *s, int value); void P(sem_t *s); void V(sem_t *s);

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

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

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Introduction à la programmation concurrente

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

Les structures de données. Rajae El Ouazzani

Problèmes liés à la concurrence

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.

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

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

Synchro et Threads Java TM

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

Programmation système

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

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

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

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

Conventions d écriture et outils de mise au point

Programmation système en C/C++

INITIATION AU LANGAGE JAVA

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

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

Les arbres binaires de recherche

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

Introduction à la Programmation Parallèle: MPI

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Cours de C. Allocation dynamique. Sébastien Paumier

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

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

Cours de Systèmes d Exploitation

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

as Architecture des Systèmes d Information

OS Réseaux et Programmation Système - C5

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

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

Cours Programmation Système

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

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.

Programmer en JAVA. par Tama

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

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

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

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

Un ordonnanceur stupide

Premiers Pas en Programmation Objet : les Classes et les Objets

Algorithmique, Structures de données et langage C

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

Programme Compte bancaire (code)

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Corrigé des exercices sur les références

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

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

Introduction aux Systèmes et aux Réseaux

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

Chapitre 4 : Outils de communication centralisés entre processus

TP Temps Réel. Polytech Paris - Mars 2012

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

Environnements de développement (intégrés)

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

Les structures. Chapitre 3

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

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

Licence Sciences et Technologies Examen janvier 2010

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

Playing with ptrace() for fun and profit

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction


Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

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)

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

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

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

Cours 1: Java et les objets

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Programmation Par Objets

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Initiation. àl algorithmique et à la programmation. en C

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

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

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

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

Introduction au langage C

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

Projet de programmation (IK3) : TP n 1 Correction

Derrière toi Une machine virtuelle!

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

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

Analyse de sécurité de logiciels système par typage statique

Notion de thread (1/2)

2. Comprendre les définitions de classes

Systèmes temps-réel. Plan général. Matthieu Herrb. Mars Introduction - concepts généraux

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

Programmation impérative

Threads. Threads. USTL routier 1

Transcription:

1 Gestion Mémoire On considère un système de pagination à deux niveaux : les adresses (virtuelles et physiques) sont codées sur 32 bits ; les n 1 premiers bits d une adresse virtuelle forment le premier index, les n 2 bits suivants forment le second index (n 1 + n 2 = 20), et les 12 bits restant forment le déplacement ; on suppose que chacune des entrées de ces tables occupe 32 bits. Question 1 Discutez des avantages/inconvénients d une configuration où n 1 serait très petit par rapport à n 2. Même question dans le cas contraire. Correction Si n 1 est très petit, alors la table de premier niveau contient peu d entrées, au contraire des tables de second niveau qui sont grandes. Le problème posé par cette configuration est qu il sera peu probable d économiser de la place en évitant l allocation d une tableau de second niveau, puisqu il faudrait pour cela qu un processus possède un «trou» dans son espace d adressage de 2 n2+12 octets. D un autre côté, si n 2 est vraiment trop petit, on va certes économiser de la place en allouant peu de tables de second niveau pour les processus qui possèdent des trous, mais la table de premier niveau (toujours allouée) sera plus imposante Question 2 Donnez une condition sur l adresse de début et la taille des «trous» dans l espace d adressage d un processus pour que l économie mémoire faite en utilisant ce tableau à deux niveaux soit maximale. Expliquez à l aide d un dessin. En fixant n 1 = n 2 = 10, chiffrez l économie mémoire réalisée par rapport à une table des pages à un seul niveau dans le cas d un processus ayant un seul trou d un gigaoctet (2 30 octets) dans son espace d adressage. Correction Pour que l économie soit maximale, il faut qu un «trou» coïncide avec l ensemble des adresses couvertes par une table de second niveau. Cela concerne les trous qui commencent à une adresse multiple de 2 n2+12 et qui ont donc une taille multiple de 2 n2+12. En supposant n 1 = n 2 = 10, un trou d un gigaoctet (2 30 octets) occupe 2 8 = 256 tables de second niveau (qui couvrent chacune 2 22 octets = 4Mo) s il est bien aligné, puisque 2 30 = 2 8 2 22. Comme une table de second niveau occupe 2 10 entrées de 4 octets chacune (ce qui fait donc 4Ko par table), on économise 256 4Ko = 1Mo. Si on veut mesurer l économie par rapport à une table à un seul niveau, il faut décompter l espace occupé par la table de premier niveau, qui «pèse» 4Ko. Au final, l économie est donc de 1Mo 4Ko. 2 Synchronisations entre threads On souhaite implanter certaines synchronisations internes de la bibliothèque «Pthreads» à l aide de sémaphores. Dans cet exercice, on s appuiera sur la disponibilité des définitions suivantes : typedef sem_t ; void sem_init(sem_t *s, int value); void P(sem_t *s); void V(sem_t *s); Concrètement, il s agit dans un premier temps de réaliser la partie synchronisante des fonctions pthread_ exit et pthread_join. Pour rappel, pthread_join(pid) est une fonction qui bloque le thread appelant tant que le thread pid ne s est pas terminé, et qui permet de récupérer son code de retour (de type void *). Lorqu un thread «non détaché» 1 se termine, il doit attendre (à l intérieur de pthread_exit) qu un thread 1 C est-à-dire dont la terminaison devra être récupérée par pthread_join. 1

appelle pthread_join avant de pouvoir disparaître. Dans cet exercice, on ne se préoccupera pas de la gestion des cas d erreur (par exemple deux threads qui appeleraient pthread_join sur un même thread). Dans les systèmes conformes à la norme Pthreads, un thread est manipulé par l intermédiaire d un objet de type pthread_t. Dans notre implémentation, cet objet est un pointeur sur un descripteur pthread_desc_t dans lequel sont stockées toutes les données propres au thread. Ce descripteur est donc l équivalent de la classe Thread dans Nachos Les définitions de type ainsi que les squelettes des fonctions pthread_create, pthread_exit et pthread_ join sont donnés en figure 1. typedef struct int detached; pthread_desc_t; typedef pthread_desc_t *pthread_t; void pthread_create(pthread_t *pid, ) // Allocation et initialisation du descripteur *pid = (pthread_desc_t *)alloc_desc(); (*pid)->detached = ; // Initialisation des variables de synchro pthread_init(*pid); // Lancement du thread void pthread_exit(void *status) if(!pthread_self()->detached) pthread_exit(status); // Destruction des ressources // (pile, descripteur, etc.) void pthread_join(pthread_t pid, void **status) if(pid->detached) // Erreur! else void *r = pthread_join(pid); if(status!= NULL) *status = r; Fig. 1 Squelette des fonctions Pthreads Question 1 Pour réaliser la synchronisation nécessaire au sein de pthread_join et pthread_exit, il suffit de fournir le code des fonctions suivantes : void pthread_init(pthread_t pid); void pthread_exit(void *status); void * pthread_join(pthread_t pid); N oubliez pas de préciser les champs que vous aurez besoin d ajouter dans la structure pthread_desc_t. Correction 2

typedef struct int detached; sem_t child, father; void *status; pthread_desc_t; void pthread_init(pthread_t pid) sem_init(&pid->child, 0); sem_init(&pid->father, 0); void pthread_exit(void *status) pthread_self()->status = status; V(&pthread_self()->father); // Attention! Il faut attendre que le père ait récupéré // le résultat avant de se suicider P(&pthread_self()->child); void * pthread_join(pthread_t pid) void *status; P(&pid->father); status = pid->status; V(&pid->child); return status; Question 2 On considère maintenant que le programme principal se termine toujours par un appel à pthread_end(void) (dans la fonction main) qui doit être bloquant tant que certains threads s exécutent encore au sein du processus (y-compris les threads détachés). Ecrivez le code de la fonction pthread_end et donnez également la nouvelle version des fonctions pthread_init et pthread_exit. Vous aurez également besoin de déclarer quelques variables supplémentaires Correction 3

sem_t mutex; // initialisé à 1 sem_t wait_end; // initialisé à 0 int nb_threads; // initialisé à 0 void pthread_init(pthread_t pid) sem_init(&pid->child, 0); sem_init(&pid->father, 0); nb_threads++; void pthread_exit(void *status) pthread_self()->status = status; V(&pthread_self()->father); P(&pthread_self()->child); // Il faut signaler qu il y a un thread de moins nb_threads--; V(&wait_end); void pthread_end(void) while(1) if (nb_threads == 0) return; P(&wait_end); Question 3 L interface Pthreads propose une primitive pthread_cancel(pid) permettant de provoquer la terminaison d un thread (similaire à kill pour les processus). Que risque-t-il de se passer si on tue brutalement un thread non détaché? Expliquez comment 2 il faudrait implémenter la primitive pthread_cancel pour que pthread_join renvoie quand même un résultat dans cette situation? Correction Si on tue brutalement un thread non détaché, il disparaîtra et non seulement il ne pourra jamais débloquer un éventuel processus qui tenterait un pthread_join sur lui, mais en plus son descripteur lui-même ne serait plus valide (donc impossible d accéder aux champs pid->). Pour implanter proprement pthread_cancel, une solution serait d envoyer un signal au thread victime pour le forcer à exécuter pthread_exit. Ainsi, le thread ne disparaîtra pas s il n est pas détaché : il attendra 2 On ne demande pas d écrire du code 4

(sur P(&pthread->self()->child) que quelqu un le rejoigne au moyen de pthread_join. Ce sera un thread «zombie» en quelque sorte 5