Aller au contenu

« Noyau de système d'exploitation » : différence entre les versions

Un article de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
AlphaBot (discuter | contributions)
m Homonymie résolue à l'aide du robot: Windows
RobotE (discuter | contributions)
m robot Ajoute: sl
Ligne 225 : Ligne 225 :
[[pt:Kernel]]
[[pt:Kernel]]
[[ru:Ядро (операционной системы)]]
[[ru:Ядро (операционной системы)]]
[[sl:Jedro (računalništvo)]]
[[sv:Operativsystemskärna]]
[[sv:Operativsystemskärna]]
[[zh:内核]]
[[zh:内核]]

Version du 8 novembre 2005 à 21:39

Le noyau (en anglais « kernel ») est la partie fondamentale d'un système d'exploitation, il est le gestionnaire de ressources de la machine, qui permet aux éléments matériels et logiciels de communiquer entre eux, de fonctionner ensemble et de former un tout. Pour ces raisons, il est le premier logiciel chargé en mémoire (hors gestionnaire de boot). C'est donc bien évidemment la partie la plus critique d'un système d'exploitation.


Architecture des systèmes à Noyau

Tous les systèmes d'exploitation ne sont pas construits autour de la notion de noyau. C'est le cas cependant de la majorité d'entre eux. L'existence d'un noyau, c'est à dire d'un unique programme responsable de la communication entre le matériel et le logiciel, résulte de compromis complexes portant sur des questions de performance, de sécurité et d'architecture des processeurs.

Il existe des système sans noyaux (MS-DOS, CP/M), avec des micro-noyaux (Hurd, QNX), des exo-noyaux, etc. Ces systèmes sont généralement adaptés à des applications très ciblées mais posent des problèmes variés (de sécurité avec MS-DOS, de performances avec Hurd ou QNX) et sont actuellement inadaptés pour une utilisation dans des serveurs ou ordinateurs de bureau.

L'existence d'un noyau présuppose une partition de la mémoire vive physique en deux régions disjointes, l'une étant réservée au noyau (l'espace noyau) et l'autre aux applications (l'espace utilisateur). Le noyau a plein pouvoirs sur l'utilisation des ressources matérielles, en particulier de la mémoire. Les programmes dans l'espace utilisateur disposent de pouvoirs restreints : ils doivent demander au noyau de la mémoire, et s'ils touchent à de la mémoire ne leur appartenant pas, ils sont évincés automatiquement. Le mécanisme d'éviction repose sur un mécanisme du processeur, nommément une unité de gestion de la mémoire, ou MMU, qui signale au noyau l'existence d'un processus fautif. C'est le noyau lui-même qui prend la décision de suspendre ou détruire immédiatement le fautif.

Cette division fondamentale entre espace noyau et espace utilisateur contribue beaucoup à donner leur forme et leur contenu actuels aux systèmes mainstream (Linux, Windows, MacOS X). Elle structure également l'espace des développeurs : il y a les développeurs noyau et les autres ... L'écriture d'un noyau est en effet une tâche extrêmement complexe et délicate.

Le noyau offre ses fonctionnalités (l'accès aux ressources qu'il gère) à travers des appels systèmes. Ce sont des fonctions dont l'utilisation par un programme entraîne l'activation du noyau, le traitement, puis le retour au programme appelant. Le coût d'un appel système est donc nettement plus élevé qu'un simple appel de fonction intra-processus, puisqu'il suppose au moins deux changements de contextes (programme appelant -> noyau -> appelant), dont le coût se compte en milliers ou dizaines de milliers d'instructions primitives.

Fonctions généralement remplies par un noyau

Les noyaux ont comme fonctions de base :

À l'exception rare de certains noyaux, ils ne sont pas limités à leurs fonctionnalités de base. On trouve généralement dans les noyaux les fonctions des micronoyaux :

La plupart des noyaux fournissent également :

  • des modèles de pilotes
  • des pilotes matériels

