Noyau (informatique)
- Pour les articles homonymes, voir noyau. Image manquante
Logo_Begriffsklärung.png
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 fonctionner ensemble. Pour ces raisons, il est le premier logiciel chargé en mémoire (hors gestionnaire de boot).
| Sommaire |
Fonctions généralement remplies par un noyau
Les noyaux ont comme fonctions minimales :
- chargement et exécution des processus
- gestion des entrées/sorties
- interface avec les logiciels de l'espace utilisateur
A l'exception de certains noyaux, les noyaux 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 :
- la gestion des systèmes de fichiers
- plusieurs ordonnanceurs spécialisés (batch, temps réel, Entrées sorties ... non exhaustif)
- des notions de processus étendues telles que les processus légers (non exhaustif)
- des services divers :
En dehors de fonctionnalités basiques signalés dans le point 1, l'ensemble des fonctions des points 3 et 4 (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.
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 (lattence élevées)
- Il est notoirement plus complexe d'écrire et de maintenir un logiciel fonctionnant dans l'espace noyau que dans 'espace utilisateur
Fonctions de base
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 fait en sorte que du point de vue de la tache traitée, cette tâche soit la seule à être traitée sur un processeur, c’est-à-dire que son contexte d'exécution reste cohérent lorsque l'ordonnanceur passe d'une tâche à l'autre.
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 un Cluster.
L'algorithme d'ordonnancement détermine quelle tâche doit s'exécuter en priorité et sur quel processeur en gérant des files d'attentes et des priorités. Cet algorithme doit permettre d'optimiser les ressources de la machine. C'est un des algorithmes les plus critiques d'un système d'exploitation, donc un élément déterminant de la qualité d'un noyau.
L'ordonnanceur 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'ordonnanceur peut-être également de type « préemptif » : c'est lui-même qui décide quelles tâches doivent s'exécuter sur quel processeur. Certains noyaux eux-mêmes sont préemptif : ils peuvent laisser les tâches en espace utilisateur s'exécuter sur un processeur.
Gestionnaire de mémoire
Le gestionnaire de mémoire est le sous-ensemble du système d'exploitation qui permet de manipuler efficacement la mémoire de l'ordinateur. Sa tâche la plus basique est de permettre à des processus d'utiliser de la mémoire lorsqu'ils en ont besoin. Cette mémoire allouée est généralement propre au processus qui fait la demande.
Cependant, à l'exception de certains systèmes d'exploitations basiques et/ou anciens (tels que MS-DOS, MacOS 9), les gestionnaires de mémoire permettent une gestion bien plus avancée que la simple allocation/désallocation de mémoire. Entre autre, les systèmes modernes permettent aux programmeurs de se détacher de problématiques telles que la localisation de la mémoire.
En effet, le getionnaire de mémoire masque la localisation physique de la mémoire (RAM ou disque dur) et présente au programme une mémoire virtuelle. Ainsi quelqu'il soit, un programme voit une mémoire virtuelle qui est telle que (Unix) :
- la mémoire allouée commence systématiquement à l'adresse 0
- la mémoire peut être - virtuellement - 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).
Le but de ne pas indiquer au processus la localisation 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é.
Autres fonctions généralement présentes dans le noyau
Gestion du matériel
La gestion du matériel se fait par l'intermédiaire de pilotes de périphériques. 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), 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...) sont/peuvent être pilotés depuis l'espace utilisateurs, le noyau intervenant au minimum.
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 pas exemple), d'autres généralistes et souvent multi-tâches et multi-utilisateurs.
Noyaux monolithiques
Certains systèmes d'exploitation, comme DOS, 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 sont regroupés dans un seul bloc de code et un seul bloc binaire généré à la compilation du système.
Dans cette conception, l'ensemble des pilotes (matériels, système de fichiers, piles... ) sont regroupés dans le même bloc de code binaire.
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 portage du code se sont révélés avec le temps independant de la problématique de la technologie du noyaux. Pour preuves NetBSD est un noyau monolithique et est ultra portable, alors que des noyaux tels que Hurd ou 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 compilées ou non, en tant que modules chargeable 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
Mach et L4 sont des exemples de micro-noyaux. Hurd fonctionne à la fois sur Mach et L4. XNU, le noyau de Mac OS X, fonctionne sur Mach. Les micro-noyaux fournissent un ensemble réduit d'abstractions simples. Les micro-noyaux sont très légers donc plus facilement maintenables et optimisables. En revanche, les mécanismes de communication sont très lourds et difficilement maintenables et débuggables.
Noyaux hybrides
Classification arbitraire mélangeant différents types de noyaux, 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 : XNU et Hurd
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
Bien que ne se classifiant pas dans un type d'architecture de noyaux, mais plutôt de fonctionnalités de base, les noyaux temps-réel sont également à lister ici.
Ce sont des noyaux généralement assez légers qui ont pour fonction de base 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.
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 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 démodés car difficiles à maintenir et moins « propres ». Linux était déjà considéré démodé dès sa création en 1991 ; on ne croyait pas, à l'époque pouvoir faire un noyau monolithique multi-plateforme et modulaire. Mais la mise en place de micronoyaux, même si elle est très intéressante en théorie s'avère difficile. Ainsi les performances de Linux sont 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 micronoyau 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.
En gros, les micro-noyaux enrichis et les noyaux monolithiques modulaires se rejoignent quasiment.
L'avenir appartient peut-être aux exo-noyaux qui tireraient les avantages des deux systèmes.
