Vous êtes sur la page 1sur 50
C C o o u u r r s s d d e e F

CCoouurrss ddee

FFoonnddeemmeenntt ddeess SSyyssttèèmmeess ddEExxppllooiittaattiioonn

Réalisé par :

KHAYATI NIZAR

Ecole Supérieure de Commerce Electronique Manouba

2004 - 2005

Sommaire :

Chapitre 1 : Introduction aux systèmes d’exploitation Chapitre 2 : La gestion des processus Chapitre 3 : La synchronisation des processus Chapitre 4 : La gestion de la mémoire centrale Chapitre 5 : Conception des systèmes de gestion de la mémoire centrale Chapitre 6 : Systèmes de gestion des fichiers Chapitre 7 : Le système des entrées-Sorties

Bibliographie :

« Au Cœur des Systèmes d’Exploitation des Ordinateurs : Concepts

de

base

et

Exercices

Résolus »

Publications universitaire 2003.

Leila

Baccouche,

Centre

de

« Principes des Systèmes d’Exploitation » Mohamed Said Ouerghi,

Centre de Publications universitaire 2003.

Chapitre 1 :

Introduction aux systèmes d’exploitation

1 Pourquoi un système d'exploitation ?

Le système d’exploitation est un intermédiaire entre la machine et l’utilisateur Avant l'avènement des systèmes d'exploitation, la conception d'un programme nécessitait la connaissance parfaite du mode de fonctionnement de la machine. Le programmeur devait gérer au moindre détail le placement des programmes en mémoire en utilisant directement les adresses, l'exécution au niveau du processeur à savoir le chargement et la terminaison des programmes, l'affichage sur l'écran des résultats, etc.

Cette tache étant très complexe, peu de programmes pouvaient être développés. Pour résoudre ce problème, une couche de logiciel était développée pour enrober le matériel et le présenter aux programmeurs comme une machine virtuelle plus facile à comprendre et à utiliser.

Le système d'exploitation est un gestionnaire de ressources, c'est à dire qu'il contrôle l'accès à toutes les ressources de la machine, l'attribution de ces ressources aux différents utilisateurs et la libération de ces ressources lorsqu'elles ne sont plus utilisées.

2 Historique des systèmes d'exploitation

Ce n'est qu'au XVIIe siècle qu'apparaissent les premières machines à calculer. Le mathématicien, penseur et écrivain Blaise Pascal met au point en 1642 (à l'age de 19 ans) une machine qu'il appelle Pascaline, capable d'effectuer l'addition et la soustraction.

Ensuite en 1673, G.W. LEIBNIZ (mathématicien allemand) met au point la première calculatrice du monde capable de réaliser les 4 opérations. La multiplication et la division, s'effectuaient respectivement par additions et soustractions répétées.

Charles BABBAGE (mathématicien anglais à l'université de Cambridge) conçoit en 1822 la machine à différences qui doit évaluer n'importe quelle fonction au moyen de différences finies. Onze ans plus tard, il se lance dans la construction de sa machine analytique, capable d'enchaîner des opérations arithmétiques de façon autonome. Cette première réalisation était entièrement mécanique. Elle comportait une mémoire, une unité de calcul et utilisait les cartes perforées pour les entrées/sorties.

Ada Augusta King, comtesse de Lovelace et fille du grand poète Lord Byron, documente le travail de Babbage et écrit des algorithmes pour la machine analytique. C'est en son honneur qu'a été nommé le langage de programmation ADA (dérivé du PASCAL) conçu par un ingénieur français à Bull en 1979.

En 1847, Georges BOOLE (mathématicien anglais) élabore la logique algébrique moderne, laquelle servira ultérieurement à l'élaboration des langages informatiques actuels.

En 1890, Herman HOLLERITH (statisticien américain), met au point une machine à cartes perforées pour le recensement de la population. La compagnie que crée Hollerith en 1896 pour fabriquer ces machines, Tabulating Machine Compagny, devient en 1924 la compagnie IBM (International Business Machines).

2.1 La première génération (1945-1955) : Prototypes d'ordinateurs a base de tubes électroniques à vide

Le plus connu des ordinateurs non mécaniques est l'ENIAC (Electronic Numerical Integrator And Computer). Il a été mis au point de 1943 à 1946. Il pèse 30 tonnes, occupe quelques dizaines de m2, comporte 18 000 tubes à vide, et nécessite 140 KW d'énergie. Il est capable d'effectuer 5000 additions à la seconde. Il avait été conçu dans le but d'effectuer des calculs pour l'armée américaine pendant la guerre, mais fut terminé trop tard. Il servit après la guerre aux calculs pour la bombe N, et fut utilisé jusqu'en 1955.

L'ENIAC effectue ses calculs en décimal. Chaque digit est représenté par un groupe de dix lampes à vide dont une seule à la fois est dans l'état "allumé". Il a une mémoire de 20 nombres décimaux de 10 chiffres. Un inconvénient majeur consiste dans le fait qu'on doit le programmer manuellement à l'aide de commutateurs et en enfichant des câbles.

En 1947 apparaît le premier ordinateur à programme enregistré : la machine EDVAC puis viens la machine EDSAC en 1949. Le programme n'est pas câblé, mais est stocké en mémoire comme les données. L'EDSAC avait une mémoire centrale totale de 4096 mots de 40 bits.

recensement

américain) en 1951. En 1953 IBM met en circulation son premier ordinateur électronique

D'autres

calculateurs

l'ont

suivi

tel

que

NIVAC

