Interstices


  Approfondir

Le ballet des processus dans un système d’exploitation

Que se passe-t-il quand vous appuyez sur le bouton de mise en marche de votre ordinateur ? Avant que vous ne puissiez commencer à travailler, tout un ballet s’exécute…

Évocation du ballet

Photo : zaimoku_woodpile / Flickr Licence Creative Commons BY 2.0.

Dans un premier article, nous avons abordé les rôles du système d’exploitation ainsi que ses représentations statique et dynamique. Nous avons alors indiqué que la notion de processus permettait d’assurer le déroulement concomitant de plusieurs services. Un programme, rappelons-le, est la description d’un service alors qu’un processus est le déroulement et le suivi de son exécution par l’ordinateur.

L’évolution des systèmes d’exploitation des ordinateurs, depuis leur émergence voici bientôt soixante ans, s’est accompagnée de l’augmentation continue du nombre des processus. Nous choisissons ici de présenter successivement deux groupes de processus, les uns associés aux infrastructures communes (les processus du système), les autres à la « machine virtuelle » de chacun des utilisateurs (les processus des utilisateurs). Mais avant de créer des processus, il faut mettre en place les dispositifs qui vont permettre au système de les gérer et de les faire évoluer en parallèle.

Mise en place des infrastructures communes

Au moment où on l'appuie sur le bouton de mise en marche de l’ordinateur, celui-ci reçoit l’énergie électrique qui va permettre l’amorçage du système d’exploitation. Au début, les programmes sont séquentiels car la gestion de processus n'est pas encore installée.

Cette phase séquentielle préalable à la mise en place du parallélisme se divise elle-même en plusieurs étapes.

L’amorce, petit programme séquentiel qui est câblé en binaire dans une mémoire non-modifiable (ROM ou read only memory), sert principalement à rechercher le disque (ou la clé de mémoire flash) sur lequel se trouve la suite de l’installation du système. Après avoir chargé ce programme d’installation, l’amorce lui passe la main pour qu’il continue pas à pas la genèse du système.

Le programme d’installation, séquentiel lui aussi, recense successivement les composants physiques de la machine, ceux qu’on appelle ressources physiques du système. Après avoir identifié le type et le nombre des processeurs, puis déterminé la taille de la mémoire centrale physique disponible, le programme cherche à détecter les autres dispositifs physiques et les périphériques. Cela concerne l’horloge temps réel, le jeu d’interruptions, la mémoire spéciale (appelée parfois MMU pour Memory Management Unit) qui servira au partage dynamique de la mémoire centrale, les divers disques et supports rémanents externes, la caméra, le microphone, le haut-parleur, l’émetteur-récepteur de communication sans fil, les terminaux, les écrans, les imprimantes, etc. Le programme d’installation crée la base de temps en mettant en route l’horloge temps réel. Pour les ressources physiques qu’il a reconnues, il installe les programmes d’interface capables de les piloter. Ceux-ci se prémunissent contre l’indéterminisme des réactions de ces ressources physiques par des délais de garde fournis par l’horloge.

Il faut ensuite installer le noyau du système. Celui-ci regroupe tous les programmes et données nécessaires au système pour gérer et partager les ressources matérielles recensées. Le noyau est ainsi une sorte de galerie marchande avec des ateliers pour la construction à la demande des objets logiciels qui, sous le contrôle du système d'exploitation, implantent les concepts qui président au fonctionnement du système. C’est là que sont matérialisés les processus, fichiers, catalogues, espace d’adressage ou mémoire virtuelle, canaux, boîtes aux lettres, messages, sémaphores, moniteurs, cercles de convivialité, objets de synchronisation entre processus, dispositifs basiques de sécurité et de contrôle d’accès, etc.

Pour ces objets, le noyau décrit des « gabarits », carcasses vides prédéfinies, qu’il faudra remplir à la création d’un processus, d’un fichier, d’un répertoire de fichiers ou d’un autre objet de base du système.  Chaque gabarit sera renseigné avec les caractéristiques propres à l’objet particulier créé.

C’est dans le noyau qu’on installe aussi le programme de l’ordonnanceur qui devra attribuer aux processus parallèles l’utilisation des processeurs, pour un temps et à tour de rôle. À la fin de cette étape, le matériel est configuré et les composants du noyau sont prêts à servir. Les processus peuvent désormais être créés et l’on pourra passer au parallélisme.

Entrée en scène des processus et du parallélisme

Le programme d’installation met en place le programme du premier processus du système, le processus ombilical, appelé aussi processus racine (root), et crée son bloc de contrôle en utilisant un gabarit défini par le noyau. Une fois ce processus enregistré dans le noyau et son nom placé dans la liste des processus à ordonnancer, le fonctionnement reposant sur le parallélisme peut commencer. Même s’il n’y a encore qu’un seul processus à cet instant, l’ordonnanceur est activé et il attribue le processeur au processus qui le demande, le processus ombilical. Celui-ci peut démarrer, le rôle du programme d’installation est alors terminé.

