Cours
Cours
Il offre une suite de services généraux facilitant la création de logiciels applicatifs et sert
d'intermédiaire entre ces logiciels et le matériel informatique. Un système d'exploitation
apporte commodité, efficacité et capacité d'évolution, permettant d'introduire de nouvelles
fonctions et du nouveau matériel sans remettre en cause les logiciels.
CHAPITRE 1 : Histoire de l’informatique
Maintenant que l'électronique a fait des progrès suffisants et que les premiers calculateurs ont
fait leurs preuves, les ordinateurs vont pouvoir apparaître, nés du besoin de réaliser des
opérations de plus en plus complexes.
Entre 1834 et 1837, un mathématicien anglais du nom de Charles Babbage imagine les
concepts de la première machine à calculer programmable. Inventeur visionnaire, il s’appuie
sur les travaux de Blaise Pascal et jette les bases de ce que deviendront par la suite les
premiers ordinateurs, avec le principe de programmation par cartes perforées que l’on
retrouve déjà pour la production automatisée de musique par exemple. Il ne parvient
malheureusement pas à mettre son idée en application, les technologies de l’époque étant
encore très limitées, et sa machine différentielle ne verra jamais le jour.
Il faut alors attendre près d’un siècle pour qu’un autre mathématicien anglais du nom d’Alan
Turing ouvre une voie décisive dans l’histoire de la science informatique. Il publie en 1936
son article “On Computer Numbers with an Application to the Entscheidungsproblem” qui
permettra la construction des machines de Turing qui fédèrent les concepts d’ordinateur, de
langage de programmation et de programme informatique.
L’ère des ordinateurs modernes doit beaucoup aux avancées majeures effectuées pendant la
Seconde Guerre mondiale. Ainsi, l’invention des circuits électroniques, tubes à vide,
condensateurs et relais remplacèrent la génération de composants mécaniques et le calcul
numérique remplaça le calcul analogique. Les ordinateurs conçus et produits à cette époque
forment ce que l’on appelle la première génération d’ordinateurs.
Pendant la seconde guerre mondiale, le Royaume Uni fit de grands efforts à Bletchley Park
pour déchiffrer les codes des communications militaires allemands. Le principal système de
chiffrement allemand, Enigma fut attaqué avec l’aide de machines appelées bombes, créées
par les services secrets polonais et améliorées par les britanniques.
Alain Mathison Turing ouvre la voie de la création de l’ordinateur programmable dès 1936,
en publiant son article. Il décrit sa propre machine dite de Turing, premier calculateur
universel programmable, et invente au passage les concepts de programmation et de
programme. Ces machines permettant de trouver les clés de chiffrement. Les allemands
créèrent également une autre série de systèmes de chiffrement très différents d’Enigma. Afin
de casser ces systèmes, le professeur Max Newman fabriqua le Colossus ou la bombe de
Turing qui fut démonté et caché à cause de son importance stratégique.
II- La micro-informatique
La micro-informatique désigne ce qui a rapport avec les micro-ordinateurs. Ce dernier terme
fut introduit par les développeurs du Micral (REE), pour désigner dans leurs brevets le
premier ordinateur ayant un microprocesseur comme unité centrale [réf. nécessaire], possibilité
ouverte par les progrès en matière de circuits intégrés.
Le préfixe micro- tient au fait qu'à cette époque, il existait déjà depuis les années 1940
des ordinateurs centraux qui tenaient dans de vastes salles machines et à partir de 1965
des mini-ordinateurs. Ce préfixe évoque le microprocesseur au cœur de la création et de la
commercialisation de micro-ordinateurs.
Dans le contexte de l'époque, la désignation du micro-ordinateur sous l'appellation
« ordinateur personnel » est à ce titre très précise. En effet, l'ensemble du micro-
ordinateur, c'est-à-dire l'unité processeur, la console clavier-écran et ses unités
périphériques (disques, imprimante), tenait sur une table et n'était à la disposition que d'un
utilisateur à la fois. En France, au début des années 1980, le terme « ordinateur
individuel » était aussi employé ; c'est d'ailleurs resté comme titre d'un magazine
informatique.
Depuis la fin des années 1970 jusqu'au début du XXIe siècle, la micro-informatique a eu
pour effet d'introduire l'informatique dans les petites et moyennes entreprises comme chez
les particuliers. Cette démocratisation aurait été considérablement ralentie si IBM avait
breveté les composants de son Personal Computer. En effet, l'apparition de machines
compatibles facilement extensibles et le marché de masse ont permis d'avoir des
composants génériques toujours plus puissants et bon marché. Cela a précipité la fin des
ordinateurs centraux et des mini-ordinateurs qui sont remplacés par des fermes de serveurs
voire par des grilles de calcul massivement parallèles ; et enfin cela a souvent permis
l'éclosion d'une industrie locale du logiciel dont la société Microsoft est le plus bel
exemple.
CHAPITRE 2 : Architecture des ordinateurs
I- Principe de fonctionnement d’un ordinateur
A- Le codage de l’information
L’information est représentée dans la mémoire de l’ordinateur par un bit (Binary Digit
généralement noté 0 et 1). Le système regroupant les deux valeurs est appelé système binaire
et permet de représenter un nombre, un caractère, les caractéristiques d’un pixel (point d’une
image), les caractéristiques d’un son et un code binaire. Une des fonctions des interfaces entre
l’unité centrale et les organes de communication Homme/machine consiste précisément à
traduire la représentation compréhensible par l’Homme (système décimal) en représentation
compréhensible par la machine (système binaire) et vice-versa.
L’information numérique est représentée soit dans le système décimal (système décimal), soit
dans le système binaire (système de la machine), soit dans un système intermédiaire (système
octal ou hexadécimal)
La conversion d’un entier naturel décimal (base 10) en binaire (base 2) se fait en procédant à
une division euclidienne successive de ce nombre et des quotients par 2 jusqu’à obtention de
zéro (0) comme quotient. Le nombre binaire est une suite des restes (0 et 1) en lisant du bas
vers le haut.
La conversion d’un nombre entier naturel binaire en décimal se fait en suivant la formule :
(bnbn-1…b2b1b0)2 = b0*20+…bn*2n.
Le système octal est constitué des digits 0,1,2,3,4,5,6,7 et le système hexadécimal des digits
0,1,2,3,4,5,6,7,8,9,A (pour 10), B (pour 11), C (pour 12), D (pour 13), E (pour 14), F (pour
15).
La conversion d’un nombre binaire en octal (hexadécimal) se fait en regroupant par trois
(quatre) de la droite vers la gauche, les digits binaires pour en faire un digit octal
(hexadécimal).
La conversion d’un nombre entier naturel octal (hexadécimal) se fait en remplaçant chaque
digit octal (hexadécimal) par trois (quatre) digits binaires.
BASE 8 BASE 16
000 = 0 0000 = 0
001 = 1 0001 = 1
010 = 2 0010 = 2
011 = 3 0011 = 3
100 = 4 0100 = 4
101 = 5 0101 = 5
110 = 6 0110 = 6
111 = 7 0111 = 7
1000 = 8
1001 = 9
1010 = A
1011 = B
1100 = C
1101 = D
1110 = E
1111 = F
Application
1-
2-
Soit la combinaison binaire suivante : (0101010101101110001000000110000101110011)2
Elle représente un message envoyé par un jeune étudiant à ses amis après avoir étudié à
l’école le cours sur les combinaisons binaires. Sur ce fait un de ses camarades vient te voir
pour que tu l’aides à comprendre ce message.
Après avoir décodé ce message, donnez les équivalents de ces caractères dans les bases 10 et
8.
3-
Après les examens de fin d’année, l’Office du BAC s’apprête à donner les résultats. Dans le
sourci de ne préserver les résultats jusqu’à leur délibération et d’éviter les fuites de données,
l’Office du BAC recrute un jeune étudiant en fin de formation pour le codage des résultats.
La secrétaire, étant parent d’un candidat et impatiente de connaitre le résultat de son fils, vous
amène cette combinaison binaire retrouvée devant le nom de son fils et qui signifie s’il a
échoué ou pas.
Voici le code (0100000101000100010011010100100101010011)2
Aidez-la à comprendre ce message afin de connaitre le résultat de son fils.
B- Les opérations de base
II- Le matériel
A- L’architecture de Von Neumann
L’architecture dite architecture de von Neumann est un modèle pour un ordinateur qui
utilise une structure de stockage unique pour conserver à la fois les instructions et les données
demandées ou produites par le calcul. De telles machines sont aussi connues sous le nom
d’ordinateur à programme enregistré. La séparation entre le stockage et le processeur est
implicite dans ce modèle.
Cette architecture est appelée ainsi en référence au mathématicien John von Neumann qui a
élaboré en juin 1945 la première description d’un ordinateur dont le programme est stocké
dans sa mémoire.
Alan Turing, John von Neumann ainsi que John William Mauchly et John Eckert (pendant
leurs travaux sur l’ENIAC), ont utilisé ce concept indépendamment.
En traitant les instructions de la même façon que les données, un ordinateur qui a un
programme stocké en mémoire peut facilement modifier les instructions. Une raison
importante ayant induit une telle possibilité était le besoin pour un programme d’incrémenter
ou modifier le champ adresse des instructions (pour faire des boucles par exemple). Cette
raison est devenue moins importante avec l'apparition de l’utilisation de registres d’index et
de l’adressage indirect en tant que caractéristique standard des processeurs.
L’architecture actuelle des ordinateurs rend inutile la modification à faible échelle des
instructions du programme — son « code » — car cela rendrait inefficaces les techniques de
gestion de l’antémémoire et du pipeline dans le processeur. Cette pratique est donc à ce jour
obsolète. Bien sûr, à une plus grande échelle, la possibilité de traiter des instructions de la
même manière que des données est ce qui permet l’écriture de compilateurs. C’est aussi une
caractéristique exploitée par les virus lorsqu’ils ajoutent une copie de leur propre code dans
un programme existant. Le problème de la copie de code non autorisée peut être évité par
l’utilisation d’un système de protection de la mémoire et, en particulier, par le gestionnaire de
la mémoire virtuelle.
Figure : Schéma de
l’architecture de
Neumann
B- Le processeur
Le processeur est le cerveau de l’ordinateur. C’est un composant électronique qui n’est autre
que le cœur pensant de l’ordinateur. Le CPU (pour Central Processing Unit en anglais) est
composé de deux parties de base à savoir : l’Unité de Contrôle et de Commande (UCC) et
l’Unité Arithmétique et Logique (UAL).
Sur la représentation graphique ci-contre, on distingue bien les quatre cœurs du processeur
Intel Core i7-2600K :
C- Les Mémoires
Mémoire Centrale
La mémoire centrale appelée également mémoire interne est une mémoire qui permet de
mémoriser temporairement les données lors de l’exécution des programmes. Nous en
distinguons essentiellement trois types, à savoir : la mémoire vive, morte et flash.
Mémoire Vive
La mémoire vive, généralement appelée RAM (Random Access Memory), est la mémoire
principale de l’ordinateur. Il s’agit d’un espace permettant de stocker de manière temporaire
les données lors de l’exécution d’un programme.
Mémoire Morte
La mémoire morte, aussi dénommée ROM pour Read Only Memory, est une mémoire qui
permet de stocker les données même quand elle n’est plus alimentée électriquement. Celle-ci
est accessible qu’en lecture seule d’où son nom.
Mémoire Flash
La mémoire Flash est une mémoire non volatile et réinscriptible, c’est-à-dire possédant les
caractéristiques d’une mémoire vive mais dont les données ne se volatilisent pas lors d’une
mise hors tension.
Mémoire de Masse
La mémoire de masse (appelée également mémoire physique ou mémoire externe), c’est une
mémoire qui permet de stocker des informations à long terme, y compris lors de l’arrêt de
l’ordinateur.
D- Le bus
On distingue :
Par extension, le terme bus est également employé dans les architectures de logiciels pour
désigner un composant de connexion logicielle (voir ORB, EAI, Middleware, etc.) : on parle
alors de bus logiciel.
Les bus sont situés à l'intérieur d'un même ordinateur et permettent de connecter les
différentes parties fonctionnelles de cet ordinateur entre elles. Un bus qui n'interconnecte que
deux dispositifs est appelé un port.
Les informations transmises peuvent être les informations utiles à échanger entre les
dispositifs ou des informations de contrôle permettant de gérer l'état du bus lui-même.
Un bus est souvent caractérisé par une fréquence et le nombre de bits d'informations qu'il peut
transmettre simultanément. Lorsqu'un bus peut transmettre plus d'un bit d'information
simultanément on parlera d'un bus parallèle, sinon d'un bus série. La fréquence donnée est
tantôt la fréquence du signal électrique sur le bus, tantôt la cadence de transmission des
informations, qui peut être un multiple de la fréquence du signal.
Les technologies utilisées pour fabriquer les bus sont variées, conducteurs électriques gravés
sur un circuit imprimé, câble, fibre optique etc.
Nous distinguons deux types de bus à savoir : le bus parallèle et le bus série.
Le bus parallèle
Matériel
D'un point de vue physique, ce type de bus est un ensemble de conducteurs électriques
parallèles. À chaque cycle de temps, chaque conducteur transmet un bit.
Ces bus ont donc une taille en nombre de conducteurs, et une taille en bits. Les tailles les plus
courantes (en bits) sont : 8, 16, 32, 64 ou plus. Lorsque l'on parle de la taille d'un bus, cela
signifie qu'il s'agit du nombre d'informations (ou bits) que le bus peut transmettre en un cycle,
non compté les informations de contrôle.
Certains conducteurs supplémentaires sont affectés à la transmission des signaux de contrôles
de l'état du bus.
Fonctionnement
Le bus sert à transmettre un entier informatique de la taille du bus. Les différents bits du bus
ont chacun un poids différent numéroté de zéro à N-1 où N est la taille du bus. Par exemple
pour un bus quatre bits on peut transmettre 16 valeurs différentes (24 = 16).
L'émetteur positionne au même instant tous les bits du bus. Au moment adéquat le composant
lecteur lira tous les bits en même temps. Cet instant adéquat peut être déterminé par un des
signaux de contrôle qui changera de valeur pour signaler au dispositif lecteur qu'il est temps
de lire les données sur le bus.
Ce type de bus souffre d'un défaut inhérent à son principe : bien que l'émetteur positionne
au même instant tous les bits, les câbles qui les transportent jusqu'au récepteur peuvent ne pas
avoir précisément les mêmes caractéristiques électriques (une nappe de conducteurs tordue
par exemple) ou pire encore ne pas avoir la même longueur : cela force l'émetteur à maintenir
l'état de chaque groupe de bits à transmettre pendant un temps suffisant pour garantir une
réception sans erreur à l'autre bout de la liaison, ce qui réduit le débit maximal d'information.
Le bus série
Matériel
Un bus série permet de transmettre les informations bit par bit. Toutefois il comporte plus
d'une ligne permettant de transmettre des informations par l'addition d'éventuel signaux de
contrôle et généralement par l'utilisation de deux lignes distinctes permettant ainsi à ces bus
d'être bidirectionnels afin de permettre la transmission d'information dans les deux directions
simultanément.
Fonctionnement
Le bus série transmettant les données bit par bit, il est nécessaire lorsque l'on veut par
exemple transmettre un mot de 32 bits de sérialiser l'information pour sa transmission. Le
lecteur devra effectuer l'opération inverse pour reconstruire le mot de 32 bits à partir des bits
reçus.
L'intérêt principal de ce type de bus (outre un câblage simplifié par rapport à un bus parallèle)
est que pour un coût moindre (grâce au peu de conducteurs de données) il permet - en faisant
appel à des composants électroniques de haute qualité - de dépasser les débits atteints par des
bus parallèles.
Définition
Types de périphériques
On peut classer généralement les périphériques en 3 types : les périphériques d'entrée, ceux de
sortie :
- Les périphériques d'entrée servent à obtenir des informations (ou données) pour le
système informatique tel que clavier (frappe de texte), souris (pointage), scanner
(numérisation de documents papier), micro, webcam, etc.
- Les périphériques de sortie servent à faire sortir des informations du système
informatique tel qu'écran, imprimante, haut-parleur, etc.
- On peut également rencontrer des périphériques d'entrée-sortie qui opèrent aussi bien
en écriture qu'en lecture : un disque dur, un lecteur/enregistreur de CD-ROM ou une
clé USB, par exemple, permettent aussi bien de stocker des données (sortie) que de les
lire (entrée).
La plupart des périphériques sont amovibles, c'est-à-dire qu'ils peuvent être déconnectés de
l'unité centrale sans empêcher celle-ci de fonctionner (il faut parfois éteindre l'ordinateur
avant de retirer le périphérique).
- Périphériques d’entrée
Dispositifs de saisie
Périphériques d'entrée
Clavier
Pavé numérique
Dispositifs de lecture
Lecteur de carte
Lecteur de code-barres
Dispositifs de pointage
Souris
Tablette graphique
Pavé tactile
Contrôleurs de jeu
Dispositifs d'acquisitions
Un système d'acquisition de données est un appareil qui est utilisé pour effectuer une
numérisation d'un signal électrique. Il est, pour cette raison, classé comme un périphérique
d'entrée.
Acquisition d'images
Scanner
Webcam
Acquisition sonore
Microphone
- Périphériques de sortie
Écran
Imprimante
Enceinte acoustique
Haut parleur
Baffles
- Périphériques d'entrée-sortie
Mémoires de masse
Une mémoire de masse est un périphérique d'entrée-sortie car il permet de lire et d'écrire des
données non volatiles.
Un système d’exploitation de bureau est conçu pour une utilisation domestique ou dans de
petites entreprises, avec un nombre limité d’utilisateurs. Un système d’exploitation de réseau
est utilisé dans un environnement d’entreprise, avec de nombreux utilisateurs et de multiples
besoins.
Sur le marché actuel des logiciels, il existe trois grandes catégories de systèmes d’exploitation
de bureau : Microsoft Windows, Apple Mac OS et UNIX/Linux.
Les systèmes d’exploitation pour mobiles permettent de gérer les besoins spécifiques des
terminaux mobiles (ressources limitées, interface tactile, etc).
Le marché actuel des systèmes d’exploitation pour mobiles se partage entre iOS (Apple),
Android, Windows Phone et Blackberry.
II-Les processus
Un processus est un programme en cours d'exécution.
Un programme est une suite d'instructions ; c'est du texte, un code
statique.
Le processus est un concept dynamique, il représente le déroulement
d'une tâche faisant partie d'une application ou un programme système
quelconque.
La notion de processus est essentielle pour décrire le fonctionnement des systèmes
multiprogrammés aussi appelés multitâches ou plus simplement multiprocessus.
Parmi les avantages de la multiprogrammation, citons :
Le fractionnement des applications qui peut en simplifier le
développement,
l'avantage pour l'utilisateur de savoir faire tourner plusieurs applications
simultanément
et surtout l'optimalisation de l'utilisation du (ou des) processeurs(s)
Un processeur n'est capable de traiter qu'un seul processus à la fois. Un sous-ensemble du
système d'exploitation, appelé ordonnanceur, organise les tâches et les fait commuter tout
à tour pour donner l'impression qu'elles s'exécutent toutes simultanément.
Le système d'exploitation conserve des informations sur chaque processus pour pouvoir
les interrompre et les relancer selon ce que décide l'ordonnanceur. Ces informations
regroupent entre autres :
- un numéro d'identification du processus ( PID)
- l'état du processus, son compteur ordinal et les autres registres
- l'emplacement mémoire du code, des données et de la pile
- des pointeurs vers les ressources utilisées, fichiers, E/S, ...
- et une quantité innombrable d'informations : pointeur vers le processus parent,
priorité, compteur de threads, durée d'exécutions, informations d'attentes etc.
Toutes ces informations peuvent être regardées comme les composants d'un processeur
virtuel agent d'exécution du processus.
Elu signifie en cours d'exécution. L'exécution n'est interrompue que par les conditions
suivantes :
Transition 1 : Le processus se bloque, faute de données pour l'alimenter ou en attendant une
opération d'entrée/sortie.
Transition 2 : Le processus est interrompu soit parce que la tranche de temps qui lui est
impartie est achevée soit parce qu'un processus de plus haute priorité
réquisitionne le processeur.
L'état Prêt est un état provisoire pour permettre aux autres processus de s'exécuter quasi
simultanément.
L'état Bloqué est un état d'attente d'un événement extérieur, tel qu'une entrée/sortie,
nécessaire à la poursuite de l'exécution du processus.
Ajoutons deux états qui correspondent à l'ordonnancement à long terme : les états
" Nouveau " et " Terminé ".
Nouveau : le processus vient d'être créé mais n'existe pas encore qu'à l'état de requête de
processus en attendant d'être admis par le scheduler en tant que processus activable.
Terminé : le processus est désormais inactif car il a achevé sa tâche. Il sera détruit
prochainement par le système d'exploitation pour libérer de la place en mémoire. Il est
parfois conservé pendant un temps à l'état terminé en attendant qu'une entrée/sortie
s'achève ou que les données de ce processus soient exploitées par un autre. On parle alors
de processus " zombie".
Pour être complet il faut aussi envisager les états permutés qui résultent de
l'ordonnancement à moyen terme. Le swapper range les processus prêts ou bloqués sur le
disque ou en mémoire.
Permuté-Prêt : le processus est pour l'instant transcrit en mémoire auxiliaire (sur disque).
Il serait prêt à être activé par l'ordonnanceur à court terme s'il était en mémoire principale.
La permutation de mémoire dépend de l'ordonnanceur à moyen terme.
Permuté-Bloqué : c'est l'état d'un processus qui étant bloqué en attendant un événement
externe à été transféré sur disque pour faire de la place en mémoire principale.
L'ordonnancement des processus
Les processus concurrents doivent se partager le processeur, la mémoire et les
entrées/sorties.
- Dans les systèmes anciens, les systèmes de traitement par lots mais aussi les systèmes
d'exploitation pas vraiment multitâches tels que Windows 9x, l'ordonnancement était de
type coopératif. L'ordonnanceur n'intervenait que lorsque le processus en cours se
terminait ou se bloquait. Ce système assez sommaire convenait aux traitements par lots
quand le temps de réponse n'avait que peu d'importance.
- Actuellement, sur les systèmes interactifs multitâches, parfois même multi utilisateurs et
multi processeurs, l'ordonnancement doit être préemptif. L'ordonnanceur ne peut laisser
un processus monopoliser les ressources du système et réquisitionne régulièrement le
processeur pour en répartir la disponibilité entre les processus qui simultanément sont
prêts à être exécutés. La politique suivie pour déterminer la manière d'ordonnancer les
processus est fonction de nombreux critères parfois contradictoires. Le fait de favoriser
certaines catégories de tâches peut en léser d'autres.
Partition de la mémoire
Partitions fixes
Le plus simple est de diviser la mémoire en partitions
fixes dès le démarrage du système. Les partitions sont
de différentes tailles pour éviter que de grandes
partitions ne soient occupées que par de petits
processus. Le gestionnaire de mémoire, en fonction de
la taille des processus, décide quelle partition lui allouer pour ne pas gaspiller trop de
mémoire.
Une file d'attente est associée à chaque partition. Quand vient une nouvelle tâche, le
gestionnaire détermine quelle est la plus petite partition qui peut la contenir puis place
cette tâche dans la file correspondante.
Le fait d'éviter d'allouer une partition trop grande à un petit processus conduit parfois à
des aberrations. Il arrive que des partitions plus grandes restent inutilisées alors que se
forment ailleurs des files interminables de petits processus. La mémoire est donc mal
utilisée.
Une autre solution est de créer une file unique. Lorsqu'une partition se libère, on consulte
la file pour trouver la tâche qui l'occuperait de manière optimale.
Le risque est que les petites tâches soient pénalisées. Une parade est de conserver une
petite partition au moins qui ne sera accessible qu'aux petites tâches. Une autre solution,
serait de dire qu'un processus ne peut être ignorer qu'au maximum un certain nombre de
fois. Après n refus, il prendra place dans une partition même si la partition est bien plus
grande qu'il ne faut.
Partitions variables
Une autre manière d'éviter les emplacements mémoires inoccupés en fin de partitions est
d'allouer aux processus des espaces qui correspondent exactement à l'espace qui leur est
utile.
Au fur et à mesure que les processus se créent et se terminent, des partitions s'allouent et
se libèrent laissant des zones mémoires morcelées et inutilisables.
La mémoire se fragmente et est de plus en plus mal employée. Il faudrait la compacter en
déplaçant régulièrement les processus mais cette tâche supplémentaire ralentit le système.
Conclusion :
Le partitionnement de la mémoire que ce soit avec des partitions de tailles fixes ou de
tailles variables, ne permet pas d'utiliser la mémoire au mieux.
La pagination
Les processus requièrent des espaces d'adresses continus. On a vu que cela est
difficilement réalisable en découpant la mémoire en partions dont les tailles correspondent
à celles des processus. La pagination est une technique d'allocation de la mémoire bien
plus efficace. Elle fournit aux processus des espaces d'adresses séquentiels à partir
d'espaces mémoire discontinus.
La pagination consiste à diviser la mémoire et les processus en blocs de mêmes tailles
appelés pages. Les pages mémoire sont souvent appelées "frames" ou "cadres" tandis que
les pages de processus sont simplement appelées "pages".
Les pages (de processus) ne sont pas toutes simultanément actives ; elles ne sont donc pas
nécessairement toutes présentes simultanément dans la mémoire principale. Les pages
inactives attendent sur le disque. L'espace d'adressage est donc virtuel sa taille peut être
supérieure à celle de la mémoire réelle.
Les processeurs disposent actuellement d'un dispositif, le MMU "Memory Manager
Unit" qui permet de placer des processus en mémoire sans nécessairement placer les pages
de processus dans des cadres de pages contigus. On distingue les adresses logiques qui se
réfèrent aux pages de processus des adresses physiques qui se réfèrent aux cadres de
pages.
Voyons à présent comment l'unité de gestion mémoire (MMU) met en correspondance les
adresses physiques et logiques. Elle contient pour ce faire une table de pages où sont
inscrits les numéros des cadres de pages.
Fonctionnement des tables de pages
L'adressage se fait au moyen de numéros de pages et d'offsets (distance séparant deux
emplacements mémoires). L'offset (= déplacement ou décalage) est la position relative au
début de la page.
L'adresse logique est composée du numéro de page de processus et d'un offset.
L'adresse physique correspondante est formée à partir du numéro du cadre de page où est
chargé la page de processus et du même offset que celui de l'adresse logique.
Le numéro du cadre de page est consigné dans une table des pages associée au processus.
On y retrouve le numéro du cadre de page en se servant du numéro de page de processus
comme d'un index.
Pagination simple
Le nombre de pages étant souvent très grand les tables des pages deviennent volumineuses
et peuvent même occuper ... plusieurs pages. On les fractionne donc en plusieurs niveaux :
une table de page de niveau supérieur dont chaque élément pointe vers une table de niveau
inférieur. L'adresse logique contient dès lors deux nombres pour aboutir au numéro de
page. Le premier sert d'index dans la table de niveau supérieur, le second sert d'index dans
la table du niveau suivant.
NB. L'espace d'adressage est perçu par le programmeur comme une suite continue
d'octets. La subdivision de l'adresse en numéros de page et d'offset est transparente. Elle
est prise en charge par le matériel.
La segmentation
Chaque processus est constitué d'un ensemble de segments. Chaque segment est un espace
linéaire.
Les segments sont des espaces d'adressages indépendants de différentes longueurs et qui
peuvent même varier en cours d'utilisation. Ils correspondent à des subdivisions logiques
déterminées par le programmeur ou par le compilateur.
Les segments contiennent des informations de même nature : le code, les données, la
pile, des tables, etc. Il est dès lors possible d'attribuer des protections adaptées à chaque
type de segment : un segment de code peut être déclaré en exécution seule, une table de
constantes en lecture seule mais pas en écriture ni en exécution. Certaines zones de code
en exécution seule peuvent être partagées par plusieurs processus ; cela se fait par
exemple pour des bibliothèques de sous-programmes.
L'accès aux segments se fait via une table de segments.
Chaque entrée de la table comporte l'adresse de départ du segment et sa taille.
L'adresse logique est constituée du numéro de segment et d'un offset. Contrairement aux
pages dont le fonctionnement est transparent pour le programmeur, les segments sont des
entités logiques qu'il connaît et manipule. Il distingue les deux informations contenues
dans l'adresse : le numéro du segment et l'offset.
Le numéro de segment sert d'index pour retrouver l'adresse du début du segment dans la
table de segment. Cet offset doit être inférieur à la taille du segment consignée elle aussi
dans la table de segment. Si ce n'est pas le cas, une erreur est générée qui provoque
l'abandon du programme. L'offset est ensuite ajouté à l'adresse de début de segment pour
former l'adresse physique.
Ports d’entrée/sortie
Les périphériques sont reliés au reste du système par des circuits appelés ports d'entrées et
ports de sortie (certains ports peuvent combiner les deux fonctions).
Un port d'entrée est essentiellement composé de tampons trois états. Ceux-ci se comportent
comme des interrupteurs électroniques qui font apparaître, au moment voulu, les niveaux
logiques du périphérique d'entrée (choisi par le bus d'adresse) sur le bus de données ; ces
niveaux seront mémorisés dans un registre du processeur (le registre est une case de RAM).
Un port de sortie est essentiellement composé de bascules de type D. Celles-ci se comportent
comme des petites mémoires. Leur entrée est reliée au bus de données. Le processeur vient
écrire un niveau logique 0 ou 1 dans chacun des bascules. Les sorties des bascules contrôlent
les périphériques, généralement via un étage de puissance.
Périphériques d’entrées
Une entrée est un flux de données provenant soit :
du réseau,
d'une lecture d'information sur disque,
d'une saisie clavier, d'un mouvement de souris, d'un crayon optique
ou de tout autre périphérique prévu pour interagir avec un système informatique.
Ces signaux d'entrée génèrent des Interruptions matérielles qui sont traitées en priorité par le
gestionnaire d'interruptions du noyau du système d'exploitation.
Dans les systèmes à microprocesseurs, tels la machine à laver évoquée ci-dessus, on trouve
des boutons poussoirs, des commutateurs.
De nombreux microcontrôleurs incorporent des compteurs ; les signaux mis en forme et
appliqués aux entrées de comptage constituent aussi des signaux d'entrée du système.
Dans les systèmes informatiques, le choix est bien plus vaste : clavier, souris, crayon optique,
numériseur, convertisseurs analogiques/numériques…
Insistons sur le fait que, pour être traités par le processeur, les signaux, quels qu'ils soient,
doivent être convertis en signaux logiques compatibles avec le processeur. Dans certains cas,
il faudra donc placer des convertisseurs de niveau ou des étages d'isolement (souvent
des opto-coupleurs).
Périphériques de sortie
Les sorties sont associées à des trappes ou appels systèmes.
Une sortie peut être (cette liste n'est pas exhaustive) :
un signal (électrique, onde…) ;
un flux de données (réseau), une écriture sur disque ou une mise en mémoire ;
un affichage, un son.
Dans les systèmes à microprocesseurs, on utilise des diodes électroluminescentes (DELs) ou
des ampoules à incandescence comme voyants ou indicateurs, des afficheurs numériques ou
alphanumériques à DELs ou à cristaux liquides pour l'affichage des messages du système, des
relais (pour commander des charges nécessitant des courants et/ou des tensions élevés),
des optocoupleurs…
Dans les systèmes informatiques, le choix est vaste : écran pour l'affichage, imprimante pour
la production de documents sur papier, convertisseurs numériques/analogiques…
Périphériques d’entrée/sortie
Un grand nombre de périphériques sont à la fois des périphériques d'entrée et de sortie.
Le modem, par exemple, permet d'envoyer ou de recevoir des informations en provenance du
monde extérieur : courrier électronique, navigation Internet, mais aussi envoi et réception de
fax, téléphonie par ordinateur (VoIP, Voice over IP).
Les cartes réseau permettent de relier entre eux plusieurs ordinateurs afin de réaliser un réseau
local d'ordinateurs, ce qui permet de partager des fichiers ou des ressources telles une
imprimante réseau, un numériseur…
Il y a aussi toute la gamme des mémoires de masse : disque dur, carte mémoire, lecteur de
disquette, lecteur de DVD, clé USB.
De même, les moniteurs d'ordinateurs lorsqu'ils sont dotés d'écran tactile.
Performance
Les performances d'un ordinateur mesurent le temps qui lui est nécessaire pour effectuer un
traitement donné. Trois éléments influencent ces performances :
la puissance du processeur ;
la mémoire disponible ;
le temps consacré aux opérations d'entrées/sorties.
Le temps nécessaire pour un traitement informatique quel qu'il soit est toujours déterminé par
un de ces trois éléments mais celui des entrées/sorties est généralement prépondérant. En
effet, le temps consacré aux opérations I/O se compte en millisecondes alors que celui
consacré aux instructions effectuées par le processeur se compte en nanosecondes.
La taille de la mémoire est surtout importante dans la mesure où elle permet de réduire le
nombre d'opérations d'entrées/sorties, soit parce qu'une part plus importante des programmes
applicatifs peut résider en mémoire, réduisant ainsi les phénomènes de pagination, soit parce
qu'une partie de cette mémoire peut-être utilisée comme tampon (mémoire cache) pour le
stockage des flux de données des opérations I/O.
En programmation comme au niveau système (par exemple sur les mainframes), deux
éléments matériels (entre autres) influencent les performances des entrées/sorties, c'est-à-dire
leur vitesse :
la charge du processeur (i.e. son taux d'occupation), qui fournit les données
sortantes ou traite les données entrantes ;
la charge du dispositif d'entrée/sortie, qui émet ou reçoit les données (on parle
généralement des lectures/écritures notamment pour les accès disques).
Si les ressources CPU ou I/O sont insuffisantes lors de l'exécution d'un ou plusieurs
traitements simultanés, on parle de saturation.
V- Système de fichier
Le système de fichiers est la portion du système d'exploitation qui s'occupe de la gestion des
mémoires de masse. Il prend en charge le stockage des fichiers sur le disque dur, le rangement
de ceux-ci dans des répertoires, l'ouverture ou la fermeture de fichiers/répertoires, et bien
d'autres choses encore. La gestion des partitions est aussi assez liée au système d'exploitation.
Partition
Avant d'installer un système d'exploitation sur un disque dur, celui-ci doit être partitionné, du
moins sur les PC actuels. Partitionner un disque dur signifie le diviser en plusieurs morceaux,
qui seront considérés par le système d'exploitation comme autant de disques durs séparés. Les
informations sur les partitions sont mémorisées dans une table des partitions, qui stocke la
taille et le premier secteur de chaque partition, ainsi que quelques informations
complémentaires.
Fichiers
Les données sont organisées sur le disque dur sous la forme de fichiers. Ce sont généralement
de simples morceaux d'une mémoire de masse, sur lesquels un programme peut écrire ce qu'il
veut. Le système de fichiers attribue plusieurs caractéristiques à chaque fichier.
Chaque fichier reçoit un nom de fichier, qui permet de l'identifier et de ne pas
confondre les fichiers entre eux. L'utilisateur peut évidemment renommer les
fichiers, choisir le nom des fichiers, et d'autres choses dans le genre.
En plus du nom, le système d'exploitation peut mémoriser des informations
supplémentaires sur le fichier : la date de création, la quantité de mémoire occupée
par le fichier, et d'autres choses encore. Ces informations en plus sont appelées
des attributs de fichier.
Il existe des normes qui décrivent comment les données doivent être rangées dans
un fichier, suivant le type de données à stocker : ce sont les formats de fichiers.
Le format d'un fichier est indiqué à la fin du nom du fichier par une extension de
fichier. Généralement, cette extension de nom commence par un ".", suivi d'une
abréviation. Par exemple, le .JPEG, le .WAV, le .MP3 ou le .TXT sont des
formats de fichiers. Ces formats de fichiers ne sont pas gérés par le système
d'exploitation. Tout ce que peut faire l'OS, c'est d'attribuer un format de fichier à
une application : il sait qu'un .PDF doit s'ouvrir avec un lecteur de fichiers .PDF,
par exemple.
Répertoires
Sur les premiers systèmes d'exploitation, on ne pouvait pas ranger les fichiers : tous les
fichiers étaient placés sur le disque dur sans organisation. De nos jours, tous les systèmes
d'exploitation gèrent des répertoires. Ceux-ci sont représentés sur le disque dur par des
fichiers, qui contiennent des liens vers les fichiers contenus dans le répertoire. Le fichier
répertoire mémorise aussi toutes les informations concernant les fichiers : leur nom, leur
extension, leur taille, leurs attributs, etc. Ces informations sont rarement stockées dans le
fichier lui-même. Ainsi, quand vous ouvrez un répertoire ou que vous consultez les propriétés
d'un fichier, ce fichier n'est jamais ouvert : ces informations sont récupérées dans le répertoire.
Codage des répertoires
Un répertoire contient une liste de fichier. Pour chaque fichier, il mémorise son nom, ses
attributs, ainsi que la liste des clusters qui lui sont attribués. Les attributs sont stockés dans
une structure de taille fixe, le nombre des attributs par fichier étant connu à l'avance. Mais la
liste des clusters et les noms des fichiers n'ont pas de taille fixée à l'avance. Cela ne pose pas
de problème pour la liste des clusters, contrairement à ce qu'on a pour les noms.
Généralement, les répertoires mémorisent les noms des fichiers qu'ils contiennent, avec leurs
attributs. Ceux-ci sont donc placées dans un bloc de taille fixe, un en-tête.
La gestion des noms de fichiers peut se faire de plusieurs manières. Avec la première
méthode, on limite la taille des noms de fichiers. On peut alors réserver une taille suffisante
dans le fichier répertoire pour stocker ce nom. Par exemple, sur les premiers systèmes de
fichiers FAT, les noms de fichiers étaient limités à 8 caractères (plus 3 pour l'extension de
fichier). Le répertoire allouait 8 octets pour chaque nom de fichier, plus 3 octets pour
l'extension. La taille utilisée était alors limitée. Cette méthode, bien que simple d'utilisation, a
tendance à gâcher de la mémoire si de grands noms de fichiers sont utilisés. Et si de petits
noms de fichier, l'espace utilisé sera faible, mais les utilisateurs pourront se sentir limités par
la taille maximale des noms de fichier.
Ce schéma illustre l'entrée d'un fichier (dans un répertoire) telle qu'elle est codée avec les
systèmes de fichier FAT 12 et FAT 16. La FAT-32 utilise un système quasiment identique,
sauf pour l'adresse du premier cluster, qui est codée sur 4 octets.
On peut aussi utiliser des noms de fichiers de taille variable. La solution la plus simple
consiste à placer ceux-ci à la suite de l'en-tête (qui contient les attributs). Cette méthode a
cependant un désavantage lors de la suppression du fichier : elle génère de la fragmentation
assez facilement. Pour éviter cela, on peut placer les noms de fichier de taille variable à la fin
du fichier répertoire, chaque en-tête pointant vers le nom de fichier adéquat (Linux).
Hiérarchie de répertoires
Sur les premiers systèmes d'exploitation, tous les fichiers étaient placés dans un seul et unique
répertoire. Quand le nombre de fichier était relativement faible, cela ne posait pas trop de
problèmes. L'avantage de cette méthode était que le système d'exploitation était plus simple et
qu'il n'avait pas à gérer une arborescence de répertoire sur le disque dur. Mais l'inconvénient
se faisait sentir quand les fichiers devenaient de plus en plus nombreux. Cette organisation est
encore utilisée sur les baladeurs et appareils photo numériques.
Illustration d'une hiérarchie de répertoires.
De nos jours, les répertoires sont organisés en une hiérarchie de répertoire : un répertoire
peut contenir d'autres répertoires, et ainsi de suite. Évidemment, cette hiérarchie commence
par un répertoire maître, tout en haut de cette hiérarchie : ce répertoire est appelé la racine.
Sous Windows, on trouve une seule et unique racine par partition ou disque dur : on en a une
sur C : , une autre sur D : , etc. Sous Linux, il n'existe qu'une seule racine, chaque partition
étant un répertoire accessible depuis la racine : ces répertoires sont appelés des points de
montage. Sur Windows, ce répertoire est noté : soit \, soit nom_lecteur : \ (C:\, D:\). Sous
Linux, il est noté : / .
Reste que savoir où se trouve un fichier demande de préciser quel est le chemin qu'il faut
suivre en partant du répertoire maître : on doit préciser qu'il faut ouvrir tel répertoire, puis tel
autre, et ainsi de suite jusqu’au fichier. Ce chemin, qui reprendre le chemin de la racine
jusqu’au fichier, est appelé le chemin d'accès absolu. Sous Windows, les noms de répertoires
sont séparés par un \ : C:\Program Files\Internet Explorer. Sous Linux, les noms de répertoires
sont séparés par un / : /usr/ast/courrier. Les chemins d'accès relatifs sont similaires, sauf
qu'ils ne partent pas de la racine : ils partent d'un répertoire choisit par l'utilisateur, nommé
répertoire courant. Dans les grandes lignes, l'utilisateur ou un programme choisissent un
répertoire et lui attribuent le titre de répertoire courant. Généralement, chaque processus a son
propre répertoire de travail, qu'il peut changer à loisir. Pour cela, le programme doit utiliser un
appel système, chdir sous Linux.
Linux a une particularité : il normalise la place de certains répertoires bien précis du système
d'exploitation. L'arborescence des répertoires est en effet standardisée par le Filesystem
Hierarchy Standard, la dernière version datant de juin 2015.