(département

du

Remarque : Aucun de ces calculateurs ne disposait de système d'exploitation.

2.2 La

deuxième

par lots

génération

(1955-1960) : Les transistors et le traitement

En 1955, des chercheurs des laboratoires Bell annoncent la création de TRADIC, le premier ordinateur composé en totalité de transistors. C est pour cette raison que la deuxième génération commence en 1955.

IBM commercialise la série 7000 en 1959 et la série 1400 en 1961. Par ailleurs, des langages de programmation comme Fortran (FORmula TRANslator) et LISP (premier langage de l'Intelligence Artificielle), sont mis au point. Le premier disque dur est commercialisé par IBM, le RAMAC 305. Il peut stocker 5 MO de données.

Les systèmes d'exploitation sont apparus avec les premiers vrais ordinateurs c'est-à- dire avec l'apparition du transistor. La machine devient ainsi un ordinateur et on dissocie le programmeur du constructeur. Par ailleurs, on rajoute un nouvel intervenant : l'opérateur. Le programmeur écrit son programme (en langage fortran ou assembleur) et le transcrit sur une carte perforée. Les opérateurs sont chargés de donner les cartes à lire à l'ordinateur, de récupérer les résultats et de les communiquer aux programmeurs. Ils doivent également charger le compilateur adéquat qui lui aussi se trouvait sur bande magnétique. L'existence de ces opérateurs était due à des raisons de sécurité, en effet les ordinateurs de l'époque valant

plusieurs milliers de dollars, ils étaient conservés dans des pièces à air conditionné où seuls les opérateurs étaient autorisés à pénétrer.

Cette organisation a engendré une perte de temps énorme pour chercher les cartes et restituer les résultats. Pour cela on opta heureusement pour le traitement par lot afin d'enchaîner automatiquement les travaux.

2.3 La

troisième

génération

multiprogrammation

(1960-1970):

Les

circuits

intégrés

et

la

Le premier circuit intégré est développé en 1958. Le principe consiste à fabriquer dans un même bloc de semi-conducteur, plusieurs composants (résistances, condensateurs, transistors). L’idée était de concentrer dans un volume le plus réduit possible, un maximum de fonctions logiques, auxquelles l'extérieur pourrait accéder grâce à des connexions réparties tout autour du circuit.

De 1958 à nos jours, le concept de circuit intégré s'est extraordinairement développé pour donner naissance aux microprocesseurs, (une unité arithmétique et logique, des registres, de la mémoire…etc.)

La troisième génération d'ordinateurs est très riche en événements, en effet elle a vu la création de la société Intel, la naissance du système Unix et la mise en place du réseau de communication Arpanet ancêtre d'Internet.

Vers le milieu des années 60, IBM lance la gamme de machines SYSTEM/360 (avec le système d'exploitation OS/360) qui permet de gérer les entrées-sorties et d'effectuer des calculs en même temps.

Le langage Pascal est inventé en 1968 par Nikhlaus WIRTM. Cette génération a été marquée par la naissance du système Unix en 1969.

Cette génération introduit la notion de multiprogrammation puisque le processeur peut se partager entre plusieurs tâches. Un programme nécessite une arrivée de donnée à partir du clavier ou à partir d'une bande magnétique. Dans tous les cas, c'est une instruction d'entrée-sortie et son exécution est très lente vu la différence de vitesse entre le périphérique et le processeur. Ainsi au lieu de rester inactif, le système d'exploitation fait basculer le processeur vers un autre programme et l'exécute. Le processeur petit ainsi avoir un rendement de 100%.

2.4 La quatrième génération (1971- ) : Les micro-ordinateurs et les systèmes d'exploitation actuels

systèmes

d’exploitation et micro-ordinateurs ne cessent d’apparaître.

Le premier microprocesseur, le Intel 4004 apparaît en 1971. Il est capable de traiter des données de 4 bits. Il contient 2300 transistors et peut exécuter 60.000 opérations par seconde (fréquence de base de 108 KHz).

Le 12 Août 1981, IBM dévoile son premier « Personal Computer » avec un processeur Intel 8088 et un RAM de 16 KO. En 1983, IBM lance un nouveau micro avec un disque dur intégré de 20 MO.

Cette

génération

est

apparue

vers

les

années

70

les

nouveaux

En 1991, Linus Torvald, 21 ans, étudiant en licence universitaire d'informatique en Finlande, présente la première version du système d’exploitation Linux qui va révolutionner l'informatique au 21 ième siècle. Ce système était gratuit avec son code source.

En 1993, Intel présente le Pentium l'aîné d'une famille de processeurs 32 bits. En 1995 Sun Microsystems présente le langage orienté objet, JAVA.

Les principaux systèmes d'exploitation étaient :

- VMS (Virtual Memory System)

- MS-DOS : c’est le plus connu des premiers systèmes d'exploitation pour PC

- Mac OS : c est le système d'exploitation de la firme Apple. Il a été livré pour le Macintosh en 1984. C'est un des premiers systèmes à utiliser la souris et une interface graphique avec plusieurs fenêtres.

- Red hat : il adapté aux serveurs et l’administration des réseaux.

- Mandrake Soft : c’est une version facile adaptées aux débutants

- La famille des Windows : 95, 98 XP …

2.5 La cinquième génération (début des années 90) : Les systèmes parallèles et répartis

La communauté informatique relie cette génération aux innovations en matière de réseaux, à la technologie des lasers et les fibres optiques aux innovations réalisées au niveau d'Internet.

dits

parallèles et ceux dits répartis ou distribués.

Un système parallèle permet de gagner en terme de capacité de traitement. Un programme constitué de n procédures plus ou moins indépendantes peut être exécuté par n processeurs ainsi le temps d’exécution est divisé sur le nombre de processeur.

Un système reparti est composé de plusieurs sites comportant une ou plusieurs machines reliées à travers un réseau de communication (partage des imprimantes, des disques dures …)

On

distingue deux

types

d'architectures

multiprocesseurs :

les

systèmes

Département 1 Département 2 Réseau de communication Batterie de disques Calculateur Imprimante Schéma de
Département 1
Département 2
Réseau de
communication
Batterie
de
disques
Calculateur
Imprimante
Schéma de système réparti

Le système accélère l’exécution de manière à ce que l’utilisateur ignore si une partie de son traitement a été exécuté sur son PC ou sur un autre.

flux

d'instructions (le calcul à réaliser) et le flux de données (la donnée à traiter) :

La

classification

des

machines

se

caractérise

par

ce

qu'on

appelle

le

-

Les systèmes SISD (Single Instruction Single Data) : ce sont les PC actuels car ils sont monoprocesseurs.

-

Les systèmes SIMD (Single Instruction Multiple Data): répètent le même calcul sur des milliers de données.

-

Les systèmes MISD (Multiple Instruction Single Data): représentent un cas rare de parallélisme.

-

Les systèmes MIMD (Multiple Instruction Multiple Data) : regroupent les machines à plusieurs processeurs capables d'exécuter plusieurs programmes sur plusieurs données. Les systèmes parallèles etdistribués appartiennent à cette catégorie.

3

Fonctions d’un système d’exploitation

Un système d’exploitation est un ensemble de pages qui jouent le rôle d’un intermédiaire entre l’utilisateur et le matériel. Il construit une machine virtuelle sur la machine physique plus simple et plus conviviale. Il prend également en charge la gestion des ressources de l’ordinateur dont l’objectif d’assurer une utilisation plus efficace.

3.1 Les fonctions utilitaires

Tout système d’exploitation comprend des programmes chargés de réaliser les travaux d’exploitation standards de programmation (éditeurs de textes, traducteurs, éditeurs de liens, configurateurs, outils de mise au point, gestionnaire de version,…), de gestion de fichiers (formatage de volumes, copies de volumes et de fichiers ; tris de fichiers, conversion de support, archivage de supports,…) , de gestion de taches d’administration du système (gestion de mots de passe, gestion et contrôle des accès , installation de nouvelles applications ou versions d’un logiciel, outils d’évaluation de performances,…), de gestion de taches d’un bureau (outils de communication, outils de bureautique,…),etc.

3.2 Gestion du dialogue Homme/Machine

Une commande lancé par un utilisateur peut être formulée de diverses manières : un texte à saisir, un choix dans un menu, un double clic sur une icône présentée dans une fenêtre d’applications, etc.)

Pour être traitée par l’ordinateur, cette commande transite par un processeur (logiciel) spécialisée dans l’interprétation des commandes. Sin analyse par l’interprète peut correspondre soit à l’affichage d’un message d’erreur, soit au lancement du programme correspondant. Lorsque le traitement définitif de la commande est terminé, l’ordinateur est de nouveau prêt à recevoir un nouvel ordre (une autre commande), c’est ce que qui est souvent indiqué par un message précis du système, appelé souvent prompt (ou invite) système.

3.3

Gestion de données et des fichiers

Un fichier peut se définir comme un ensemble (une collection) de données de même nature codées et mémorisées, pour les besoins de l’utilisateur, sur un disque dur ou sur un autre support de sauvegarde magnétique, optique, …d’un point de vue pratique, le fichier constitue le seul et unique moyen pour sauvegarder des informations contenues dans la mémoire centrale de l’ordinateur et qui, autrement, seraient perdues lors de l’arrêt de cet ordinateur.

Selon la nature des informations contenues dans un fichier normal, on distingue entre les fichiers programmes (.bat, .exe, …etc.) et les fichiers données (Fichier Word, fichier Excel …etc.).

La gestions des fichiers est l’ensemble des actions relatives à leur existence : création, édition, recherche, duplication, suppression, impression, compression, etc. Par extrusion, on peut inclure dans cet ensemble toutes les fonctions de gestion des supports de sauvegarde. Ces fonctions incluent par exemple le formatage des supports (initialisation ou réinitialisation) et leur maintenance (vérification de leur état et éventuellement tentative de récupération des informations perdues).

La gestion des données englobe les fonctions liées à l’utilisation des fichiers et leur partage mais aussi la sécurité (protection par mot de passe, définition de droits d’accès, etc.) et la confidentialité (cryptage par clé publique ou privé, etc.) des informations qu’ils contiennent.

3.4 Gestions des périphériques et des entrées-sorties physiques

Les unités périphériques peuvent être vus comme étant des éléments permettant à l’ordinateur de dialoguer avec son milieu extérieur (des utilisateurs, des serveurs sur un réseau, etc.) ou encore comme des possibilités d’extension de la mémoire centrale (en particulier pour réaliser une mémoire virtuelle utilisant un disque comme zone de va-et- vient).

La gestion des périphériques regroupe l’ensemble des actions relatives à leur emploi. Ces fonctions concernent, d’une part, le paramétrage (ou la configuration logicielle) de ces périphériques et, d’autre part, leur utilisation proprement dite (envoi de signaux à destination des périphériques de sortie et réception de ceux par les périphériques d’entré, réalisation d’opérations de transferts de données, etc.).

La gestion des entrées-sorties physiques sur les périphériques doit permettre d’ignorer le plus grand nombre possible des différences qui existent entre les mêmes types d’unités proposées par plusieurs constructeurs. Autrement dit, il faut que le gestionnaire d’entrés- sorties puisse rendre transparente à l’utilisateur les éléments caractéristiques des périphériques, en lui fournissant un modèle virtuel auquel il peut s’adresser. Il existe deux types de périphériques :

- Les périphériques en mode caractère (écran, clavier, souris, imprimante, modem) pour lesquels l’unité de transfert est 1 O.

- Les périphériques en mode bloc (lecteur de disque, disquette, CDRom) pour lesquels le type de transfert est un bloc de caractère (512 O pour une disquette et 4 KO pour un disque dur)

3.5

Gestion de la mémoire centrale

Pour faire exécuter un programme, il est nécessaire de lui allouer un espace en mémoire centrale. Cette mémoire doit alors englober les données du programme (les constantes qui le composent). Cependant, pour pouvoir l’exécuter, le recours au système d’exploitation ou du moins de son noyau est nécessaire. Ce dernier est également un programme, il lui faut donc de l’espace mémoire.

Une première tache de gestionnaire de la mémoire consiste alors à répartir la mémoire vive en deux types d’espaces : un espace utilisateur et un espace système, et à maintenir l’intégrité de ces espaces. Une fois chargée en mémoire centrale, l’image du programme donne lieu à la définition d’un processus prêt à être exécuté.

Zone Système d’exploitation Référence sans le privilège système Code du Programme A Référence à une
Zone Système
d’exploitation
Référence sans le
privilège système
Code du
Programme
A
Référence à une
donnée
locale
Données du
programme A
Référence sans
autorisation
Code du
Programme
B
Référence à une
donnée partagée
Données du
programme B

Découpage et protection de la mémoire

3.6 Gestion du processus et de l’unité centrale

Au cours de son exécution, un processus peut passer par divers états caractéristiques :

crée (inactif), prêt (éligible), en exécution (élu), bloqué (en attente pour l’accès à une ressource non disponible ou de l’occurrence d’un événement attendu), terminé (normalement ou non).

Prêt Election Création du processus Suspension Actif Crée Arrêt Activation Blocage Terminé Bloqué Cycle
Prêt
Election
Création
du processus
Suspension
Actif
Crée
Arrêt
Activation
Blocage
Terminé
Bloqué
Cycle de vie des processus

Un processus a nécessairement besoin de ressources pour accomplir son activité. Qu’elle soit matérielle (registres de processeur, unités périphériques, etc.) ou logicielle (fichiers, buffers d’entrée/sortie, etc.), une ressource peut être classée selon son type parmi :

les ressources privées ou les ressources partageables. Seules les ressources partageables peuvent poser quelques problèmes lors des demandes d’accès simultanées. Il faut donc gérer correctement la compétition entre les processus en leur attribuant des droits d’accès à ces ressources et en mettant en place une stratégie équitable d’allocation. A remarquer que l’on dit d’une ressource qu’elle est critique lorsque son degré d’accès est limité à un processus à la fois.

4 Structuration des systèmes

La structure type d’un système d’exploitation est un ensemble de couches successives permettant d’établir un dialogue entre les programmes utilisateurs et le matériel constitutif de l’ordinateur. Une telle structure peut être représenté par un noyau autour duquel sont greffés des couches logicielles permettant de réaliser un système opératoire (on parle alors d’une machine virtuelle).

Le but du noyau du système est de créer un environnement d’accueil pour le processus ; ceci implique le support des interruptions, le partage du processeur central entre les processus, et un mécanisme assurant la synchronisation et la communication des processus.

Logiciel de base

Gestionnaire des

interruptions Microprocesseur et Autres unités NOYAU Matériel Autres couches Utilitaires APPLICATIFS
interruptions
Microprocesseur
et Autres unités
NOYAU
Matériel
Autres
couches
Utilitaires
APPLICATIFS
Applications
Gestionnaire de la
mémoire
utilisateur
Gestionnaire de
fichiers

Outils de

communication

Structuration en couches

La gestion des interruptions est la partie du noyau système chargée de répondre aux signaux (événements) extérieurs (interruptions) et intérieurs (déroutements). Sa fonction est de deux ordres : déterminer la source d’interruption et répondre à l’interruption.

la source d’interruption et répondre à l’interruption. scheduler Processeur File d’attente central des
scheduler
scheduler
Processeur File d’attente central des processus prêts dispatcher
Processeur
File d’attente
central
des processus
prêts
dispatcher

Diverses listes des processus en attente

des processus prêts dispatcher Diverses listes des processus en attente Modules de gestion du processeur central

Modules de gestion du processeur central

Le dispatcher s’occupe de la sauvegarde du contexte du processus en cours, de l’extraction du contexte du processus le plus adéquat et du transfert du contrôle à l’adresse désignée par le compteur ordinal du processus restauré.

Le scheduler détermine quel processus doit être exécuté. Il suffit pour cela d’ordonner les processus prêts selon un critère donné qui détermine leur priorité. Le processus élu sera celui qui se situe, selon l’ordre de priorité, en tête de la file des processus prêts.

Lorsqu’une interruption survient le processus actif peut perdre la main au profit (des modules du système d’exploitation et par la suite) d’un processus parmi la liste des processus prêts.

Les liaisons entre le gestionnaire d’interruption et le dispatcher sont représentées par l’ensemble d’actions suivantes :

Processus actif

par l’ensemble d’actions suivantes : Processus actif Arrivée d’une interruption Gestionnaire

Arrivée d’une interruption

suivantes : Processus actif Arrivée d’une interruption Gestionnaire d’interruption Identifier l’interruption

Gestionnaire

d’interruption

d’une interruption Gestionnaire d’interruption Identifier l’interruption Entrée dans une routine de

Identifier l’interruption

Gestionnaire d’interruption Identifier l’interruption Entrée dans une routine de prise en charge Routine de prise

Entrée dans une routine de prise en charge

l’interruption Entrée dans une routine de prise en charge Routine de prise en charge Traitement de

Routine de prise en charge

une routine de prise en charge Routine de prise en charge Traitement de l’interruption Module Dispatcher

Traitement de l’interruption

Routine de prise en charge Traitement de l’interruption Module Dispatcher - Prise en charge de l’interruption

Module

Dispatcher

en charge Traitement de l’interruption Module Dispatcher - Prise en charge de l’interruption - Modifier
en charge Traitement de l’interruption Module Dispatcher - Prise en charge de l’interruption - Modifier
- Prise en charge de l’interruption - Modifier éventuellement l’état du processus Est-il nécessaire de
- Prise en charge de l’interruption
- Modifier éventuellement l’état
du processus
Est-il nécessaire de basculer le
processus ?
Si non
Réactiver
le
processus
interrompu
Si oui
- Sauvegarder le contexte du
processus en cours
- Restaurer le contexte du
processus élu (par le
scheduler à partir de la file
des prêts)
- Transférer le contrôle au
niveau processus

Actions à entreprendre lors d’une interruption

Chapitre 2 :

La gestion des processus

1 Ressources nécessaires à un processus

Qu’elle soit matérielle ou logicielle, une ressource est une entité nécessaire à l’exécution d’un processus. On peut la classer selon deux types : les ressources privées et les ressources partageables.

Seules les ressources partageables posent des problèmes d’accès puisqu’il y a compétition entre les processus pour les acquérir. On définit dans ce cadre des droits d’accès et une stratégie d’allocation/libération.

A remarquer que l’on parle d’une ressource critique lorsque son degré d’accès est limité à un processus à la fois. Dans ce cadre précis, l’accès à la ressource critique se fait en exclusion mutuelle et le fragment du programme dans lequel la ressource critique est utilisée s’appelle une section critique.

2 Relations inter-processus

Les processus peuvent être complètement indépendants, dans le sens où ils ne possèdent pas de ressources communes et ne partagent pas un objectif de réalisation commun.

Par contre, dès qu’ils partagent des ressources ou dès qu’ils ont des activités liées, les processus sont dits en « coopétition » (coopération + compétition). Cette coopétition peut être décrite de deux manières :

2.1 Cas d’une compétition pour l’acquisition d’une ressource

Si la ressource est gérée par un allocateur (processus particulier disposant de divers privilèges vis-à-vis de la gestion de la ressource). La coordination entre les processus utilisateurs de la ressource est alors réglée par l’allocateur selon le schéma suivant :

- Au niveau du processus demandeur on dispose de deux types de requêtes adressées à l’allocateur : une requête d’allocation suivie une requête de libération,

- Au niveau de l’allocateur on trouve la définition d’un service à rendre sous certaines conditions à vérifier

Process Pi

Allocator Rj

acquérir (Rj) ;

if occupé (Rj) then bloquer Pi) else honorer (Pi)

utiliser (Rj) ; libérer (Rj) ;

fi;

End Pi

End Rj

Si la ressource n’est pas gérée par un processus spécifique alors des règles d’utilisation sont édifiées et tous les processus sans exception s’appliqueront à les suivre à la lettre. Ce type de solutions entre processus citoyens implique le respect par toutes des mêmes règles au même moment.

La forme la plus simple des règles d’utilisation d’une ressource en partage est la définition d’un tour de rôle.

2.2

Cas de la coopération en présence de processus ayant des activités logiquement liées

Si des processus doivent s’attendre pour avancer sur leur exécution respective, des outils synchronisation pure nécessaire pour décrire ces comportements (mise en place de rendez vous, signalisation d’événements attendus par d’autres, etc.)

Process Pi

Process Pj

attendre (Pj) ;

signaler (Pi) ;

End Pi

End Pj

Si des processus exigent, au cours de leur exécution, des données qui sont produites par d’autres, des outils de communication seront nécessaires pour accomplir l’envoi et la réception de ces données.

Process Pi

Process Pj

envoyer (Pj, mess)

recvoir (Pi, mess)

End Pi

End Pj

3 Stratégies d’ordonnancement

Un système informatique à mémoire commune peut posséder un processeur unique (système centralisé) ou plusieurs processeurs (lorsqu’on est dans le cas d’un multiprocesseur). Il peut également être composé de plusieurs machines indépendantes mais connectées à un réseau local ou distant ‘système réparti).

