Concepts fondamentaux des systèmes d'exploitation

6.2 Concepts fondamentaux des systèmes d'exploitation

Objectifs d'apprentissage

À la fin de cette section, vous serez capable de :

  • Expliquer les divers concepts clés et composants des systèmes d'exploitation
  • Discuter des différentes conceptions des systèmes d'exploitation

Un système d'exploitation (OS) gère les ressources informatiques (matériel) et fournit des services aux programmes informatiques (logiciel). L'OS fonctionne comme une interface entre l'utilisateur de l'ordinateur et le système. L'OS gère la mémoire, les fichiers, le matériel et le logiciel ; il gère également les entrées et les sorties telles que le clavier et l'imprimante (Figure 6.4).

Un organigramme montre l'utilisateur final (flèches vers et depuis) Application logicielle (flèches vers et depuis) Système d'exploitation (flèches vers et depuis) Matériel.
Figure 6.4 L'utilisateur final initie ce processus en utilisant les logiciels/applications, qui sont construits au-dessus du système d'exploitation de l'ordinateur. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Dans ce module, nous étudions les composants de l'OS tels que la gestion des processus et des fils d'exécution, la gestion de la mémoire et de l'espace d'adressage (address space), et les pilotes de périphériques et les périphériques d'I/O. De plus, nous couvrons les structures de OS telles que la conception de OS monolithique, la conception de OS en couches, la couche d'abstraction matérielle (hardware abstraction layer) (HAL), et les micro-noyaux.

Composants de l'OS

Le OS est un système complexe qui est généralement créé en utilisant le "diviser pour régner" mécanisme (mechanism). C'est-à-dire que le système est divisé en petites pièces, chacune définissant une partie du système. La structure des composants de l'OS est statique, et l'OS et le matériel sont étroitement liés. L'interface de programmation d'applications (API) (application programming interface (API)) est un ensemble de règles et d'outils qui permet à différentes applications logicielles de communiquer entre elles. Les applications font des requêtes à l'OS via l'API. L'utilisateur peut, à l'aide d'un clavier et/ou d'une souris, interagir avec l'OS via l'interface de l'OS. L'interface de l'OS peut être une interface utilisateur graphique (GUI) (graphical user interface (GUI)), qui permet aux utilisateurs d'interagir avec des appareils électroniques via des icônes graphiques et des indicateurs visuels (par exemple, Windows), ou une ligne de commande (par exemple, DOS). Par exemple, dans la Figure 6.5, l'interface de l'OS serait la fenêtre dans laquelle le navigateur Chrome s'ouvre.

Un diagramme montrant comment le système d'exploitation et le matériel sont étroitement liés. Il montre les applications utilisateur suivantes : Chrome, Photoshop, Acrobat Reader, JVM ; Interfaces de programmation d'applications : Systèmes de fichiers, Gestionnaire de mémoire, Gestionnaire de processus, Support réseau, Pilotes de périphériques, Gestionnaires d'interruptions, Démarrage et initialisation (ceux-ci sont indiqués comme portables) ; en dessous se trouvent des couches d'abstraction matérielle, et le matériel (CPU, périphériques).
Figure 6.5 Le système d'exploitation et le matériel sont étroitement liés. L'utilisateur final utilise plusieurs applications, telles que Chrome, Photoshop, Acrobat et JVM, qu'il avait précédemment téléchargées dans un OS particulier. Pour utiliser ces programmes logiciels, l'utilisateur interagira via l'interface de l'OS et/ou l'API, qui est connectée aux composants de l'OS tels que les systèmes de fichiers, les gestionnaires de mémoire, les gestionnaires de processus, les supports réseau, les pilotes de périphériques et les gestionnaires d'interruptions. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Gestion des processus et des fils d'exécution

En un seul clic, les utilisateurs finaux lancent des applications de manière transparente, appréciant la simplicité du processus (process). Vous êtes-vous déjà demandé ce qui gère l'application une fois lancée ? La réponse directe est l'OS. Un OS exécute de nombreux types d'activités, allant des programmes des utilisateurs, des tâches ou scripts d'arrière-plan, aux programmes système. Il existe de nombreux programmes système tels que les gestionnaires d'impression, les serveurs de noms et les serveurs de fichiers. Chacun de ces programmes ou activités est encapsulé dans un processus. Comme vous l'avez appris dans la section précédente, un processus est un programme en cours d'exécution qui possède un contexte d'exécution ainsi que l'instance d'exécution du programme lui-même. Des exemples de contexte d'exécution sont les compteurs ordinaux (PC), les registres, les VM cartes, les ressources de l'OS, et des exemples d'instance d'exécution sont le code et les données.