C’est désormais le processus ombilical qui poursuit la mise en place des infrastructures communes en créant les processus du système, parfois appelés démons. Il installe le démon qui gère l’utilisation de l’horloge temps réel et reçoit les signaux extérieurs qui permettent de la maintenir à l’heure du monde. Il crée les démons qui participent à la gestion dynamique de la mémoire centrale, comme le démon de pagination et le démon de va-et-vient avec le disque système. Il complète l’installation du « système de fichiers » en créant les processus qui vont gérer les fichiers et les catalogues et ceux qui autorisent une extension externe du catalogue, par le « montage » dans celui-ci de fichiers qui sont sur des supports externes. Il crée d’autres démons initiaux comme le processus de gestion des terminaux connectés, ou celui qui se charge de l’admission d’un utilisateur en lui demandant son code d’accès et son mot de passe, et bien d’autres encore selon la particularité du système d’exploitation.

Ces processus s’exécutent en mode privilégié, c’est-à-dire qu’ils ont le droit d’utiliser toutes les instructions du processeur, y compris celles qui touchent aux mécanismes de la conduite de l’ordinateur. Ils se déroulent sans filet, ce sont des processus à risque car toute erreur dans leur programmation peut entraîner la panne du système.

Lorsque le processus ombilical a terminé la mise en place des infrastructures communes, il se met en attente d’un appel par un événement nouveau. Par exemple, lorsqu’un utilisateur demandant à entrer en session aura été validé par le démon d’admission, le processus ombilical créera le processus premier de cet utilisateur, comme indiqué ci-dessous.

Voir un exemple détaillé.

Les processus de la machine virtuelle d’un utilisateur

Quand un utilisateur est admis à se servir de l’ordinateur, donc à entrer en session, le système crée un processus, le « processus premier » qui est chargé de remplir le premier rôle imparti au système d'exploitation : créer une « machine virtuelle ». Celle-ci a pour objet de faciliter l’utilisation des programmes et des fichiers, de soigner le dialogue à l’écran et les accès avec le monde extérieur. Le processus premier utilise le profil de l’utilisateur et la description de son environnement de travail qui ont été gardés dans un fichier du système, et qu’il modifie si besoin est. Il peut ainsi particulariser le mode de dialogue avec chaque utilisateur. Il trouve dans ce fichier, entre autres, l'accès vers les fichiers de l’utilisateur, vers les applications que celui-ci pourra utiliser, la description de l’organisation de la fenêtre sur l’écran.

Ce processus premier orchestre la mise en place de processus qu’il crée et détruit au fur et à mesure des besoins concomitants, explicites et implicites, de cet utilisateur. Ce sont en particulier des processus pour l’édition, l’analyse et l’exécution de commandes, la gestion de l’écran, du clavier, de la souris et de l’écran tactile. Ce sont aussi des processus qui assurent les aspects logiques de l’accès aux fichiers, à l’imprimante, au réseau et dialoguent avec les processus du système qui pilotent les aspects technologiques de l’accès au matériel et au réseau. Dans la fenêtre du processus premier, l’utilisateur trouve sur l’écran, soit dans des menus, soit sous forme d’icônes, la liste de ses fichiers et des applications qu’il peut utiliser comme, par exemple : navigateur, courriel, écoute de musique, classement de photos, édition de texte, compilation, comptabilité, application industrielle spécifique ou encore programme que l’utilisateur a lui-même écrit et compilé.

Quand l’utilisateur « ouvre » l'une de ces applications, le processus premier prépare un processus ad hoc qui va être associé à cette nouvelle application. Pour cela, il renseigne le bloc de contrôle de ce processus, en particulier le nom du programme binaire à exécuter et ses données initiales. Le programme de l’application peut se trouver dans un fichier unique, prêt à être exécuté par le processeur, en binaire. Il peut aussi être formé d’un ensemble de composants situés dans divers fichiers. Mais, pour paraphraser Henri Poincaré, une accumulation de composants n’est pas plus un programme qu’un tas de pierres n’est une maison. (« On fait la science avec des faits, comme une maison avec des pierres ; mais une accumulation de faits n’est pas plus une science qu’un tas de pierre n’est une maison. » H. Poincaré, La science et l’hypothèse, 1902)

Certains de ces composants exportent des fonctions, des données ou des définitions, d’autres ont besoin d’en importer. Il faut les interconnecter, nouer des liens entre eux pour qu’ils puissent fonctionner ensemble comme un tout. Cette « édition de liens » permet à tout programme d’utiliser la bibliothèque des programmes de service proposés par le système d’exploitation et partageables.

Quand le processus de l’application considérée démarre, une nouvelle fenêtre de dialogue apparaît à l’écran et se superpose à la fenêtre ouverte par le processus premier et aux fenêtres déjà ouvertes. Ce nouveau processus est sous la houlette du processus premier. Pour permettre du parallélisme dans cette application, le nouveau processus créera d’autres processus, un par service concurrent : réception du courriel, émission du courriel, gestion d’une nouvelle fenêtre de dialogue sur l’écran, émission de messages vers le réseau, réception de messages provenant du réseau, etc. Quand l’utilisateur « quitte » une application, le processus premier détruit les processus qu’il a créés et qui ne sont plus utiles.