Suivant leurs conceptions, les noyaux fournissent en plus :

En dehors de fonctionnalités de base signalées dans les deux premiers points, l'ensemble des fonctions des points suivants (y compris les pilotes matériels, les fonctions réseaux et systèmes de fichiers) ne sont pas nécessairement fournies par un noyau de système d'exploitation. Ces fonctions peuvent être implantées tant dans l'espace utilisateur que dans le noyau lui même. Leur implémentation dans le noyau est faite dans l'unique but d'augmenter les performances et la sécurité.

En effet, suivant la conception du noyau, la même fonction appelée depuis l'espace utilisateur ou l'espace noyau a un coût temporel notoirement différent. Si cet appel de fonction est fait souvent, il peut s'avérer utile d'intégrer ces fonctions au noyau de système d'exploitation pour augmenter les performances. Il faut noter que :

  • ces techniques sont utilisées pour pallier des défauts des noyaux (latence élevée)
  • il est notoirement plus complexe d'écrire et de maintenir un logiciel fonctionnant dans l'espace noyau que dans l'espace utilisateur
  • les bugs et failles de sécurité sont bien plus dangereuses

Ordonnanceur

L'ordonnanceur d'un système d'exploitation n'a de sens qu'en système multitâche. Il gère l'ordre dans lequel les instructions de différentes tâches sont exécutées et est responsable de la sauvegarde et de la restauration du contexte des tâches (ce contexte est constitué des registres processeurs), appelée également commutation de contexte.

La plupart des ordonnanceurs modernes permettent également d'indiquer sur quel processeur sont exécutés les tâches. Certains permettent également de migrer des tâches sur d'autres machines d'un cluster.

L'algorithme d'ordonnancement détermine quelle tâche doit s'exécuter en priorité et sur quel processeur. Cet algorithme doit permettre d'utiliser efficacement les ressources de la machine.

L'ordonnancement peut-être de type « coopératif » : les tâches doivent être écrites de manière à coopérer les unes avec les autres et ainsi accepter la suspension pour l'exécution d'une autre tâche. L'ordonnancement peut-être également de type « préemptif » : l'ordonnanceur a la responsabilité de l'interruption des tâches et du choix de la prochaine à exécuter. Certains noyaux sont eux-mêmes préemptifs : l'ordonnanceur peut interrompre le noyau lui-même pour faire place à une activité (typiquement, toujours dans le noyau) de priorité plus élevée.

Gestionnaire de mémoire

Le gestionnaire de mémoire est le sous-ensemble du système d'exploitation qui permet de gérer la mémoire de l'ordinateur. Sa tâche la plus basique est d'allouer de la mémoire à des processus lorsqu'ils en ont besoin. Cette mémoire allouée est par défaut propre au processus qui fait la demande.