Voici d'autres concepts liés aux processus qui seront introduits ici et développés au fur et à mesure du chapitre :

  • Un registre est une unité de stockage de mémoire à haute vitesse.
  • Un processus peut être en état d'exécution (running state) (lorsqu'il est exécuté par le CPU), en état prêt (ready state) (lorsqu'il est en attente dans le CPU), ou en état bloqué (blocked state) (lorsqu'il attend qu'un événement se produise).
  • Le module de processus de l'OS gère les processus via la création, la destruction et l'ordonnancement. Une façon pour un OS de contrôler l'accès à une ressource est par le biais d'un type de données appelé sémaphore (semaphore).
  • La gestion du partage des ressources d'un système pour éviter les interférences et les erreurs est appelée synchronisation des processus (process synchronization).

Questions de réflexion

Existence de pannes

Étant donné la complexité des tâches d'un OS (c'est-à-dire la gestion des ressources d'un système informatique et l'ordonnancement des tâches pour qu'une application fasse ce que l'utilisateur en attend) et la vitesse à laquelle ces tâches doivent s'exécuter, il est étonnant de voir à quel point la technologie ne tombe pas en panne. Mais, bien sûr, cela arrive parfois.

Supposons que vous ayez rencontré une panne liée à l'OS ce matin, à savoir que votre ordinateur portable n'a pas démarré complètement. Quelles seraient les étapes que vous prendriez pour diagnostiquer le problème par vous-même avant de chercher de l'aide ou une réparation ?

Processus vs. Fils d'exécution

Comme nous l'avons appris, un processus est un programme actif. Un fil d'exécution (thread) est une portion plus petite ou légère d'un processus qui est gérée indépendamment. Le Tableau 6.2 montre une comparaison entre le processus et le fil d'exécution.

Attribut Processus Fil d'exécution
Définition Un programme exécuté Partie du processus
Poids Il peut être lourd Léger
Temps de traitement Plus de temps Moins de temps
Ressources Nécessite plus de ressources Nécessite moins de ressources
Partage Majoritairement isolé Partage la mémoire et les données
Tableau 6.2 Processus vs Fil d'exécution
Traitement

Un programme est passif ; il s'agit simplement d'octets sur un disque qui encodent des instructions à exécuter. Un processus est une instance d'un programme en cours d'exécution — ou traité — par un processeur. Ainsi, le traitement implique un programme, un processus et un processeur. Le processeur peut être un processeur réel ou un processeur virtuel (c'est-à-dire, un CPU cœur assigné à une machine virtuelle (virtual machine)). À tout moment, il peut y avoir de nombreux processus exécutant des copies du même programme (par exemple, un éditeur) ; chaque processus est séparé et généralement indépendant. Un OS est responsable de la gestion de ces processus.

Différents OS abordent la gestion des processus de différentes manières. Par exemple, l'approche du système d'exploitation Windows consiste à ajouter un appel système (system call) pour créer un processus et d'autres appels système pour l'opération du processus. L'approche utilisée dans l'OS UNIX est différente car elle consiste à diviser le processus en deux étapes en utilisant les fonctionnalités fork et exec. La fonctionnalité fork est utilisée pour établir les privilèges en créant une copie complète du processus, et la fonctionnalité exec amène le fichier exécutable en mémoire pour démarrer l'exécution.

Gestion de l'espace d'adressage et de l'espace mémoire

L'espace d'adressage (address space) est l'ensemble des adresses générées par les programmes lorsqu'ils référencent des instructions et des données. L'espace mémoire contient les emplacements réels de la mémoire principale qui sont directement adressables pour le traitement. L'OS est responsable de la gestion de ces espaces mémoire et d'adressage (Figure 6.6). Pour améliorer les performances, les ordinateurs utilisent l'espace d'adressage de mémoire virtuelle (virtual memory) pour créer l'illusion d'un grand bloc de mémoire continu que les applications et le système d'exploitation peuvent utiliser. Pour ce faire, la mémoire physique de l'ordinateur est utilisée en combinaison avec une partie d'un disque dur qui contient le fichier d'échange ou le fichier de pagination. Les pages contenant des informations sur l'espace d'adressage des programmes sont déplacées dans et hors de la mémoire physique selon les besoins pour s'assurer qu'il y a suffisamment de mémoire physique pour contenir les pages des programmes en cours d'exécution à un moment donné.

Un diagramme montre deux colonnes : la première intitulée Espace d'adressage (virtuel), la seconde Espace mémoire (physique). Sous la première se trouve le Programme A avec une flèche vers les Données X dans la deuxième colonne. Les Données X sont également dans la première colonne, mais n'ont pas de flèche. Une flèche part d'une partie vide de la première colonne vers le Programme A dans la deuxième colonne.
Figure 6.6 Les adresses des données seront dans l'espace d'adressage en attente d'exécution pour être déplacées vers l'espace mémoire. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

La mémoire informatique se compose de deux types principaux : la mémoire principale et la mémoire secondaire. Le point d'accès initial pour un processeur qui sert également de stockage direct pour le CPU est appelé mémoire principale (primary memory). Pour être exécutés, les programmes doivent résider en mémoire principale. Dans les systèmes multiprocesseurs, la mémoire principale peut être classée en trois architectures. La première, l'accès mémoire uniforme (UMA) (uniform memory access (UMA)), utilise un contrôleur de mémoire unique et, par conséquent, le temps d'accès à n'importe quel emplacement mémoire est le même pour tous les processeurs. La seconde, l'accès mémoire non uniforme (NUMA) (non-uniform memory access (NUMA)), est une conception de mémoire informatique qui utilise différents contrôleurs de mémoire, de sorte que son temps d'accès à la mémoire varie en fonction de l'emplacement de la mémoire par rapport à un processeur. La troisième, l'architecture de mémoire à cache seulement (COMA) (cache-only memory architecture (COMA)), utilise plusieurs nœuds de traitement interconnectés, chacun équipé d'un processeur (c'est-à-dire, un cache). Cela permet l'allocation (allocation) dynamique des données pour un accès et des performances optimisés dans les environnements multiprocesseurs.