La gestion des processus s’occupe alors de l’allocation des processeurs aux processus crées avec ses deux possibilités : avec et sans réquisition.

3.1 Gestion de la file selon le mode tourniquet

Cette méthode consiste à sélectionner le processus qui est en tête de la file d’attente. La mise d’un processus dans cette file se fait à la queue. Cette file est alimentée, d’une part à partir des files d’attente des processus bloqués pour lesquels la condition de blocage vient d’être levée, d’autre part, les processus ayant subi une réquisition et finalement les processus nouvellement crées.

Réquisition

File d’attente des processus prêts Nouveaux Processeur En Attente Prêts
File d’attente des
processus prêts
Nouveaux
Processeur
En Attente
Prêts

Terminé

Stratégies d’allocation selon le mode Tourniquet

3.2 Gestion de la file en introduisant en plus des priorités

Cette méthode consiste à affecter à chaque processus soit une priorité statique (avant donc le lancement du programme qui lui correspond) soit une priorité dynamique (déterminée en fonction du comportement du processus au cours de son exécution) et à utiliser celle-ci pour décider de l’emplacement dans une file d’attente où enfiler le processus sortant.

En Attente

d’attente où enfiler le processus sortant. En Attente Prêts Réquisition Processeur File d’attente des

Prêts

Réquisition

Processeur
Processeur
où enfiler le processus sortant. En Attente Prêts Réquisition Processeur File d’attente des processus prêts Terminé

File d’attente des processus prêts

Terminé

Stratégie d’allocation avec réquisition

3.3 Gestion d’une file à plusieurs niveaux

Cette méthode consiste à introduire un nouveau processus dans la file d’attente de priorité haute et déplacer tout processus réquisitionné dans une file d’attente de plus basse priorité. L’extraction d’un processus prêt à activer se fait à partir de la file non vide de plus haute priorité.

Réquisition

de la file non vide de plus haute priorité. Réquisition Processeur File d’attente P3 File d’attente
de la file non vide de plus haute priorité. Réquisition Processeur File d’attente P3 File d’attente
Processeur
Processeur

File d’attente P3

File d’attente P2

Processeur File d’attente P3 File d’attente P2 Nouveaux File d’attente P1 Terminé Stratégie

Nouveaux

Processeur File d’attente P3 File d’attente P2 Nouveaux File d’attente P1 Terminé Stratégie d’allocation par

File d’attente P1

Terminé

Stratégie d’allocation par niveaux

4 Algorithme d’ordonnancement

L’objectif d’un algorithme d’ordonnancement est d’optimiser une des grandeurs temporelles suivantes, sachant que l’on s’intéresse par ailleurs à l’utilisation de l’unité centrale et corollairement au débit moyen (en nombre de processus traités par unité de temps sur cette unité centrale) :

- Le temps de traitement moyen (turaround time) décrit la moyenne des intervalles de temps séparant la soumission et l’accomplissement d’un processus,

- Le temps de réponse maximum (response time) est défini comme étant le maximum des durées séparant soumission et accomplissement d’un processus.

Pour représenter schématiquement l’évolution dans le temps des processus, on recourt habituellement à des digrammes de Gantt.

Exemple :

Supposons qu’à l’instant 0, nous disposons au niveau du système considéré de deux processeurs Pr1 et Pr2 libre et d’une liste de 6 les processus à l’état prêt tels que décrits par la table suivante :

Processus

Durée Estimée

Date Arrivée

P1

2

0

P2

3

2

P3

2

2

P4

4

5

P5

5

0

P6

1

9

La stratégie adoptée pour le placement des processus sur les processeurs est fixe. Par exemple :

P1, P3 et P4 sur Pr1

P2, P5 et P6 sur Pr2

En partant de ces faits, essayons donc de schématiser l’ordonnancement des processus par un diagramme de Gantt matérialisant l’occupation des processeurs dans un axe temporel défini à partit de la date 0 où figureront d’éventuelles zones hachurées indiquant l’inactivité du processeur. Le premier diagramme de Gantt est relatif à une allocation sans recyclage.

Processeur

Pr1

Processeur

Pr2

Axe temps

P1 P1 P3 P3 P4 P4 P4 P4 P5 P5 P5 P5 P5 P2 P2
P1
P1
P3
P3
P4
P4
P4
P4
P5
P5
P5
P5
P5
P2
P2
P2
P6
0 1
2
3
4
5
6
7
8
9

Gantt sans possibilité de recyclage

Le second diagramme de §Gantt explicite la possibilité de recycler les processus après avoir consommé la tranche de temps égale à 1 qui leur a été attribuée.

Processeur

Pr1

Processeur

Pr2

Axe temps

P1 P1 P3 P3 P4 P4 P4 P4 P5 P5 P2 P5 P2 P5 P2
P1
P1
P3
P3
P4
P4
P4
P4
P5
P5
P2
P5
P2
P5
P2
P5
P6
0 1
2
3
4
5
6
7
8
9

Gantt avec possibilité de recyclage

4.1

Algorithme d’ordonnancement sans réquisition

4.1.1 Algorithme FCFS (First Come First Served)

FCFS traite les processus dans l’ordre de leur soumission (date d’arrivé) sans considération aucune de leur temps d’exécution. L’organisation de la file d’attente des processus prêts est donc tout simplement du FIFO.

Exemple :

Processus

Durée Estimée

Date Arrivée

P1

8

0

P2

4

1

P3

5

2

P4

9

3

Diagramme de Gantt en supposant qu’on dispose d’un processeur unique

P1

P2

P3

P4

0

8

12

17

26

Temps de traitement moyen = [ ( 8 - 0 ) +( 12 – 1 ) + ( 17 – 2 ) + ( 26 – 3 ) ] / 4 = 14,25

= [Temps de Terminaison] – [Date d’arrivée]

4.1.2 Algorithme SPN (Shortest Process Next)

SPN choisit de façon prioritaire les processus ayant le plus court temps d’exécution sans réellement tenir compte de leur date d’arrivée. Cet algorithme est connu est également sous le nom : SJF pour Shortest Job First.

Exemple :

Processus

Durée Estimée

Date Arrivée

P1

10

0

P2

05

2

P3

15

3

P4

03

4

Diagramme de Gantt en supposant un unique processeur et qu’on est à l’instant 5.

P4

P2

P1

P3

5

8

13

23

38

Temps de traitement moyen = [ ( 8 – 4 ) +( 13 – 2 ) + ( 23 – 0 ) + ( 38 – 3 ) ] / 4 = 18,25

4.2 Algorithme d’ordonnancement avec réquisition

4.2.1 Algorithme RR (Round Robin)

RR décrit une stratégie dite du tourquinet où on procède à un recyclage des processus sur le processeur tant que ceux –ci ne se sont pas terminés.

Lorsqu’un processus est élu, on lui attribue une tranche de temps fixe, appelé quantum, pendant laquelle il s’exécute. Au bout de ce temps, on ne poursuit plus l’exécution du processus, on lui retire donc le processeur et on le réinsère dans la file des processus prêts. Là, il devra attendre sa prochaine élection.

Ainsi, le processus se voit attribuer successivement plusieurs tranches de temps avant d’atteindre sa terminaison.

Exemple :

Processus

Durée Estimée

Date Arrivée

P1

30

0

P2

05

1

P3

02

2

(i) Diagramme de Gantt en supposant un unique processeur et un quantum = 1.

P P P 2 1 3 P P 1 2 P 3 P 1 P

P

P P

2

1 3

P P P 2 1 3 P P 1 2 P 3 P 1 P 2
P P P 2 1 3 P P 1 2 P 3 P 1 P 2

P P

1 2

P

3

P

1

P

2

P P P 2 1 3 P P 1 2 P 3 P 1 P 2

P P

1 2

P P P 2 1 3 P P 1 2 P 3 P 1 P 2

P P

1 2

P P P 2 1 3 P P 1 2 P 3 P 1 P 2

P P

1 1

P P P 2 1 3 P P 1 2 P 3 P 1 P 2

0

1

6

12

37

Temps de traitement moyen = [(37 – 0) + (12 – 1) + (6 – 2)] / 3 = 18,33

(ii) Diagramme de Gantt en supposant un unique processeur et un quantum = 1.

P1

P2

P3

P1

P1

0

10

15

17

27

37

Temps de traitement moyen = [ ( 37 – 0 ) +( 15 – 1 ) + ( 17 – 2 ) ] / 3 = 23