Le gestionnaire de mémoire masque la localisation physique de la mémoire (en mémoire vive ou sur disque dur, dans l'espace de swap) et présente au programme une mémoire virtuelle globale. Ainsi tout processus croit manipuler une mémoire qui a les propriétés suivantes :

  • la mémoire allouée commence systématiquement à l'adresse 0,
  • la mémoire peut être indéfiniment étendue,
  • la mémoire est privée (protégée), un processus ne peut pas accéder à la mémoire d'un autre processus (sauf allocations et autorisations spécifiques).

L'intérêt de ne pas indiquer au processus l'emplacement physique des données est de permettre au gestionnaire de mémoire de gérer voire déplacer suivant ses convenances les données en mémoires. Ces données peuvent être migrées pour optimiser les performances :

  • dans la mémoire physique (plus ou moins proche du processeur)
  • dans la mémoire virtuelle (swap)
  • dans la mémoire accessible par réseaux (cluster)
  • la mémoire peut être gérée de manière optimiste, la mémoire allouée mais pas encore utilisée peut être virtuellement allouée à plusieurs processus (Linux).
  • dans un contexte multitâche, le changement de contexte est facilité.

Gestion du matériel

La gestion du matériel se fait par l'intermédiaire de pilotes de périphériques (drivers). Les pilotes sont des petits logiciels légers dédiés à un matériel donné qui permettent de faire communiquer ce matériel. En raison du très grand nombre d'accès à certains matériels (disques dur par exemple), certains pilotes sont très sollicités. Pour ces raisons, ils sont généralement inclus dans l'espace noyau et communiquent avec l'espace utilisateur via les appels systèmes.

Cependant, indépendamment de l'architecture, de nombreux périphériques lents (certains appareils photographiques numériques, outils sur liaison série, etc.) sont/peuvent être pilotés depuis l'espace utilisateur, le noyau intervenant au minimum.

Il existe des couches d'abstraction de matériel qui présentent la même interface à l'espace utilisateur et simplifient ainsi le travail des développeurs d'applications. Dans les systèmes de type UNIX, l'abstraction utilisée est le système de fichier : les primitives open, close, read et write sont présentées à l'espace utilisateur pour manipuler toutes sortes de périphériques. On parle dans ce cas de système de fichier synthétique.

Différents types de noyaux

Il existe toute sorte de noyaux, plus ou moins spécialisés. Il existe des noyaux spécifiques à une architecture, souvent mono-tâche (MS-DOS par exemple), d'autres généralistes et souvent multi-tâches et multi-utilisateurs.

Noyaux monolithiques non modulaires

Certains systèmes d'exploitation, comme d'anciennes versions de GNU/Linux, certains BSD ou certains vieux Unix ont un noyau monolithique. C’est-à-dire que l'ensemble des fonctions du système et des pilotes sont regroupés dans un seul bloc de code et un seul bloc binaire généré à la compilation.

Avantages :

  • la facilité de conception et de développement
  • la vitesse d'exécution est excellente

Défauts :

  • difficulté à maintenir le code (code réputé fouilli)
  • problèmes de portage

En réalité les problèmes de la portabilité de code se sont révélés avec le temps independant de la problématique de la technologie du noyaux. Pour preuve NetBSD est un noyau monolithique et est ultra portable, alors que des noyaux tels que Hurd ou celui de Windows XP utilisent des technologies censées faciliter le portage mais n'existent que pour quelques architectures.

Noyaux monolithiques modulaires

Pour répondre aux problèmes des noyaux monolithiques, ces derniers sont devenus modulaires. La très grande majorité des systèmes actuels utilisent cette technologie : GNU/Linux, la plupart des BSD ou Solaris.

Dans ce type de noyaux, les parties principales du système sont regroupées dans un bloc de code unique (monolithique). Les autres fonctions, les blocs de fonctions auxiliaires sont regroupés en différents modules qui peuvent être séparés tant du point de vue du code que du point de vue binaire.

Par exemple sous Linux, certaines parties peuvent être non-compilées ou compilées en tant que modules chargeables ou directement dans le noyau, ainsi les systèmes de fichiers peuvent être chargés de manière indépendante, un pilote de périphérique changé, etc.

Avantages :

  • la facilité de conception et de développement (un peu plus complexe cependant)
  • la vitesse d'exécution est excellente
  • le code est plus clair et mieux organisé
  • le chargement en mémoire des fonctionnalités du système peut être fait à la demande

Défauts :

  • problèmes de portage restent, mais sont plus que jamais théoriques et contredits par la pratique.

Micro-noyaux

Les micro-noyaux ont une approche radicalement différente de la notion de noyau. Ils cherchent à minimiser les fonctionnalités dépendantes du noyau en plaçant la plus grande partie des services du système d'exploitation à l’extérieur de ce noyau, c'est à dire dans l'espace utilisateur. Ils sont alors pris en charge par des petits serveurs indépendants (avec leur propre espace d’adressage).

Ce principe a de grands avantages : en éloignant les services "à risque" des parties critiques du système d’exploitation regroupées dans le noyau, il permet de gagner en robustesse et en fiabilité, tout en facilitant la maintenance et l’évolutivité. En revanche, les mécanismes de communication (IPC) qui deviennent fondamentaux pour assurer le passage de messages entre les serveurs, sont très lourds et peuvent limiter les performances.

Mach et L4 sont des exemples de micro-noyaux. Hurd fonctionne sur Mach et est en cours de portage sur L4. XNU, le noyau de Mac OS X, fonctionne sur Mach.

Avantages d'un système d'exploitation utilisant un micro-noyau :

  • placer de nombreux services "à risque" en espace utilisateur restreint leur accès aux ressources du système et permet donc d'avoir plus de sécurité
  • le système est très configurable : on peut lancer uniquement les services qui nous intéressent et personnaliser ainsi son système d'exploitation. Il peut être facilement adapté à de nouveaux matériels et applications, il suffit de modifier ou d'ajouter les serveurs concernés, sans perturber le reste du système
  • le développement est facilité : lorsque l'on change la pile réseau, il suffit simplement d'arrêter l'ancien service réseau et de lancer le nouveau, sans devoir redémarrer toute la machine avec risque de crash. Les erreurs de fonctionnement d'un serveur sont ainsi isolées comme des erreurs classiques d'une application, sans menace pour toute la stabilité du système.On peut tester les modifications en marche
  • on peut faire coexister dans un même système plusieurs API, plusieurs systèmes de fichier, plusieurs fonctionnalités concurrentes du système d'exploitation
  • la complexité de l'ensemble est réduite : les interdépendances entre les différents serveurs sont faibles et permettent de travailler sur une architecture "propre" et modulaire, qui ne devient pas ingérable dès que l'on ajoute un nouveau service
  • les micro-kernels sont beaucoup plus compacts : 6 millions de lignes de code pour le noyau Linux 2.6.0 contre en général moins de 50 mille lignes pour les micro-noyaux. Cela facilite la maintenance

Les premiers micro-noyaux (comme Mach) n'ont pas tout de suite atteint ces avantages théoriques. Ils ont principalement dû faire face aux problèmes suivants :

  • interfaces de communication entre les services (IPC) complexes et trop lourdes en temps de traitement
  • très grand nombre d'appels système comme la plupart des services sont à l'extérieur du noyau

Le grand nombre d'appels système est un défaut inhérent à la conception des micro-noyaux. Dans L4, il a été résolu en plaçant encore plus de services en espace utilisateur. Quand à la rapidité de traitement des IPC elle a pu être améliorée en les simplifiant au maximum, par exemple en supprimant toute vérification des permissions, laissant ce soin aux serveurs externes.

Ces modifications, assez radicales, ont permis d'obtenir de bonnes performances mais elles ne doivent pas faire oublier qu'un micro-noyau doit être accompagné d'un grand nombre de services pour fournir des fonctionnalités équivalentes à celles des noyaux monolithiques. De plus, la grande liberté dont disposent les services au niveau de la sécurité et de la gestion de la mémoire, accroît la difficulté et le temps de leur développement.

Exemples de système d'exploitation utilisant des micro-noyaux

Exemples de micro-noyaux

Micro-noyaux enrichis

Les micro-noyaux enrichis sont des micro-noyaux complétés par tout un ensemble de serveurs implémentant des services traditionnellement situés au sein des noyaux monolithiques. En effet, comme expliqué précédemment, les micro-noyaux sont minimalistes et doivent donc être accompagnés d'une collection complète de serveurs externes afin de fournir des fonctionnalités équivalentes à des noyaux monolithiques.

Hurd et XNU sont des exemples de micro-noyaux enrichis.

Avantage :

  • ils gèrent beaucoup plus de fonctionnalités, souvent essentielles comme le système de fichier ou la pile réseau

Défaut :

  • perte du minimalisme des micro-noyaux

Noyaux hybrides

Classification arbitraire mélangeant différents types de noyaux. Le terme "hybride" désigne principalement des noyaux qui reprennent des concepts à la fois aux noyaux monolithiques et aux micro-noyaux, pour combiner les avantages des deux.

Lorsqu'au début des années 90 les développeurs de micro-kernels se sont aperçus des faiblesses des premiers micro-noyaux, certains réintégrèrent diverses fonctionnalités non fondamentales dans le noyau, pour gagner en performances, les micro-noyaux "purs" semblant condamnés à l'échec. Un exemple de ce type de noyaux hybrides est le noyau XNU de Mac OS X, qui est basé sur le micro-noyau Mach 3.0 mais qui inclus du code du noyau monolithique BSD.

D'autres types de noyaux peuvent être appelés noyaux hybrides. Par exemple :

  • les noyaux monotlithiques sur micro-noyaux temps-réel ou non : L4Linux (Linux sur L4), MkLinux (Linux sur Mach), Adeos, RTLinux et RTAI.
  • les noyaux monotlithiques modulaires : Linux
  • les micro-noyaux enrichis : Hurd et XNU

Exo-noyaux

Un exo-noyau ne fournit aucune abstraction. Dans ces deux derniers cas, les fonctions restantes nécessitent de petits modules qui peuvent être configurés avec flexibilité. Le micro ou exo-noyau plus ces modules est alors appelé noyau au sens large.

Méta-noyaux

À remplir.

Noyaux temps-réel

Les noyaux temps-réel sont fonctionnellement spécialisés, ils peuvent adopter en théorie n'importe quel type de fonctionnement précédemment listé.

Ce sont des noyaux généralement assez légers qui ont pour fonction de base stricte de garantir les temps d'exécution des tâches. Il n'y a pas strictement de notion de rapidité de traitement ou de réactivté dans les noyaux temps-réel à proprement parler, cette notion est plutôt implicite à la garantie des temps d'exécution en comparaison aux critères temporels de l'application industrielle (la réactivité d'un système de freinage ABS n'a pas les mêmes critères temporels que le remplissage d'une cuve de pétrole).

Très utilisés dans le monde de l'électronique embarquée, ils sont conçus pour tourner sur des plateformes matérielles limitées en taille, puissance ou autonomie.

VxWorks est un noyau propriétaire temps-réel très implanté dans l'industrie bien que Linux se déploie énormément et ait un succès grandissant par RTAI (RTLinux étant breveté).

Discussion

On considère généralement les noyaux monolithiques comme obsolètes car difficiles à maintenir et moins « propres ». Linux était déjà qualifié d'obsolète par Andrew Tanenbaum [1], dès sa création en 1991. Il ne croyait pas, à l'époque, pouvoir faire un noyau monolithique multi-plateforme et modulaire. Mais la mise en place de micro-noyaux, même si elle est très intéressante en théorie s'avère difficile. Ainsi les performances de Linux sont en pratique supérieures à celles de ses concurrents (noyaux généralistes), sans compter qu'il fut finalement porté sur de très nombreuses plateformes et qu'il est modulaire depuis 1995.

Pour ces raisons de performance, Windows et Mac OS X n'ont pas un « vrai » micronoyau, mais un micro-noyau enrichi : certains services qui devraient être des mini-serveurs se retrouvent intégrés. Pour Mac OS X, cela forme XNU : un micronoyau Mach enrichi de services BSD.

Les micro-noyaux et les noyaux monotlithiques, considérés comme diamétralement différents en terme de conceptions, se rejoignent quasiment en pratique par les micro-noyaux enrichis et les noyaux monotlithiques modulaires.

L'avenir appartient peut-être aux exo-noyaux qui tireraient avantage des deux systèmes.

Bibliographie