La mémoire utilisée pour le stockage à long terme, abritant le système d'exploitation (operating system), les applications et les données qui doivent persister même lorsque l'alimentation est coupée, est appelée mémoire secondaire (secondary memory). Contrairement à la mémoire principale, qui est volatile et perd ses données lors des interruptions de courant, la mémoire secondaire est non volatile — ce qui signifie qu'elle conserve les données même en cas de panne de courant — et offre ainsi durabilité et rétention des données. Les exemples courants de mémoire secondaire incluent les disques durs (HDD) et les disques SSD.

Un OS doit satisfaire aux politiques concernant la quantité de mémoire physique à allouer à chaque processus (process) et le moment de retirer un processus de la mémoire. Il doit implémenter ces politiques en utilisant les mécanismes suivants : l'allocation de mémoire (memory allocation) et la désallocation de mémoire (memory deallocation). L'allocation de mémoire est le processus de réservation de sections de mémoire dans un programme pour stocker des variables et des instances de structures et de classes. L'allocation de mémoire peut être une allocation de mémoire statique ou une allocation de mémoire dynamique. La désallocation de mémoire est le processus de libération de l'espace correspondant aux processus terminés lorsque cet espace est nécessaire au reste du système. De plus, l'OS doit maintenir des mappages des adresses virtuelles aux adresses physiques (c'est-à-dire, les tables de pages) et changer le contexte du CPU entre les espaces d'adressage.

Pleins feux sur l'industrie

Systèmes de fenêtrage

Un système de fenêtrage est un composant logiciel de l'OS qui gère l'affichage des interfaces utilisateur graphiques (graphical user interface) (GUI) sur un écran d'ordinateur. Une enquête sur l'influence des systèmes de fenêtrage sur diverses industries, en particulier dans des secteurs comme le marketing de détail, a fourni des perspectives éclairantes sur la façon dont ces systèmes impactent les pratiques commerciales, la productivité, l'engagement client et l'efficacité opérationnelle globale. Il a notamment été constaté que les systèmes de fenêtrage améliorent considérablement l'expérience utilisateur, ce qui est essentiel pour le marketing de détail. En facilitant l'intégration des messages marketing ou des interruptions avec d'autres médias que les clients regardent, un système de fenêtrage aide les détaillants à mener un marketing ciblé sur Internet. Les systèmes de fenêtrage améliorent également l'expérience utilisateur globale pour les clients qui consultent le contenu intégré.

Pilotes de périphériques et périphériques d'I/O