Voir la suite de l'exemple détaillé.

Cet environnement de travail de l’utilisateur, qui évolue pendant la session, est sauvegardé en permanence sur une mémoire rémanente, tel le disque, dans la base de données du système, pour pouvoir être retrouvé si l’utilisateur quitte l’ordinateur avant d’avoir déclaré la fin de la session ou en cas de panne. En fin de session, le processus premier et les autres processus qui ont été créés pour cette machine virtuelle sont détruits.

Il arrive qu'un système d’exploitation permette plusieurs utilisateurs successifs ou simultanés, chacun avec son écran. C’est le cas par exemple dans une conduite industrielle en temps réel ou dans le service informatique d’une entreprise. Chaque utilisateur est alors gratifié d’un processus premier et d’un environnement de travail dans une fenêtre spécifique.

Voir la suite et fin de l'exemple détaillé.

Lorsque le système est un hyperviseur qui permet de faire cohabiter des systèmes d'exploitation différents sur le même ordinateur, l’amorçage de l’hyperviseur va consister à installer les systèmes hôtes pour qu’ils aient la faculté d’utiliser et de gérer les ressources communes (et les interruptions correspondantes). On a alors une abstraction de plus dans l’architecture du système. Dans ce cas, le processus premier devient le programme d’installation du système hôte.

Contrairement aux processus du système, les processus de la machine virtuelle d’un utilisateur ne s‘exécutent pas en mode privilégié, mais en mode utilisateur, ce qui ne leur donne pas accès aux mécanismes sensibles de l’ordinateur. Des fautes dans leur programmation ne peuvent entraîner que la panne de la machine virtuelle. Pour accéder aux ressources physiques communes, ils doivent faire appel à des processus du système.

Complexité et sécurité

La complexité des systèmes d’exploitation résulte tant du nombre et de la taille des programmes impliqués que de la multiplicité des processus et de leurs interactions.

Les processus qui s’exécutent en parallèle se déroulent de manière asynchrone, c’est-à-dire que chacun des processus a une évolution indépendante. Mais ces processus ne sont pas totalement indépendants : ils doivent se synchroniser à des instants donnés pour pouvoir coopérer. Ainsi ils peuvent être conduits à enchaîner des actions faites séparément par chacun d’eux, à se communiquer des messages, à collaborer pour conserver la cohérence des données partagées (modifiables par plusieurs d’entre eux), à coordonner leur compétition d’accès aux ressources, à établir des consensus pour prendre des décisions collectives qui font évoluer l’état global du système. Tout cela relève de la programmation parallèle avec des algorithmes de synchronisation qui sont délicats à maîtriser et d’autant plus complexes qu’il y a un nombre important de processus.

Pour la sûreté de l’exécution, on contourne cette complexité par une conception architecturale qui suit un découpage hiérarchique des programmes et on restreint autant que possible les pouvoirs d’un processus. Un des premiers mécanismes câblés a été spécialement inventé pour permettre l’utilisation du processeur selon deux modes bien distincts : mode privilégié et mode utilisateur.

Certains processus, au niveau du système, doivent avoir accès à toutes les instructions du processeur, y compris celles qui utilisent les dispositifs spéciaux de la conduite de l’ordinateur ou qui permettent de détruire d’autres processus. Leurs programmes s’exécutent en mode dit « privilégié ». Ils doivent être sans faute car toute panne d’un de ces processus peut détruire le système. Les autres processus, comme les processus premiers ou les processus d’application, s’exécutent en mode utilisateur, c’est-à-dire sans avoir accès aux instructions privilégiées. Ils se déroulent sous la surveillance du noyau et de processus du système qui peuvent circonscrire les effets des erreurs de leurs programmes et protéger le système contre leurs pannes.

D’autres mécanismes câblés ou programmés ont été inventés pour isoler les processus les uns des autres, protéger les accès aux informations et aux ressources partagées, fiabiliser la synchronisation entre les processus, partager dynamiquement la mémoire centrale et sauvegarder l’état du travail de chaque processus. Mais la grande complexité des systèmes rend illusoire le « zéro défaut » ! Pour augmenter leur sûreté, il faut s’attacher à réduire les fautes de conception, combattre les erreurs de programmation et circonscrire la propagation de celles qui entraînent des arrêts intempestifs ou la panne fatale du système.

Complexité de la conception et sécurité de l’exécution sont les défis actuels pour les concepteurs qui continuent à développer des systèmes d’exploitation. On applique évidemment les meilleures techniques du génie logiciel. On reconsidère également l’architecture des systèmes : on essaie, notamment, de restreindre la taille du noyau et celle des processus du système qui ont tous les droits sur la conduite de l’ordinateur, en reportant le plus d’actions possibles vers des processus se déroulant en mode utilisateur. Cette diminution de taille permet d’améliorer la qualité et ouvre la voie à des techniques automatiques de preuve de programme et à la certification des systèmes d’exploitation.

Tags