4.2.2 Algorithme SRT (Shortest Remaining Time)

SRT choisit le processus dont le temps d’exécution restant est le plus court. Ici, on procède comme dans le cas de la stratégie du tourquinet à l’attribution d’un quantum fixe au- delà duquel on cherche à élire le processus le plus court en terme de temps d’exécution

restant pour atteindre sa terminaison.

4.2.3 Algorithme basé sur les priorités

Les algorithmes fondés sur les priorités attribuées par le système d’exploitation aux processus choisissent les processus les plus prioritaires sans prise en considération d’une manière générale des données durée d’exécution et date d’arrivée des processus. Remarquons que pour des raisons évidentes, l’affectation dynamique de priorités, par exemple après chaque quantum de temps, est une solution couramment utilisée puisqu’elle permet de résoudre les éventuels risques de famine.

Exemple :

 
 

Processus

Durée Estimée

Date Arrivée

Priorité

P1

5

0

1

P2

8

0

5

P3

4

0

3

(i) Priorités statiques :

Supposons un unique processeur, des priorités statiques (la valeur 1 correspond à la plus basse priorité) et une valeur de quantum = 1.

Diagramme de Gantt

P2

P3

P1

0

8

12

17

Temps de traitement moyen = ( 17 + 8 + 12 ) / 3 = 12,33

(ii) Priorités dynamiques :

Supposons un unique processeur, des priorités dynamiques (la valeur initiale d’une priorité est diminuée par exemple de 1 à chaque cycle) et une valeur de quantum = 1.

Diagramme de Gantt

P

P

P

P

P

P

P

P

P

P

P

P

 

P P

P

 

P

P

2

2

3

2

3

2

1

3

2

1

3

2

2

1 1

2

1

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Temps de traitement moyen = ( 17 + 16 + 11 ) / 3 = 14,66

4.3 Une brève comparaison entre les algorithmes d'ordonnancement

On ne peut se baser sur un échantillon de 5 processus pour établir une comparaison entre ces algorithmes, toutefois nous pouvons émettre quelques remarques.

Iln'existe pas d'algorithme idéal sur tous les plans. Les critères de choix dépendent des besoins et des attentes. A première vue l'algorithme du SJF semble obtenir les temps de réponse et d'attente les plus faibles. Toutefois Si l'on souhaite que les processus commencent à délivrer leurs résultats assez rapidement il faut opter pour l'algorithme du tourniquet. Par ailleurs tous les processus sembleront servis de manière équitable. Si toutefois les processus se distinguent par des priorités, l'algorithme d'ordonnancement avec priorité s'impose.

Chapitre 3 :

La synchronisation des processus

1 Notion de section critique et d'exclusion mutuelle

Une section critique est une partie du processus où peut avoir lieu un conflit d'accès. Elle contient des instructions utilisant des variables ou des ressources partagées par d'autres processus. On rentre en section critique, par une section d'entrée qui permet de mettre en oeuvre une condition et on la quitte par une section de sortie. Si cette section est exécutée en entier, les problèmes sont résolus.

On parle d'exclusion mutuelle quand un seul processus à la fois a le droit de rentrer en section critique (la condition d'entrée ne permet qu'à un seul processus de passer). Le terme utilisé est l'accès en exclusion mutuelle à une ressource ou à une variable.

Si une ressource a été accédée par un premier processus et qu'il est interrompu, aucun autre processus ne peut y accéder tant qu'elle n'a pas été libérée par le premier processus. Il faut donc attendre que le processus reprenne son exécution et qu'il libère la ressource.

1.1 Algorithme d’alternance

Processus

.

.

.

< Section restante>

< Section d’entrée>

< Section critique>

< Section de sortie>

Déclaration Tour 1 Processus = P1, P2 Fin déclaration Processus P1 Répéter <SR> Tant que tour = 2 faire rien <SC> Tour 2 Fin répéter Processus P2 Répéter <SR> Tant que tour = 1 faire rien <SC> Tour 1 Fin répéter

Les deux processus P1 et P2 partagent une seule variable (Tour) qui peut prendre la variable 1 et 2. La section d’entrée consiste à consulter la valeur de tour et l’exécution de la section critique n’est autorisé pour le processus que si la valeur de Tour = i. Lorsque le processus a terminé sa <SC>, il exécute sa section de sortie en affectant à Tour le numéro de l’autre processus pour lui permettre d’entrer dans sa propre <SC>.

Déclaration D1, D2 Processus = P1, P2 Fin déclaration Processus P1 <SR> D1 vrai Tant que D2 faire rien <SC> D1 faux Processus P2 <SR> D2 vrai Tant que D1 faire rien <SC> D2 faux

1.2 Les Sémaphores

Un sémaphore est une variable qui permet de compter le nombre de processus en attente à l'entrée d'une section critique. Un sémaphore est un objet du langage de programmation ou du système, il peut être considéré comme un entier. On distingue des sémaphores binaires qui peuvent prendre les valeurs O ou 1 et les sémaphores n-aires. Les sémaphores binaires sont utilisés pour réaliser de l'exclusion mutuelle. Q nant aux sémaphores n-aires, ils ont pour rôle de spécifier un nombre d'accès maximal à une ressource (en lecture bien entendu).

Conjointement au sémaphore, deux primitives indivisibles P et V, mettent en oeuvre les sections d'entrée et de sortie. Elles permettent de décrémenter et d'incrémenter le sémaphore. Leur origine provient des termes hollandais Proberen et Verhogen. Certains emploient une métaphore pour ces primitives, ainsi P signifierait Puis-je et V Vas-y.

P(S) permet de prendre le sémaphore et équivaut à écrire

Si S > O

Alors s = s - 1 Sinon s'endormir

Finsi

Si le sémaphore est binaire, en l'initialisant à 1, on ne permet qu'une seule exécution de la section critique à la fois.

V(S) permet de libérer le sémaphore et un processus bloqué s'il y en a

Si un processus est bloqué sur S

Finsi

Alors le libérer Sinon s =s+1

Le fait de vérifier s'il existe des processus en attente du sémaphore avant d~incrémenter sa valeur permet de respecter l'ordre dans lequel les processus se sont bloqués au niveau de l'accès à cette section critique.

Un processus a typiquement les instructions suivantes :

Faire Instructions P(S) Section critique V(S) Instructions

Fin

Un processus bloqué est placé dans la file des processus en attente, une fois libéré il passe dans celle des prêts.

Si nous voulons modéliser le type sémaphore nous pouvons le faire de la manière suivante :

Type sémaphore = structure Valeur : entier Tête : Liste d'attente

Fin structure

/* liste de blocs de contexte des processus */

/* en attente d'entrer en section

critique */

Exemple :

Donner une solution en utilisant les sémaphores pour résoudre le problème producteur-consommateur dans le cas d’un seul producteur, un seul consommateur et un seul cas.

C P « vide » « plein » 0 1
C
P
« vide »
« plein »
0
1

Producteur

Consommateur

<SR>

<SR>

P

(vide) 0

P

(plein) 0

Produire

Retirer

Mettre

Consommer

V

(plein) 1

V

(vide) 1

Fin prod

Fin cons

1.3

Les moniteurs

Un moniteur est un ensemble de procédures, de variables et de structures de données regroupées dans un module spécial et gérées par le compilateur11. Un programmeur désirant mettre en oeuvre une section critique se contentera de la reporter dans des procédures du moniteur. Une fois les procédures définies, elles pourront être appelées par les processus mais en aucun cas un processus n~aura connaissance ni accès à la structure interne des procédures. Le compilateur vérifie avant d'exécuter le processus Si un autre processus est actif dans le moniteur. Etant donné que cette vérification est reportée sur le compilateur, on écarte le risque d'erreur engendré par l'inversion des P et V pour les sémaphores.

Les moniteurs utilisent deux primitives Wait et Signal afin de bloquer les processus sur la réalisation d’une condition et pouvoir ensuite les réveiller.

Exemple :

Appliquer les moniteurs sur le même exemple.

Fonction moniteur Condition : plein, vide Int Cpt Void mettre ( ) Si Cpt = N alors wait (plein) Sinon mettre (objet) ; Cpt ++ ; Finsi Fin mettre

Void retirer Si Cpt = 0 alors wait (vide) Sinon retire (objet) Cpt -- ; Finsi Si Cpt = N – 1 alors signaler (plein) Fin si Fin retirer Fin moniteur

Producteur <SR> Production (objet) Moniteur . mettre ( ) ………. Fin prod

Consommateur <SR> Moniteur . retirer ( ) Consommer (objet) ………. Fin cons

Exemple :

Résoudre le problème consommateur/producteur dans N cases en utilisant les sémaphores

Producteur

plein = 0

<SR>

vide = N

P

(vide)

excmut = 1

Produire (objet)

P (exmut)

 

Deposer (obj)

V

(exmut)

V

(plein)

Fin prod

 

Consommateur

<SR>

 

P

(plein)

P

(exmut)

Retirer (obj)

V (exmut)

Consommer (obj)

V (vide)

Fin consommateur

Chapitre 4 :

La gestion de la mémoire centrale

Introduction

La gestion de la mémoire implique la connaissance des zones libres et occupées, l'allocation de mémoire au processus, la récupération de celle-ci â la fin de l'exécution

1 Adressage absolu

Quand une adresse est absolue, elle ne nécessite aucun traitement pour obtenir une adresse physique. Les adresses physiques sont utilisées telles quelles par l'unité centrale car les adresses logiques et physiques sont équivalentes. On ne peut pas déplacer le programme en mémoire centrale. En revanche dans ce cas, le programme doit toujours être chargé aux mêmes adresses, faute de quoi il ne pourra s’exécuter, à moins d 1 effectuer une nouvelle étape d'éditions des liens. Les programmes correspondants sont dits non relogeables.

2 Adressage relatif

C’est un adressage qui est relatif à la première adresse attribuée au programme exécutable. Toutes les adresses doivent être converties ou traduites en partant de cette adresse. On peut ainsi changer de zone mémoire d'une exécution à l'autre. Un tel programme est dit relogeable. La conversion des adresses est liée au mode d'allocation appliqué :

contiguë ou non.

En mode contiguë, une adresse relative qui vaut 100 doit être considérée comme 100 + l'adresse de début du fichier généré par l'éditeur de liens. En mode non contiguë, le programme est partagé entre plusieurs zones dispersées dans la mémoire et le mécanisme de gestion de la mémoire doit trouver la zone et ensuite l'adresse.

3 Les stratégies d'allocation de la mémoire

On distingue essentiellement deux modes de gestion de la mémoire centrale : le mode contigu et celui non contigu. Quand un programme est chargé en mémoire centrale à partir du disque, le système d 1 exploitation lui alloue une zone mémoire dans laquelle il le place. Selon le mode de gestion de la mémoire, le programme sera placé dans une seule zone (allocation contiguë) ou réparti entre plusieurs zones (allocation non contiguë).

Par ailleurs la zone de mémoire allouée à un programme est de taille limitée, or tout programme est amené à augmenter de taille lors de son exécution.

On distingue alors des systèmes qui utilisent des zones de taille fixe et d1autres qui

permettent au programme de s'étendre sur l'espace avoisinant Si celui-ci est libre. Ceci nous ramène à quatre modes de gestion de la mémoire centrale: contiguë, non contiguë, fixe et variable.

4 Allocation contiguë en mémoire centrale

Une partition est un emplacement de la mémoire de taille limité, qui est décrit par une adresse de début et une adresse de fin. On distingue les partitions fixes et celles variables.

4.1 Les partitions de taille fixe

Dans le cas des partitions fixes, la mémoire est découpée d’une manière fixe.

Exemple de découpage de la mémoire en partitions de taille fixe:

10K

10K

20K

20K

20K

100K

100K

100K

Chaque processus est supposé occuper la plus petite partition qui peut le contenir. Tout espace inutilisé dans la partition est perdu car on ne cumule pas des espaces appartenant à des partitions voisines.

On distingue plusieurs stratégies pour le choix du processus et celui de la partition, parmi lesquelles on peut citer :

- Stratégie de la première zone libre (First Fit): la première partition ayant une taille suffisante

P1 P4 P2 P3

P1

P1 P4 P2 P3

P4

P2

P3

- Stratégie du meilleur ajustement (best fit) : la plus petite partition de taille suffisante

P1

50

P2

70

P3

200

P4

32

30

60

50

40

800

400

- Stratégie préventive du worst fit : qui alloue une grande partition plutôt qu'une petite afin de garder des petites zones libres.

P1

50

P2

70

P3

200

P4

32

15

60

10

40

80

400

Le principal inconvénient de l'allocation par partition de taille fixe est la saturation, un

programme peut rapidement occuper l'ensemble de la partition. Il occupe ainsi toute la mémoire centrale.

4.2 Les partitions de taille variable

Il est clair que le nombre de partitions, ainsi que leur taille varient dynamiquement au fur et à mesure que les processus sont créés ou terminés.

Si un processus nécessite davantage de mémoire car il en a alloué dynamiquement pour certaines variables, le système d'exploitation peut augmenter la taille de sa partition en lui attribuant des partitions voisines s'il en existe. Le cas échéant, le recours est le même que pour les partitions fixes, à savoir que le programme est déplacé ou bien des processus voisins sont déplacés.

5 Allocation non contiguë en mémoire centrale

C’est le mode d'allocation qui est appliqué par les systèmes actuels, ainsi un fichier peut être chargé à des adresses dispersées en mémoire. La correspondance entre les adresses est réalisée au cours de l'exécution.

La mémoire peut être allouée par zones de taille fixe ou variable. Quand toutes les zones ont la même taille, on parle de page et de systèmes paginés. Quand leur taille peut varier, on parle de segments et de systèmes segmentés. On peut combiner les deux modes, par exemple avoir des segments composés de pages.

6 Gestion de la mémoire appliquant le va et vient

La taille de la mémoire centrale est limitée et très faible comparée à celle du disque dur. La mémoire centrale est fréquemment saturée et dans ce cas, il n'existe que deux alternatives : le système se plante affichant un message d'erreur à l'utilisateur ou le système évacue certains programmes de la mémoire et les place sur une zone bien précise du disque. Ensuite, il charge d'autres programmes à partir du disque en mémoire centrale et les exécute.

On a vu apparaître plusieurs techniques qui ont donné naissance aux fondements de la gestion actuelle des mémoires centrales : le premier est le va et vient (swapping en anglais). Cette technique s'est répandue avec l'époque du temps partagé où il fallait exécuter plusieurs processus par utilisateur. Quand un processus a fini son quantum de temps et qu’il existe plus de processus que la mémoire ne peut contenir, il est déplacé sur le disque par un processus appelé swapper. Il faut à ce stade préciser que le processus est transféré en entier. C'est l'ordonnanceur en collaboration avec le swapper qui est chargé de le ramener une fois que son exécution approche. Pour l'utilisateur ceci est transparent. Cette solution, suppose qu'une partie du disque dur complète la mémoire centrale, on l'appelle zone de swap, et elle ne sert qu'à sauvegarder les processus délogés de la mémoire centrale.

7

La mémoire virtuelle

Le swapping ne résout pas le problème de certains programmes trop grands pour être contenus en mémoire centrale. On a ainsi vu apparaître un nouveau mode de gestion de la mémoire basé sur la notion de mémoire virtuelle. Elle représente le second mode appliqué afin d'exécuter des programmes volumineux (en plus du swapping).

On parle de mémoire virtuelle car elle a une taille irréelle, bien plus grande que la mémoire physique et elle permet aux programmes d'avoir des tailles plus grandes que celle de la mémoire centrale, tout simplement.

La taille des programmes, des données et de la pile peut dépasser la mémoire disponible, le système d'exploitation garde en mémoire les parties qui sont utilisées et stocke le reste sur le disque. On voit ainsi que la mémoire virtuelle s'inspire du swapping. En supposant qu'une partie du disque dur est intégrée à la mémoire centrale, on peut disposer d'un espace d'adresses logiques plus grand. Bien entendu, les adresses physiques sont limitées par la taille de la mémoire centrale.

La mémoire virtuelle nécessite des systèmes d'exploitation qui permettent la gestion des adresses logiques ainsi que la correspondance des adresses logiques sur les adresses physiques.

L'espace d'adressage du processus est un espace d'adressage virtuel dont les adresses varient de 0 à une adresse maximale fixe qui est la même pour tous les processus. La taille de la mémoire virtuelle est fixée par la taille des registres, la plupart des machines ont des registres de 32 bits donc les adresses logiques sont entre 0 et 232 soit un espace d'adressage de 4 Go.

La mémoire virtuelle est indépendante du mode de gestion paginé ou segmenté. Dans un système paginé, l'espace virtuel sera partagé en pages et dans un système segmenté, il sera décomposé en segment.

8 Les systèmes paginés

8.1 La pagination

L'ensemble de la mémoire logique (l'espace d'adressage) d'un programme est décomposé en pages numérotées à partir de 0. La mémoire centrale ou physique est décomposée en cases numérotées de la même manière. L'espace d'adressage logique d'un programme ne devient concret qu'une fois placé en mémoire centrale.

Quand le système n'applique pas de mémoire virtuelle, on a le même nombre de cases et de pages. Un programme est chargé du disque dur en mémoire centrale quand le système affecte une case pour contenir la page.

8.2 Conversion des adresses

Une adresse logique AL est donnée sous la forme suivante (x,y), x indique la page et y le déplacement au sein de cette page.

Cette représentation évite que l'adresse logique soit très grande puisque le déplacement ne dépasse pas la taille de la page. Ainsi, Si les pages ont une taille de 4 KO, chacune peut contenir 4096 adresses. De la sorte l'adresse logique 22480 devient (5,2000).

Le calcul de l'adresse physique AP se fait de la manière suivante : le système d'exploitation commence par trouver l'emplacement de la page x en mémoire centrale (la case correspondante), ensuite il effectue un déplacement de y par rapport à la première adresse dans cette case, en effet les pages et les cases sont de même taille.

9 Les systèmes segmentés

9.1 La segmentation

A la différence des systèmes paginés, la mémoire est allouée par partitions de tailles variables appelés segments. Un segment a une taille qui peut varier (croître ou décroître) au cours de l'exécution.

Tout comme les systèmes partagés, un segment est chargé du disque vers la mémoire centrale pour être placé à une adresse précise pouvant le contenir car de taille suffisante. Si le segment a besoin de croître, il le fera sur l'espace avoisinant. Dans un espace d'adressage donné il n'y a aucune restriction sur le nombre de segments.

9.2 Conversion des adresses

Le compilateur génère des adresses appartenant à des segments. Chaque adresse logique peut être écrit sous la forme (S,D) ; S pour designer le numéro de segment et D pour designer le déplacement dans le segment.

La procédure de conversion suit le cheminement suivant : on commence par retrouver l'emplacement du segment en mémoire centrale grâce à la table de correspondance . Ensuite au sein du segment, on effectue un déplacement de d pour accéder à l'adresse physique. Chaque programme dispose de sa table de correspondance.

De même que dans un système paginé, on vérifie d'abord si le segment est en mémoire. En revanche, On distingue un test supplémentaire qu'il faut réaliser, à savoir qu'on vérifie que le déplacement est bien inférieur à la taille du segment autrement la conversion retournerait une adresse contenue dans un autre segment qui peut ne pas appartenir à ce programme.

Exemple :

Soit l’adresse logique = 9035 9035 (2,843) Soit le secteur S de taille T Si d < T Alors AP = adresse deb +d Si d >T alors Erreur de dépassement de secteur

On peut passer d'un système segmenté à un système paginé Si la taille T est la même pour tous les segments, on a alors des pages de taille T.

Chapitre 5 :

Conception des systèmes de gestion de la mémoire centrale

1 Conception des systèmes paginés

1.1 Allocation et libération de cases

Dans les systèmes paginés, le principal traitement est celui du remplacement des pages, en effet l'allocation et la restitution des cases ne sont pas complexes, étant donné que toutes les cases ont la même taille, donc n'importe quelle case convient lorsqu'il s'agit de charger une page en mémoire.

Le système d'exploitation peut utiliser une structure statique ou dynamique pour conserver les numéros de cases libres. La structure statique sera une table de bits, où chaque bit représentera une case. Il faut parcourir la table à la recherche de bits représentant des cases vides (à la recherche des 0 par exemple). Cette table aura au maximum la taille de la mémoire centrale divisée par la taille d'une case. La structure dynamique fait en sorte qu’il faut lier les numéros de cases libres entre eux. Cette liste peut être conservée dans un ordre trié afin que les processus ne soit pas trop éparpillés en mémoire.

1.2 Remplacement de pages

La mémoire étant de taille faible, elle peut rapidement être saturée. Pour cette raison, on a souvent recours au remplacement de pages, d'autant plus qu'on applique la mémoire virtuelle qui introduit un nombre très élevé de pages. Nous rappelons qu'une page est remplacée si le processeur réclame une information située dans une page qui n’est pas chargée en mémoire centrale et qu'il n'existe aucune case libre pour y charger cette dernière. Assez souvent il peut y avoir confusion entre défaut de page et remplacement de page. Le défaut de page peut entraîner un remplacement si le système d'exploitation ne trouve aucune case de libre.

1.3 Les algorithmes de remplacement de pages

1.3.1 L'algorithme de remplacement d'une page selon FIFO

La politique FIFO permet de remplacer est celle qui a été chargée en mémoire depuis le plus long temps.

Exemple :

Soit la chaîne de référence suivante :

5

1

2

3

7

2

3

4

165

MC = 3 cases Calculez le nombre de défaut de page en appliquant FIFO

1 1 1 7 7 7 3 3 3 6 6 2 2 2 5
1
1
1
7
7
7
3
3
3
6
6
2
2 2
5
5
5
4
4
4
5
3 3
3
2
2
2
1
1
1

.

.

1 1 1 1 5 5 5 5 5 5 5 2 2 2 2
1
1
1
1 5
5
5
5
5
5
5
2
2
2 2
2
2
4
4
4
4
3
3
3
3
3
3
1
1
1
7
7
6
6
7
7
7
6

1.3.2 L’algorithme (Lost Recently Used)

Cette stratégie est basée sur la supposition suivante : une page qui a été utilisée plusieurs fois récemment va encore l’être à l’avenir et une page qui ne l’a pas été ne le sera pas. Cette supposition n’est pas toujours possible mais qui soutient si on considère la cas des boucles, des variables et des tableaux.

Application :

Appliquer LRU sur cette chaîne en utilisant :

A°/ 3 cases B°/ 4 cases 0 1 2 3 1 3 4 0 1
A°/
3 cases
B°/
4 cases
0
1
2
3
1
3
4
0
1
0
4
0
1
1 er Cas
1
0 0
3
3 3
3
3
1
1
1
2
2
1 1
1
1 1
1
0
0
0
0
0
1
2
2
2 2
4
4
4
4
4
4
4

.

.

2 ieme Cas

1 1 1 1 5 5 5 5 1 1 1 2 2 2 2
1
1
1 1
5
5
5
5
1 1
1
2
2 2
2
2
2
2
2 5
6
3 3
3
3
3
3
3 3
5
7
7
4
7
7
4
4 4