Les ordinateurs disposent de nombreux périphériques d'entrée et de sortie tels que le clavier, la souris, l'écran ou le port USB. Certains exemples de périphériques spécifiques à l'OS incluent le système de fichiers (file system) (disque), les sockets (socket) (réseau) et le tampon d'image (vidéo). Un tampon d'image (frame buffer) est une portion de mémoire vive (random access memory) (RAM) contenant une image matricielle qui pilote un affichage vidéo. Une grande partie du noyau (kernel) de l'OS gère les I/O (Entrée/Sortie). L'OS fournit une interface standard entre les programmes/utilisateurs et les périphériques pour communiquer avec eux (Figure 6.7). Les routines d'un pilote de périphérique interagissent directement avec des types de périphériques spécifiques et le matériel associé pour initialiser le périphérique, demander des I/O et répondre aux interruptions ou aux erreurs. Une interruption (interrupt) est un signal envoyé au processeur par un logiciel ou un matériel, indiquant des événements nécessitant une attention immédiate. Les exemples de pilotes de périphériques incluent les pilotes de carte Ethernet, les pilotes de carte vidéo, les pilotes de carte son et les pilotes de périphériques PCIe (Peripheral Component Interconnect Express), qui sont associés aux cartes graphiques et autres périphériques. Les pilotes de périphériques sont implémentés par les fabricants de périphériques ou les contributeurs open-source et prennent en charge une interface interne standard. Ils peuvent s'exécuter dans l'espace d'adressage (address space) de l'OS et s'exécuter avec des privilèges élevés.

Un diagramme montrant divers périphériques utilisant des pilotes de périphériques connectés au système d'exploitation. Les périphériques incluent une souris, une imprimante, des lecteurs, etc.
Figure 6.7 Plusieurs périphériques d'I/O sont généralement connectés à un ordinateur. Lorsque l'utilisateur commence à utiliser une application, le système d'exploitation définira les périphériques utilisés par l'application en utilisant le pilote de chaque périphérique. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Les pilotes de périphériques sont des composants logiciels spécialisés qui permettent aux programmes informatiques de niveau supérieur d'interagir avec les périphériques matériels. Ces pilotes fournissent une interface logicielle aux périphériques matériels, permettant aux systèmes d'exploitation et autres applications informatiques d'accéder aux fonctions matérielles sans avoir besoin de connaître les détails précis du matériel utilisé.

  • Au cœur de tout ordinateur se trouve le CPU, le composant principal responsable de l'exécution des instructions. Il est intéressant de noter que les CPU eux-mêmes ne nécessitent généralement pas de pilotes de périphériques externes pour un fonctionnement direct, car la gestion centrale des ressources du CPU est un rôle fondamental du système d'exploitation.
  • La mémoire fonctionne sous la gestion directe du système d'exploitation, qui alloue et gère les ressources mémoire du système. La RAM peut être accédée de manière aléatoire et utilisée pour stocker temporairement des données pendant qu'un ordinateur est en cours d'exécution. Alors que les modules RAM standard — RAM dynamique et statique — ne nécessitent pas de pilotes distincts, le matériel mémoire spécialisé, tel que les dispositifs de mémoire flash, y compris les disques SSD, les clés USB et les cartes mémoire, interagit avec le système via des pilotes de système de fichiers qui gèrent l'organisation et l'accès aux données stockées.
  • Les périphériques de stockage, englobant une large gamme de matériel allant des disques durs traditionnels (HDD) aux SSD modernes et aux supports de stockage amovibles, nécessitent des pilotes de périphériques pour faciliter les opérations de lecture/écriture de données.
  • La connectivité réseau repose sur un ensemble de pilotes de périphériques conçus pour gérer les protocoles et les fonctions matérielles des interfaces réseau.

Registres de périphériques