1.3.3

L’algorithme optimal

Il consiste à remplacer la page qui ne sera jamais référencée ou qui sera référencé dans le futur le plus lointain

Application :

Appliquer l’algorithme optimal sur cette chaîne

0 1 2 3 1 3 4 0 1 2 4 1 0 1 .
0
1
2
3
1
3
4
0
1
2
4
1
0
1
.
0
0 0
0
0 0
0
0
0
0
3
1 1
1
1 1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
3
4
4
4
3
4
4
4
.
Remarque :
En cas d’arrêt, on choisit la page ayant le plus petit numéro
1.3.4 L'algorithme de l'horloge

Application :

Appliquer sur la même chaîne en utilisant :

A°/ 3 cases B°/ 4 cases 0 1 2 3 1 3 4 0 1
A°/
3 cases
B°/
4 cases
0
1
2
3
1
3
4
0
1 er Cas
0
0
0 3
3 3
3
1
1
1 1
1 1
0
0
2 4
2 2
4
4
1 0 4 0 1 1 1 1 1 1 1 1 0 0 4
1
0
4
0
1
1
1
1
1
1
1
1
0
0
4
4
4
4
3
4
2
2
2
0
0
0

3

Il permet de remplacer la page ayant le bit de référence (R=0=. A chaque nouvelle référence (R=1) au bout de trois temps d’horloge (trois opérations de remplacement) le bit R=0. En cas d’égalité de bit entre plusieurs pages, on fait recours à l’algorithme FIFO.

Exemple : 0 0 0 0 0 0 4 0 4 4 4 4 4
Exemple :
0
0 0
0 0
0 4
0 4
4
4
4
4
4
1 1
1 1
1 1
1 1
1
1
1
1
1
2
2 2
2 0
2 0
0
0
0
0
0
3 3
2
3 3
3 3
2
2
2
3
.

2

Conception des systèmes segmentés

2.1 Allocation et récupération des segments

Dans les systèmes paginés, le principal traitement est basé sur les politiques de remplacement de pages alors que dans les systèmes segmentés aucun algorithme n’est défini.

Tout d’abord, en ce qui concerne l’étape de recherche d’une zone libre, dans le système paginé, il suffit de trouver une case libre alors que dans un système segmenté, il faut chercher un segment de taille suffisante. On suppose donc que les structures gérant l’espace libre en mémoire ne sont pas les mêmes puisqu’il faut connaître la taille de chaque zone.

2.2 Structure de données pour la gestion des segments libres en mémoire

On distingue plusieurs manières de gérer les espaces libres en mémoire centrale, les plus connues étant la liste chaînée et la table de bits introduites lors de la présentation de la gestion du disque dur. La table de bits ne peut s'appliquer pour des systèmes segmentés car on a besoin de connaître les adresses de début et de fin du segment en plus de son occupation. Une structure de table n'est pas envisageable car on ignore le nombre de segments en mémoire. Initialement la mémoire centrale est fractionnée au fur et mesure que des segments logiques y sont placés et libérés.

3 La segmentation avec pagination

Les segments étant très volumineux comparés au pages, au lieu de déplacer un segment entier sur le disque en cas de besoin, on a eu recours à la segmentation paginée afin de ne retirer qu'une partie des segments. L'intérêt de ce choix est dicté par la taille que peut prendre un segment étant donnée que le temps de recopie sur le disque est important.

Chaque segment est découpé en pages de longueurs fixes. Le nombre de pages sera différent d'un segment à un autre selon la taille du segment.

Le tait de disposer de pages nécessite une table pour décrire ces pages : on utilise ainsi une table des segments et une table des page pour chaque segment.

3.1 Conversion des adresses

Une adresse logique à la forme (S, P, D) un numéro de Segment, un numéro de Page et un Déplacement. Le numéro de segment permet de retrouver son adresse de début grâce à la table

des segments. Le numéro de page permet en accédant à la table des pages de savoir si la page est en mémoire et auquel cas dans quelle case.

Il faut toutefois préciser que chaque segment dispose de sa propre table des pages puisqu'il constitue un espace d'adressage à part entière.

Chapitre 6 :

Systèmes de gestion des fichiers

Introduction

Le système de gestion de fichiers (SGF) est la partie la plus visible d’un système d’exploitation. Le système de fichiers est un élément essentiel des systèmes d’exploitation moderne : il permet d’accéder à divers périphériques tels que le disque dur, le lecteur de disquette, de CD-ROM et de DVD.

Le SGF a pour principal rôle de gérer les fichiers et d’offrir des primitives pour les manipuler.

La mémoire secondaire de l’ordinateur est constituée de supports magnétiques tels que les disques. Pour le système d’exploitation, un support magnétique contient des fichiers et il a pour charge d’établir une correspondance entre cette notion logique de fichier et le secteur physique sur lequel le fichier est recopié. On rappelle que physiquement, ce sont des bits qui sont inscrits sur les supports et que le système d’exploitation permet de manipuler ces bits en les présentant sous forme de fichiers à l’utilisateur. Chaque fichier a un nom qui permet de le reconnaître.

1 Le codage des données

Chaque support de stockage que ce soit le disque situé dans le boîtier de la disquette ou un des plateaux dans le disque dur, est recouvert d’une fine couche magnétique destinée au stockage des informations. Ce sont les variations d’un champ magnétique qui permettent de lire et d’écrire sur le support.

Sur un support magnétique, on écrit des informations en binaires donc constituées de 0 et de 1. Ce qui facilite le codage car ces valeurs sont codées en utilisant des impulsions. Il n’y aurait pas eu le système binaire, on n’ose imaginer comment on aurait fait pour coder les chiffres de 0 à 9.

2 Le formatage d’un support magnétique

Il faut préciser qu’il existe deux types de formatage : un formatage de bas niveau opéré à l’usine et un formatage de haut niveau que l’utilisateur peut effectuer autant de fois qu’il le souhaite.

2.1

Le formatage de bas niveau

Il est réalisé en usine et il consiste à tracer les pistes et les secteurs sur les plateaux. Il faut préciser que selon le formatage, les pistes peuvent toutes avoir la même taille de données ou non.

Un formatage standard définira des pistes de même taille, en laissant tout simplement des zones inoccupées. Un formatage plus complexe, donnera un nombre de plus en plus petit de secteurs par pistes au fur et à mesure qu’on se dirige vers le centre.

2.2 Le formatage de haut niveau

Le formatage de haut niveau consiste à organiser les pistes et les secteurs d’une manière compréhensible par le système d’exploitation. Avant d’utiliser une disquette il faut la formater, et nul n’ignore qu’une disquette formatée sous Dos ne peut être lue sous Unix. Cela est plus clair à présent car chaque système organise ses pistes et ses secteurs à sa manière. Si l’on veut être plus précis, un système d’exploitation peut décider que l’unité d’allocation n’est pas le secteur mais un ensemble de secteurs. Par exemple un secteur peut être lu en même temps que celui qui est en dessous sur l’autre face de plateau. Le système d’exploitation peut alors décider de les allouer en même temps à un fichier.

Lors du formatage de haut niveau, le système d’exploitation crée les structures qu’il va utiliser pour gérer et organiser les fichiers et les répertoires.

3 Le partitionnement du disque

Le partitionnement d’un disque dur consiste à le diviser en partitions. La partition est une zone du disque qui peut être considérée comme un disque logique à part. chaque partition peut recevoir un système d’exploitation différent.

La commande externe DOS FDISK permet de partitionner un disque dur en plusieurs lecteurs et de spécifier pour chacun la taille et le type de système de fichiers. On distingue des logiciels de partitionnement tel que « Magic partition » qui a le mérite, en plus du partitionnement, de pouvoir restructurer la taille d’une partition en la réduisant ou en l’augmentant. La plupart des systèmes d’exploitation fournissent un administrateur de disques avec lequel on peut créer et gérer des partitions.

Une fois le disque partitionné, chaque partition doit être formatée pour le système d’exploitation qui va la gérer.

Remarque :

Une partition est destinée à recevoir un système d’exploitation, des logiciels ou des fichiers. L’utilisateur peut choisir le système de fichiers qu’il souhaite à condition qu’il soit compatible avec le système installé sur la machine. Les plus connus sont les systèmes FAT16 (File Allocation Table), NTFS et FAT32.

Exemple :

FAT16 : Le système d’exploitation Ms-Dos utilise ce système, c'est-à-dire que les numéros de clusters s’écrivent sur 16 bits. (Un cluster est un ensemble de secteurs et le nombre de secteurs varie d’un système d’exploitation à un autre).

FAT32 est pris en charge par Windows 95 et les versions qui ont suivis. Les numéros de clusters s’écrivent sur 32 bits et les partitions peuvent atteindre 2 TO. Avec les nouveaux disques, la limite des 2 GO est vite devenue complètement absurde.

NTFS fourni avec NT (NT File System) est conçu pour gérer des disques avec une capacité supérieure à 400 MO. Il autorise les noms de fichiers longs. Quand un volume est formaté avec NTFS, il est possible de choisir la taille d’un cluster : 512 octets, 1024 ou 2048 octets.

4 Le concept de fichier

Un système de fichiers est la partie la plus visible du système d’exploitation, il doit par conséquent se doter d’une interface simple à manipuler. Il est clair que le système d’exploitation doit présenter le stockage des données sur le disque d’une manière plus simple aux utilisateurs. De ce fait, on retrouve dans SGF la notion de fichier et de répertoire.

Un fichier est une unité de stockage logique mise à la disposition des utilisateurs pour l’enregistrement de leurs données : c’est l’unité d’allocation. Le système d’exploitation établit la correspondance entre le fichier et le système binaire utilisé lors du stockage de manière transparente pour les utilisateurs. Dans un fichier on peut écrire du texte, des images, des calculs, des programmes … Les fichiers sont généralement créés par les utilisateurs. Toutefois certains fichiers sont générés par le système ou certains outils comme les compilateurs. Afin de différencier les fichiers entre eux, chaque fichier a un ensemble d’attributs qui le décrivent ? Parmi ceux-ci on retrouve : le nom, l’extension, la date et l’heure de sa création ou de sa dernière modification, la taille, la protection. Certains attributs sont indiqués par l’utilisateur, d’autres sont complétés par le système d’exploitation.

5 Le concept de répertoire

Un répertoire est une entité créée pour l’organisation des fichiers. En effet, on peut enregistrer des milliers, voire des millions de fichiers sur un disque dur et il devient alors impossible de s’y retrouver. Avec la multitude des fichiers créés, le système d’exploitation a besoin d’une organisation afin de structurer ces fichiers et de pouvoir y accéder rapidement. Cette organisation est réalisée au moyen de répertoires également appelés catalogues ou directory. Un répertoire est lui-même un fichier puisqu’il est stocké sur le disque et est destinés à contenir des fichiers.

On distingue plusieurs structures pour les répertoires : la structure plate à un niveau, la structure à deux niveaux et la structure arborescente qu’on appelle ainsi car elle rappelle la structure de l’arbre généalogique.

Dans la structure plate, on dispose de plusieurs répertoires mais chacun d’eux ne peut contenir que des fichiers.

Dans la structure à deux niveaux, chaque utilisateur dispose de son propre répertoire dans lequel il peut conserver des fichiers et des répertoires. Cependant ces sous-répertoires ne peuvent contenir que des fichiers.

La structure arborescente contient un nombre arbitraire de niveaux et chaque répertoire peut contenir des fichiers et des sous répertoires. On introduit ici la notion de chemin à partir de la racine.

Du point de vue du SGF, un répertoire est un fichier qui dispose d’une structure logique : il est considéré comme un tableau qui possède une entrée par fichier. L’entrée du répertoire permet d’associer au nom du fichier qui est un nom externe, les informations stockées en interne par le SGF.

6

Les taches d’un SGF

Un système de gestion de fichiers effectue généralement les taches suivantes :

-

La donnée d’une interface conviviale pour manipuler les fichiers : étant la partie la plus visible du système d’exploitation le SGF doit offrir des commandes et des attributs simples pour manipuler et décrire les fichiers

-

Le stockage des fichiers sur le disque dur

-

La gestion de l’espace libre sur le disque dur

-

La gestion des fichiers dans un environnement multi-utilisateurs

-

La donnée d’utilitaires pour le diagnostic, la récupération en cas d’erreurs, l’organisation des fichiers.

7

L’organisation des fichiers sur le disque

7.1 Techniques d’allocation des blocs sur le disque

7.1.1 Allocation contiguë

C’est le mode d’allocation le plus implicite, pour chaque fichier à enregistrer le système recherche une zone suffisamment grande pour accueillir le fichier. Le fichier sera constitué de plusieurs blocs contigus.

En apparence le principal avantage de cette méthode est la rapidité lors de l’accès. Les inconvénients de cette méthode sont :

- La difficulté de prévoir la taille qu’il faut réserver pour le fichier.

- La perte d’espace sur le disque : si nous prévoyons trop d’espace, le fichier risque de ne pas l’utiliser en entier.

7.1.2 Allocation chainée

Elle consiste à allouer des blocs chaînés entre eux aux fichiers. Un fichier peut désormais être éparpillé sur le disque puisque chaque bloc permet de retrouver le bloc suivant.

Les avantages de cette méthode sont l’élimination de la fragmentation externe puisque tous les blocs peuvent être alloués. Par ailleurs, elle ne nécessite pas de structure de données spéciale. En revanche, les inconvénients sont aussi multiples :

- L’accès au fichier est séquentiel. On doit toujours commencer le parcours à partir du début du fichier même si on a récemment chargé les blocs.

- La perte d’un chaînage entraîne la perte de tout le reste du fichier.

7.1.3 Allocation indexée

Tous les inconvénients de l’allocation chaînée peuvent être résolus d’une manière simple : il suffit de retirer les pointeurs des blocs et de les placer dans un structure de données gardée en mémoire centrale ainsi l’information sur les numéros de blocs peut être obtenue à tout moment.

7.2 La création d’un fichier par le système d’exploitation

Un fichier et un répertoire sont tous les deux crées en suivant les mêmes étapes :

- La création d’une structure de données pour décrire le fichier. Tout fichier doit être décrit afin que le système puisse le connaître et le reconnaître.

- La création du fichier proprement dit. Cela consiste à allouer au fichier un certain nombre de blocs sur le disque selon sa taille. Le contenu d’un bloc sera différent selon qu’il s’agit d’un fichier ou d’un répertoire.

7.3 Structure de données pour les fichiers et les répertoires

7.3.1 Le système d’exploitation MS-DOS

Le répertoire racine

MS-DOS utilise une structure de données : le répertoire racine afin de contenir les fichiers et les répertoires. Le répertoire racine est enregistré sur le disque dur à un emplacement fixe. Chaque disque formaté avec MS-DOS contient un répertoire racine et des sous-répertoires. Tous ces répertoires ont la même structure et chaque entrée d’un répertoire a une taille de 32 octets et à la structure suivante :

Nom du fichier

Attributs

Adresse du premier bloc du fichier ou du répertoire

La FAT

C’est un tableau connu sous le nom de table d’allocation des fichiers FAT (File Allocation Table). MS-DOS ne gère pas individuellement les blocs, il alloue aux fichiers des clusters qui sont constitués d’un ensemble de secteurs.

Selon l’exemple cité ci-dessous, l’entrée du répertoire indique que le fichier commence au cluster numéro 2. En consultant ce tableau, nous retrouvons la suite des

numéros de clusters qui composent le prog.c : 5 6.

Soit le fichier prog.c décrit par l’entrée suivante dans le répertoire racine

Prog.c

……

……

2

Numéro du cluster

Valeur

2

5

3

0

4

0

5

6

6

FFFFh

7

8

8

FFFFh

9

0

10

0

11

0

12

0

13

0

14

0

15

0

16

0

17

0

Structure de la FAT

7.3.2 Le système d’exploitation Unix

Le système Unix utilise une structure de données bien particulière qui lui est propre afin de décrire les fichiers : c’est le nœud d’index appelé en anglais I-Node.

Un nœud d’index est constitué d’attributs décrivant le fichier ou le répertoire et d’adresses de blocs contenant des données, il occupe 64 octets. Cette structure permet au système de disposer d’un certain nombre de données sur le fichier :

- La taille,

- L’identité du propriétaire, du groupe et les droits d’accès au fichier,

- Les dates de création, de dernière consultation et de dernière modification,

- Le nombre de références existant pour ce fichier dans le système,

- L’adresse de blocs physiques. Ces blocs physiques contiennent soit les données du fichier, soit l’adresse d’autre blocs physiques (on parle alors de bloc d’indirection).

Adresse sur le disque du premier bloc associé au fichier

Bloc d’indirection simple

premier bloc associé au fichier Bloc d’indirection simple 256 adresses de blocs sur le disque Bloc

256 adresses de

blocs sur le disque

d’indirection simple 256 adresses de blocs sur le disque Bloc d’indirection simple Taille Date de création
d’indirection simple 256 adresses de blocs sur le disque Bloc d’indirection simple Taille Date de création

Bloc d’indirection simple

adresses de blocs sur le disque Bloc d’indirection simple Taille Date de création Compteur de liens

Taille

Date de création

Compteur de liens

UID

GID

………

Adr 1

Adr 2

………

………

Adr 10

PS

PD

PT

……… ……… Adr 10 PS PD PT Bloc d’indirection double 256 adresses de blocs

Bloc d’indirection double

Adr 10 PS PD PT Bloc d’indirection double 256 adresses de blocs d’indirection simples Bloc
256 adresses de blocs d’indirection simples
256 adresses de
blocs d’indirection
simples

Bloc d’indirection triple

Bloc d’indirection Bloc d’indirection double simple
Bloc d’indirection
Bloc d’indirection
double
simple
Bloc d’indirection Bloc d’indirection double simple 256 adresses de blocs d’indirection doubles Structure

256 adresses de blocs d’indirection doubles

Structure d’un I-Node

7.3.3 Le système d’exploitation Windows NT

Le système d’exploitation Windows NT propose plusieurs systèmes de gestion de fichiers qui lui est propre : NTFS NT File System et les systèmes FAT16 et FAT32.

NTFS utilise une structure de données organisée en table nommée Master File Table MFT pour gérer les fichiers (table des fichiers maître). Elle contient des informations détaillées sur les fichiers et les répertoires. Lorsque ces derniers ont une taille réduite, elle contient les fichiers et les répertoires eux-mêmes.

Chaque entrée peut contenir 2KO d’informations. Cette valeur assez élevée permet de stocker dans une entrée un fichier si sa taille est inférieure à 1,5 KO (en supposant que les 500 octets restants sont utilisés pour décrire le fichier). L’avantage de cette organisation est l’accès direct au fichier.

Quand les fichiers sont volumineux, l’entrée incluse en pointeur vers des clusters contenant les données.

Les fichiers sont décrits par NTFS à l’aide des attributs suivants :

- Le nom du fichier

- Un entête de description

- Un descripteur de sécurité

- Les données

entête

attributs

Nom du fichier

données

Attributs de sécurité

Structure d’une entrée de la MFT

Lorsqu’il s’agit d’un répertoire, le champ données décrit un ensemble de fichiers et conserve pour chaque fichier le nom du fichier et le numéro de l’entrée où il est placé.

Les grands répertoires quant à eux ont dans leur champ données un pointeur vers un cluster qui stocke les noms des fichiers ainsi que leur numéros.

entête

attributs

TP

<TP-SE,48> <RAPPORTS, 49> <TP-VB, 31> <Readme.txt, 218> <Machin.doc, 228> <C-Rendu.txt, 229> <prog.c, 312> <# # # #>

<Readme.txt, 218> <Machin.doc, 228> <C-Rendu.txt, 229> <prog.c, 312> <# # # #>

Chapitre 7 :

Le système des entrées-Sorties

Introduction

Les entrées-sorties sont une composante principale de l'ordinateur puisqu'une grande partie d'entre elles est en relation avec l'utilisateur. Pour cela leur interface doit être simplifiée au maximum par les systèmes d'exploitation. Un périphérique se commande et c'est la tâche du système d'exploitation de fournir une couche appelée système d'entrée-sortie dont le rôle est de contrôler le ou les périphériques jusqu'au moindre détail tout en offrant des commandes de haut niveau pour les utilisateurs.

1 Fonctionnement des périphériques

1.1 Structure d'un périphérique

Un périphérique est composé du périphérique lui-même et de composants électroniques pour le commander donc d'une partie mécanique et d'une autre électronique. A titre d'exemple, dans un disque dur les plateaux, les têtes de lecture/écriture, le bras ainsi que le moteur constituent la partie mécanique. La partie électronique est appelée contrôleur de périphérique. On l'appelle ainsi car elle contrôle le périphérique à la place du processeur. Le contrôleur est une carte composée de circuits qu'on relie au périphérique. Sans contrôleur, le processeur devrait se charger lui-même de tous les périphériques. Un même contrôleur peut gérer plusieurs périphériques de même type.

1.2 Les types de périphériques

Il existe globalement deux types de périphériques : les périphériques bloc et les périphériques caractères.

Les périphériques bloc effectuent un adressage par bloc, c'est-à-dire la quantité minimale manipulée est le bloc. Le disque dur est un périphérique bloc.

Les périphériques caractère manipulent un flot de caractères. Ils ne permettent pas d’adresser une zone directement puisque l’accès est séquentiel. Nous citons les terminaux et les imprimantes, on n’écrit pas au milieu de la page ou de l’écran sans commencer à partir du début.

Remarque :

Certains périphériques ne rentrent dans aucune de ces catégories. L’horloge ne manipule ni bloc ni caractère.

1.3

Les contrôleurs de périphériques

En réalité, le processeur ne communique pas directement avec les périphériques :

ceux-ci sont reliés à des contrôleurs de périphériques et c'est avec eux que le processeur dialogue. Par exemple Si le processeur veut écrire une donnée sur le disque dur, il le demande au contrôleur de disque dur et c'est ce dernier qui se débrouille pour effectivement satisfaire la demande du processeur. Le processeur transmet alors la donnée à écrire au contrôleur, qui la stocke et la transmet au disque dur le moment venu.

Ce relais de l'information par des contrôleurs permet déjà de s’abstraire des spécificités des périphériques : une partie de ces spécificités n'est connue que du contrôleur. Cela permet par exemple de développer des périphériques très différents les uns des autres sans qu'il y ait de problème majeur pour les insérer dans un ordinateur. Cela permet aussi de renouveler les périphériques d'un ordinateur sans avoir à réinstaller le système.

On distingue plusieurs contrôleurs dans un ordinateur, les plus connus sont le contrôleur de disque, le contrôleur de mémoire RAM, de mémoire cache, le contrôleur de carte vidéo, le contrôleur de clavier, d'écran, le contrôleur de bus.

Nous concluons de ces exemples que le contrôleur effectue principalement les tâches suivantes :

- recevoir les requêtes d'entrée-sortie à effectuer

- effectuer l'entrée-sortie en plusieurs étapes Si cela est nécessaire

- traduire les ordres du système en des signaux compréhensibles par le périphérique :

identifier les caractéristiques du périphérique, effectuer les calculs nécessaires à la réalisation de l'entrée/sortie.

- corriger les éventuelles erreurs.

Pour ce faire la carte du contrôleur se compose d'un circuit intégré pour la commande électronique, de registres destinés à accueillir les commandes à exécuter et à stocker temporairement les données avant leur transfert en mémoire centrale et vice-versa.

1.4 Interaction entre le système d'exploitation et le contrôleur

Le système d'exploitation dialogue avec le contrôleur à travers le bus. Il lui transmet les paramètres de l'entrée/sortie et ce dernier les stocke dans ses registres. Le contrôleur une fois qu'il a reçu l'information, génère les signaux adéquats, en effet le rôle du contrôleur est de transformer les signaux compris par l'unité centrale en signaux électriques compris par le périphérique et vice-versa.

Le système d'exploitation place des commandes et des paramètres dans les registres, par exemple : read, write. Une fois que la commande est acceptée par le contrôleur, il peut exécuter la commande : le processeur n'a plus besoin d'intervenir et peut s'occuper d'une autre tâche. Une fois que le contrôleur a fini, le processeur reprend le contrôle et le système d'exploitation prend la main, il va aller tester les résultats du déroulement de l'entrée-sortie à travers le contenu des registres.

2

Le sous-système d’entrée-sortie

2.1 La couche système

Le principal objectif de cette couche est de fournir une interface uniforme à la couche au dessus à savoir les programmes utilisateurs en leur cachant le lien avec le matériel.

Une requête d’entrée-sortie va être construite par la création d’un IOCB (input output control block). C’est une structure qui contient des informations décrivant l’entrée-sortie parmi lesquelles :

- Le type d’opération lecture ou écriture,

- Ce qu’on appelle la longueur de l’entrée-sortie c'est-à-dire le nombre de caractères à transférer par exemple,

- L’adresse d’une zone tampon en mémoire destinée à accueillir les données.

- D’autres informations complémentaires

2.2 Les pilotes périphériques

On distingue généralement un pilote par type de périphérique. Il est à noter que désormais, la plupart des pilotes sont réalisées par le fabriquant plutôt que par les concepteurs du système, de part le trop grand nombre de périphériques différents. Ces pilotes sont chargés par le système au démarrage et sont exploités de la même façon que les autres, en ce qui concerne la partie gérant le matériel.

Tout comme le système d’exploitation est le seul à connaître l’adresse du périphérique, à son tour le pilote est le seul à connaître les paramètres à ajuster c'est-à-dire les caractéristiques du périphérique.

Un pilote de périphérique est constitué de routines qui s’appellent les unes les autres. Le rôle du pilote est décrit ci-dessous :

- Traduire la requête à partir de l’IOCB en termes concrets.

- Lancer le contrôleur et se mettre de la fin de l’entrée-sortie.

- Une fois l’entrée sortie terminée, le périphérique génère une interruption. La procédure de traitement des interruptions est lancée. Elle va identifier la source de l’interruption, elle saura donc quelle est l’unité qui a généré l’interruption et par conséquent le traitement à entreprendre et le pilote associé sont réveillés. Il vérifie le statut de l’entrée-sortie. Il traite les erreurs non résolues par le contrôleur, par exemple il effectue une nouvelle tentative. Si l’entrée-sortie ne s’est toujours pas réalisée, il informe la couche système qui informe à son tour le processus appelant.

3

Etude de cas : le périphérique disque dur

3.1 L'entrelacement des blocs

Lorsque le contrôleur effectue une entrée-sortie DMA, il met un certain temps pour transférer le secteur lu vers la mémoire. Or durant ce temps, le disque continue de tourner. Si le contrôleur ne peut effectuer une entrée et une sortie en parallèle, le secteur suivant ne peut être lu durant le transfert vers la mémoire. Si le temps de transfert vers la mémoire est égal au temps de lecture d'un secteur du disque, il faut deux rotations du disque afin de lire toute une piste. Le secteur de numéro suivant ne doit passer sous la tête de lecture qu'une fois que le contrôleur a fini le transfert du secteur précédent. Une solution serait que les numéros de secteurs ne soient pas consécutifs, afin que le secteur suivant ne défile sous la tête qu'une fois la fin du transfert.

On appelle entrelacement le lait de sauter des numéros de secteurs afin que le contrôleur puisse les lire dans un ordre normal. Cette numérotation spéciale est réalisée au formatage du disque en tenant compte du facteur d'entrelacement. Un facteur d'entrelacement de 1 désigne le saut d'un secteur à chaque fois. Ce facteur est lié au temps nécessaire au contrôleur pour effectuer son transfert vers la mémoire. Il est clair que si le contrôleur met plus de temps, il faut prévoir un facteur de 2.

La figure suivante illustre un disque avec les numéros de secteurs numérotés de 0 à 11. Sans entrelacement après un tour complet le contrôleur n'aura pu lire que les secteurs n° 0 2 4 6 8 10. Au tour suivant, il lira les secteurs 1 3 5 7 9 11. Avec un facteur simple, le contrôleur laissera passer un secteur et lira le suivant. Avec un facteur d’entrelacement double, il laissera passer deux secteurs pour lire le secteur suivant.

laissera passer deux secteurs pour lire le secteur suivant. 3.2 Notion de cache disque Certains concepteurs

3.2 Notion de cache disque

Certains concepteurs ont eu l'idée d'appliquer le principe du cache pour le contenu d'une piste. Quand les requêtes d'entrées-sorties sont très nombreuses, il devient fréquent d'avoir des accès à des secteurs voisins donc appartenant à une même piste. Le principe du cache pour les pistes est de copier le contenu de toute la piste dans le cache. Ainsi des requêtes futures pour des secteurs de cette piste éviteront d'accéder au disque. Le cache fait partie du contrôleur.

De nos jours les contrôleurs sont tellement rapides, qu'en un seul accès ils peuvent recopier toute la piste dans leur zone tampon.

3.3 La prise en compte des erreurs

Les erreurs doivent être traitées par le composant le plus proche donc par Je contrôleur. Parmi les erreurs qui peuvent survenir, nous citons :

- Les erreurs de positionnement du bras : le contrôleur peut se tromper dans les paramètres qu'il utilise pour accéder à une piste donnée.

- Les erreurs de programmation : Si le pilote demande au contrôleur d'accéder à une piste ou à un secteur qui n'existe pas le contrôleur doit être capable de déceler l'erreur et de la signaler.

- La rencontre d'un bloc endommagé : Le contrôleur doit ne pas l'utiliser ou en utiliser un autre

- Les erreurs de lecture : elles peuvent être dues à la présence d'une poussière sur la surface du plateau.

du périphérique,

3.4 Ordonnancement des requêtes d'entrées-sorties

Quand on doit effectuer un transfert de ou vers le disque dur, le temps total cumulé dépend du temps nécessaire pour positionner la tête de lecture/écriture sur le bon cylindre (appelé temps de recherche) et du temps passé à attendre que le secteur passe sous la tête afin de lire les octets (appelé temps de rotation, en moyenne la moitié d 1 un tour) et enfin le temps pour le transfert.

3.5 Algorithme FIFO

Comme l'indique son nom, la requête arrivée en premier est exécutée en premier.

Exemple :

Si la tête est positionnée dans le cylindre 10 et on souhaite lire les secteurs appartenant aux pistes 1, 9, 8, 26, 13, 23. Dans ce cas, le bras va effectuer un déplacement qui va couvrir 9 + 8 + 1 + 18 + 13 + 10 = 59 cylindres.

3.6 Algorithme Plus court déplacement ou plus court temps de recherche (PCD)

Cet algorithme s'appelle en anglais SSTF (Shortest Seek Time First). Le contrôleur sert la requête qui est la plus proche de celle qui vient d'être traitée. Si l'on ordonnance ces requêtes en essayant de minimiser les déplacements par rapport à la position courante, on obtient un accès dans cet ordre 10, 9, 8, 13, 23, 26, 1 soit un déplacement qui couvre 1 + 1 + 5 + 10 + 3 + 25 = 45 cylindres, ce qui représente une amélioration notable par rapport à

FIFO.

Cet algorithme peut provoquer des situations de famine si la plupart des requêtes se situent dans un même espace et qu'il existe une ou deux requêtes plus loin, celles-ci ne seront traitées que très tard. Par conséquent, cet algorithme n'est pas équitable.

3.7 Ordonnancement selon l'algorithme de l'ascenseur (SCAN)

Cet algorithme est utilisé également pour les ascenseurs dans les grands buildings, où on sert les requêtes en maintenant un seul sens de déplacement (vers le haut ou le bas pour les ascenseurs> vers l'extérieur où vers l'intérieur (pour les disques) jusqu'à ce qu'il n'y ait plus de requêtes dans le sens choisi. Cet algorithme garantit une certaine équité. On dit qu'il applique un balayage de bout en bout et est connu sous le nom de SCAN.

Le pilote mémorise un bit de sens (haut ou bas) qui indique la direction que le contrôleur doit privilégier. Ainsi, il traite toutes les requêtes dans un sens, puis, quand il n'y a plus de requête dans ce sens (le bras est donc vers une extrémité), on inverse le bit et on traite les requêtes situées de l'autre côté du bras. On est donc sûr de traiter rapidement toutes les requêtes.

Pour cet exemple, supposons que le sens de déplacement du bras était vers l'intérieur. Servir les requêtes 1, 9, 8, 13, 26, 23 en partant de la 10 va donner l'ordre suivant 10 13 23 26 9 8 1 soit un déplacement de 3 + 10 + 3 + 17 +1 + 7 = 41 cylindres.

La différence n'est pas très significative mais l'avantage de cet algorithme est qu'il est indépendant du nombre des requêtes et équitable. Le déplacement du bras est égal à maximum deux fois le nombre de cylindres. Donc deux fois le temps nécessaire pour aller du cylindre du centre vers celui le plus à l'extérieur.

On distingue une autre variante à cet algorithme qui est connue Sous le nom de C- SCAN. Elle consiste à parcourir les cylindres toujours dans le même sens. Après le dernier cylindre, le bras retourne au premier. Le temps de réponse s en trouve un petit peu amélioré. 10, 1, 8, 9, 13, 23, 26 soit un déplacement de 9 + 7 + 1 + 4 +10 + 3 = 34 cylindres.

Exemple :

On considère un disque dur présentant 160 pistes (de 0 à 159). On suppose que la tête de lecture/ecriture est positionnée dans la piste n°50 et que le dernier accès au disque a été effectué en piste 80 et que les requêtes arrivent dans cet ordre : 100, 40, 60, 120, 56, 30, 75, 2, 90, 140, 45.

Question : Quel serait le déplacement total de la tête lecture/écriture après avoir accéder à toutes ces pistes si l’algorithme de planification de déplacement est

a- SSTF PCD

b- SCAN Ascenseur

c- C-SCAN (balayage interne)

d- FCFS PAPS

a-

FCFS : 100, 40, 60, 120, 56, 30, 75, 2, 90, 140, 45

Déplacement : 50 + 60 + 20 + 60 + 64 + 26 + 45 + 73 + 88 + 50 + 95

b-

SSIF : 50 45 40 3056 60 7590 100 120140 2

Déplacement : 5 + 5 + 10 + 26 + 4 + 15 + 15 + 10 + 20 + 20 + 138 = 268

c-

SCAN : 50 / 45 / 40 / 80 / 2 / 56 / 60 / 75 / 90 / 100 / 120 / 140 Déplacement : 5 + 5 + 10 + 28 + 54 + 4 + 15 + 10 + 20 + 20 = 186

d-

S.SCAN : 0, 2, 30, 40, 45, 56, 60, 75, 90, 100, 120, 140