Un registre de périphérique (device register) est l'interface qu'un périphérique présente à un programmeur, où chaque périphérique d'I/O apparaît dans l'espace d'adressage (address space) physique de la machine comme une adresse mémoire. Le système d'exploitation lit et écrit les registres de périphériques pour contrôler le périphérique. Il existe trois types de registres de périphériques : état, commande et données. Le registre d'état fournit des informations sur l'état actuel du périphérique (par exemple, lecture), le registre de commande émet une commande au périphérique (par exemple, écriture d'une valeur dans le registre), et le registre de données est utilisé pour transférer des données entre l'ordinateur et le périphérique. Les registres de périphériques utilisent des bits pour trois objectifs : les paramètres fournis par le CPU au périphérique, les bits d'état fournis par le périphérique, et les bits de contrôle définis par le CPU pour initier des opérations. La Figure 6.8 fournit un exemple du contenu de chacun des bits d'un registre de périphérique.

Un diagramme montrant des secteurs et des bits de registre de périphérique. Il montre le Bit 1, numéro du premier secteur à lire ; le Bit 2, opération terminée ou erreur survenue ; le Bit 3, démarrage de la lecture du disque.
Figure 6.8 Les bits du registre de périphérique définissent le premier secteur à lire, l'état de l'opération et l'opération elle-même. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Le comportement des registres de périphériques est différent de celui des emplacements mémoire ordinaires. Par exemple, le bit de démarrage de l'opération peut toujours être lu comme 0, et les bits peuvent changer d'un état à l'autre (c'est-à-dire que le bit d'opération terminée peut changer sans être écrit par le CPU).

Le OS utilise le registre de périphérique pour communiquer avec un périphérique d'I/O comme suit :

  1. Le CPU écrit dans les registres de périphériques pour démarrer l'opération.
  2. Le CPU interroge le bit "prêt" dans le registre de périphérique.
  3. Le périphérique met le bit "prêt" à 1 lorsque l'opération est terminée.
  4. Le CPU charge l'adresse du tampon dans un registre de périphérique avant de démarrer l'opération pour définir où copier les données lues depuis le disque.
  5. Les périphériques de stockage rapides déplacent les données directement vers/depuis la mémoire physique via l'accès direct à la mémoire (DMA) ; d'autres périphériques nécessitent l'intervention du CPU via des I/O programmées ou des I/O initiées par interruption.
  6. Les interruptions permettent au CPU de faire d'autres travaux pendant que les périphériques fonctionnent, et l'OS détermine quel périphérique a interrompu.

Concepts en pratique

Systèmes d'exploitation, impression et mise en réseau

Presque tout le monde a besoin d'imprimer un document de nos jours. Il est donc important de comprendre comment un système d'exploitation (operating system) nous permet d'imprimer des documents si facilement. Lorsqu'une application veut imprimer un document, elle confie cette tâche au système d'exploitation. Le système d'exploitation envoie des instructions aux pilotes de l'imprimante, qui envoient ensuite les signaux corrects à l'imprimante.

Pouvoir accéder au réseau est un autre besoin critique dans le monde des affaires d'aujourd'hui. Il est donc important de comprendre comment les OS facilitent l'accès au réseau et comment ils le contrôlent. Lorsqu'un utilisateur utilise une application qui interagit avec Internet, l'application envoie des messages de processus (process) à processus en utilisant la couche de transport de l'OS socket API. Ces messages sont ensuite divisés en paquets au sein du système d'exploitation et finalement transmis à un périphérique de carte d'interface réseau, qui les transmet à Internet.

Figure 6.9 représente le registre de périphérique d'un clavier. Notez qu'il a 2 octets (16 bits). Les données se trouvent dans le premier octet, et le second octet contient tous des zéros (c'est-à-dire, du bit 8 au bit 15). Lorsque l'utilisateur commence à taper, le bit "prêt", qui est le bit numéro 15, passe à 1.

Un diagramme montrant le registre de périphérique d'un clavier.
Figure 6.9 Dans ce registre de périphérique pour un clavier, le bit "prêt" est mis à 1 lorsque l'utilisateur commence à utiliser le clavier. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Structure de l'OS

Dans cette section, nous apprenons l'organisation et la structure de l'OS. Comme vous vous en souvenez peut-être, un OS se compose de nombreux composants centraux mais inclut également d'autres composants tels que des programmes système privilégiés et non privilégiés. Dans un OS, il est important d'avoir des opérations en mode dual pour assurer un haut niveau de sécurité et d'autorité. Le mode dual (dual mode) est responsable de la séparation du mode utilisateur du mode noyau (kernel). Un programme qui ne peut s'exécuter qu'en mode noyau est appelé un programme système privilégié (privileged system program). Un exemple de programme système privilégié est le code d'amorçage (bootstrap), qui est le premier code exécuté au démarrage de l'OS. L'OS dépend du bootstrap pour être chargé et fonctionner correctement. La Figure 6.10 démontre l'utilisation du bootstrap. Si l'utilisateur tente d'exécuter des instructions sur des systèmes privilégiés, l'exécution ne sera pas effectuée.

Un diagramme montre le programme d'amorçage. Il montre une flèche de la mémoire principale (incluant Bootstrap et OS) allant vers les Périphériques.
Figure 6.10 Pour commencer à utiliser un périphérique, l'OS utilisera le programme d'amorçage. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Un programme qui ne peut s'exécuter qu'en mode utilisateur est appelé un programme système non privilégié (non-privileged system program). Un exemple de programme système non privilégié est la lecture de l'état du processeur et de l'heure système. En général, il s'agit d'une instruction que toute application ou utilisateur peut exécuter.

Concevoir un programme vaste et complexe est un défi majeur en génie logiciel, car le programme doit non seulement être performant, mais aussi fiable, extensible et rétrocompatible. La conception des OS a été un "essai et erreur" évolutif processus (process). Les conceptions de OS réussies ont eu une variété d'architectures, telles que monolithiques, en couches, infrastructure infonuagique (cloud infrastructure) et exokernels, micro-noyaux et moniteurs de machine virtuelle (virtual machine). Comme la conception d'un OS — et même son rôle — évoluent encore, il est tout simplement impossible aujourd'hui de choisir une seule bonne façon de structurer un OS. Le choix de l'architecture de l'OS dépend de divers facteurs, y compris les exigences spécifiques, les compromis et les objectifs de l'utilisation prévue du OS.

Conception de OS monolithique

Une conception monolithique (monolithic design) fait référence à une architecture spécifique pour les OS où l'ensemble de l'OS fonctionne dans l'espace noyau, et tous les composants et fonctionnalités du système d'exploitation sont organisés dans cet espace. Dans une architecture monolithique, l'ensemble du système d'exploitation fonctionne comme une unité unique et intégrée, et tous ses composants, tels que la gestion des processus, les systèmes de fichiers, les pilotes de périphériques (device driver) et la gestion de la mémoire, résident et fonctionnent dans le même espace d'adressage (address space), connu sous le nom d'espace noyau. Cela signifie que l'ensemble de l'OS fonctionne comme un programme unique et volumineux, et que tout module ou composant peut appeler directement les fonctions d'un autre sans aucune restriction.

Bien qu'une conception monolithique simplifie la communication et l'interaction entre les composants de l'OS, elle présente à la fois des avantages et des inconvénients. Un avantage est qu'elle offre généralement une communication efficace et rapide entre les différentes parties de l'OS car elles partagent le même espace d'adressage. Un autre avantage majeur de la conception monolithique est qu'elle utilise un style architectural familier, et le coût des interactions entre modules en termes d'appels de procédure est faible. Cependant, il existe de nombreux inconvénients. Notamment, cette structure est difficile à comprendre, à modifier ou à maintenir, et ne prend pas en charge le confinement des pannes (fault containment). Une défaillance dans un composant peut potentiellement faire planter l'ensemble du système, le rendant moins tolérant aux pannes par rapport aux architectures plus modulaires. Dans ce cas, l'alternative est de trouver un moyen organisationnel de simplifier la conception et l'implémentation de l'OS.

Les OS traditionnels tels que UNIX (Figure 6.11) ont été construits en utilisant l'architecture monolithique. Contrairement aux conceptions monolithiques, d'autres architectures de OS telles que les micro-noyaux (microkernel) ou les conceptions hybrides distribuent les fonctionnalités de l'OS en modules séparés ou en processus d'espace utilisateur, ce qui conduit à une meilleure modularité et potentiellement à une meilleure stabilité du système.

Un diagramme montrant comment l'OS fonctionne comme une seule pièce dans l'architecture monolithique. Il montre l'Application 1, l'Application 2 et l'Application n avec des flèches vers le Système d'exploitation et une flèche de l'OS vers le Matériel.
Figure 6.11 L'ensemble de l'OS fonctionne comme une seule pièce dans l'architecture monolithique. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Conception de OS en couches

Une autre façon d'obtenir une conception de OS monolithique est l'architecture de système d'exploitation en couches (layered OS architecture), qui consiste à implémenter l'OS comme un ensemble de couches où chaque couche expose une "machine virtuelle (virtual machine)" améliorée à la couche supérieure, comme illustré dans la Figure 6.12.

Un diagramme montre une architecture de OS en couches. Il montre l'Application 1, l'Application 2 et l'Application n avec des flèches vers le Système d'exploitation (avec plusieurs flèches passant à travers les couches de l'OS, et une flèche vers le Matériel.
Figure 6.12 Dans une architecture de OS en couches, l'OS est divisé en couches, et chaque couche sera responsable d'une tâche spécifique. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Le premier exemple d'approche en couches fut le système THE de Dijkstra, conçu en 1968. Il y avait six couches, organisées comme suit.

  • Couche 5 : Un gestionnaire de tâches exécute les programmes des utilisateurs.
  • Couche 4 : Un gestionnaire de périphériques (device manager) gère les périphériques et fournit la mise en tampon.
  • Couche 3 : Un gestionnaire de console implémente des consoles virtuelles.
  • Couche 2 : Un gestionnaire de pages (page manager) implémente des mémoires virtuelles pour chaque processus.
  • Couche 1 : Un noyau implémente un processeur virtuel pour chaque processus.
  • Couche 0 : Le matériel est constitué des composants physiques de l'ordinateur.

Chaque couche de cette configuration peut être testée et vérifiée indépendamment. La superposition a également aidé à l'implémentation et a soutenu les tentatives de vérification formelle de la correction (si vous ne pouvez appeler que les couches inférieures, il n'est pas possible de tomber dans une boucle à travers les différentes couches).

Il existe cependant de nombreux inconvénients à utiliser l'architecture de OS en couches. Notamment, elle impose une structure hiérarchique, alors que les systèmes réels sont plus complexes car un système de fichiers (file system) nécessite des services de mémoire virtuelle (virtual memory) (VM), et la VM aime utiliser des fichiers pour son stockage de sauvegarde. La superposition impose également une pénalité de performance car chaque passage de couche a un coût associé à l'application statique versus dynamique des restrictions d'invocation. Il y a aussi un décalage entre le modèle et la réalité, car les systèmes modélisés en couches peuvent ne pas être réellement construits de cette manière.

Abstraction matérielle

La couche d'abstraction matérielle (HAL) (hardware abstraction layer (HAL)) est un exemple de superposition dans les OS modernes, et elle permet à un OS d'interagir avec un périphérique matériel à un niveau général ou abstrait plutôt que d'entrer dans un niveau matériel détaillé, ce qui améliore la lisibilité et la maintenabilité. En général, l'objectif de la HAL est de séparer les routines spécifiques au matériel du cœur de l'OS. La HAL permet la portabilité du code central sur différentes pièces de matériel.

Micro-noyaux

Une autre conception de OS alternative à la conception de OS monolithique est l'architecture de micro-noyaux. Au sein d'un micro-noyau (microkernel), les fonctionnalités et les capacités sont ajoutées à un OS central minimal sous forme de plug-ins. L'architecture micro-noyau est également appelée architecture de plug-ins car les fonctionnalités sont ajoutées sous forme de plug-ins (Figure 6.13).

Un diagramme montre l'architecture micro-noyau. Il montre l'Application 1, l'Application 2 et l'Application n avec des flèches vers le Système d'exploitation. Au sein du Système d'exploitation, il y a des couches de processus utilisateur et de processus système, étiquetées Mode utilisateur. Sous ces couches se trouve une autre couche étiquetée Mode noyau avec Micro-noyau avec des flèches vers le Composant Plug-in 1, le Composant Plug-in 2 et le Composant Plug-in M. Ceci a une flèche vers le Matériel.
Figure 6.13 Dans l'architecture micro-noyau, le mode noyau est divisé en plusieurs plug-ins pour traiter les opérations. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

L'objectif d'une architecture micro-noyau est de minimiser ce qui entre dans le noyau et d'implémenter tout le reste qui va traditionnellement dans un OS en termes de processus de niveau utilisateur. Cela améliore la fiabilité (reliability) grâce à l'isolation entre les composants. De plus, il y a moins de code s'exécutant avec tous les privilèges, et une plus grande facilité d'extension et de personnalisation. Cependant, les performances sont généralement médiocres en raison des passages de la frontière utilisateur et noyau (kernel), ce qui représente un risque de sécurité lorsque le code du noyau opère sur les données.

Le premier système micro-noyau fut Hydra (CMU, 1970), suivi par Mach (CMU), Chorus (OS de type UNIX français) et OS X (Apple). L'OS Windows utilisait un micro-noyau, mais utilise maintenant une architecture de noyau hybride qui combine les avantages des architectures de OS monolithiques, micro-noyaux et plug-ins (Figure 6.14).

Un diagramme montrant l'OS Windows comme une architecture de plug-ins. Il a trois couches : Mode utilisateur avec les applications Microsoft, et Mode noyau avec micro-noyau (flèches vers Ordonnancement, Gestion de la mémoire, Système de fichiers), et Matériel.
Figure 6.14 Le OS Windows en tant qu'architecture de plug-ins — dans l'OS Windows, toutes les applications sont en mode utilisateur, et les opérations de l'OS sont divisées en plug-ins en mode noyau. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Infrastructure infonuagique et Exokernel

Deux concepts qui représentent chacun des avancées critiques dans le domaine de l'informatique en offrant différentes méthodologies pour l'abstraction des ressources, l'allocation (allocation) et la gestion sont l'infrastructure infonuagique et l'exokernel.

L'architecture exokernel (exokernel) simplifie le OS en rendant son cœur (noyau) très petit et en permettant aux applications d'avoir plus de contrôle sur le matériel de l'ordinateur. Contrairement aux systèmes habituels qui masquent les détails matériels, un exokernel montre ces détails aux applications, leur permettant d'utiliser le matériel de manière plus intelligente. De cette façon, il réduit les étapes inutiles et permet à chaque application de gérer les ressources à sa manière, ce qui peut améliorer les performances de l'ordinateur et une utilisation plus efficace de ses composants. Cette conception est particulièrement adaptée aux tâches informatiques spéciales où les applications peuvent réellement bénéficier de la gestion directe du matériel, ce qui peut conduire à de meilleures performances et à une utilisation plus efficace des composants de l'ordinateur. Plusieurs limitations sont associées aux exokernels. Ils manquent d'abstractions pour les services des systèmes d'exploitation, ce qui rend difficile d'atteindre une cohérence entre les applications. Ils exigent également qu'un développeur d'applications gère l'allocation et la protection des ressources et implémente des mécanismes de sécurité, ce qui soulève des préoccupations.

Les ressources matérielles virtualisées et évolutives qui sont livrées sur Internet en tant que service sont appelées infrastructure infonuagique (cloud infrastructure). Cette infrastructure englobe une gamme de composants, y compris les serveurs, les périphériques de stockage, l'équipement réseau et les logiciels de virtualisation (virtualization), tous hébergés dans des centres de données gérés par des fournisseurs de services infonuagiques. Contrairement à l'infrastructure physique traditionnelle, l'infrastructure infonuagique offre flexibilité, extensibilité et accessibilité, permettant aux utilisateurs d'accéder et de gérer les ressources informatiques à distance via Internet. L'infrastructure infonuagique est classée en trois modèles de service :

  • Infrastructure as a Service (IaaS) fournit des ressources informatiques virtualisées sur Internet, telles que AWS EC2, Google Compute Engine et Microsoft Azure VMs.
  • Platform as a Service (PaaS) offre des outils matériels et logiciels sur Internet, ciblant généralement les développeurs tels que Google App Engine et Microsoft Azure.
  • Software as a Service (SaaS) fournit des applications logicielles sur Internet, accessibles depuis un navigateur web sans installation ni exécution sur les appareils personnels de l'utilisateur, tels que Google Workspace et Microsoft Office 365.

Les principaux inconvénients de l'infrastructure infonuagique sont les temps d'arrêt potentiels, les préoccupations en matière de sécurité et de confidentialité, la vulnérabilité aux attaques, le contrôle et la flexibilité limités, le verrouillage du fournisseur, les préoccupations de coût, les problèmes de latence, la dépendance à Internet, les problèmes techniques, le manque de support, les problèmes de bande passante et les performances variées.

La technologie au quotidien

Envoi d'e-mails à distance

Les machines virtuelles ont un impact sur toutes les industries aujourd'hui car elles facilitent l'exécution de nombreuses applications commerciales. Par exemple, la plupart des entreprises utilisent Google Mail ou Microsoft Outlook pour fournir des services de messagerie à leurs employés. Il s'agit d'infrastructures infonuagiques de type Software as a Service (SaaS) qui exploitent le logiciel de messagerie en utilisant des machines virtuelles qui s'exécutent dans les centres de données Google et Microsoft Cloud.

Un avantage majeur de la messagerie SaaS pourrait être la portabilité. Parce que l'application peut s'exécuter sur n'importe quelle machine locale avec un navigateur approprié, cela permet aux utilisateurs d'utiliser l'application sur de nombreuses plateformes différentes, y compris les téléphones mobiles et les tablettes. De plus, il y a une sauvegarde automatique des données enregistrées, et aucun besoin d'installations et de configurations compliquées. Les inconvénients du SaaS pourraient inclure le manque de sécurité des données stockées dans l'application en ce qui concerne l'accès non autorisé et l'incapacité des utilisateurs à utiliser l'application lorsque la connexion réseau est faible ou inexistante.