La plupart des systèmes d’exploitation ont une méthode pour afficher l’utilisation du CPU. Dans Windows, il s’agit du gestionnaire de tâches.
L’utilisation du CPU est généralement représentée comme un simple pourcentage du temps du CPU passé sur des tâches non inactives. Mais c’est un peu une simplification. Dans tout système d’exploitation moderne, le CPU passe en fait du temps dans deux modes très distincts :
- Mode noyau
En mode noyau, le code d’exécution a un accès complet et sans restriction au matériel sous-jacent. Il peut exécuter n’importe quelle instruction du processeur et référencer n’importe quelle adresse mémoire. Le mode noyau est généralement réservé aux fonctions de plus bas niveau et les plus fiables du système d’exploitation. Les plantages en mode noyau sont catastrophiques ; ils arrêtent l’ensemble du PC.
- Mode utilisateur
En mode utilisateur, le code en cours d’exécution n’a pas la possibilité d’accéder directement au matériel ou de référencer la mémoire. Le code s’exécutant en mode utilisateur doit déléguer aux API du système pour accéder au matériel ou à la mémoire. En raison de la protection offerte par ce type d’isolation, les pannes en mode utilisateur sont toujours récupérables. La plupart du code exécuté sur votre ordinateur s’exécutera en mode utilisateur.
Il est possible d’activer l’affichage du temps du noyau dans le gestionnaire de tâches, comme je l’ai fait dans la capture d’écran ci-dessus. La ligne verte est le temps total du processeur ; la ligne rouge est le temps du noyau. L’écart entre les deux est le temps utilisateur.
Ces deux modes ne sont pas de simples étiquettes, ils sont appliqués par le matériel du CPU. Si le code s’exécutant en mode utilisateur tente de faire quelque chose en dehors de son champ d’action – comme, par exemple, accéder à une instruction privilégiée du CPU ou modifier la mémoire à laquelle il n’a pas accès – une exception trappable est lancée. Au lieu de faire tomber tout le système en panne, seule cette application particulière tombe en panne. C’est la valeur du mode utilisateur.
Le matériel du CPUx86 fournit en fait quatre anneaux de protection : 0, 1, 2, et 3. Seuls les anneaux 0 (noyau) et 3 (utilisateur) sont généralement utilisés.
Si nous n’utilisons que deux anneaux d’isolation, il est un peu difficile de savoir où les pilotes de périphériques doivent aller – le code qui nous permet d’utiliser nos cartes vidéo, nos claviers, nos souris, nos imprimantes, etc. Ces pilotes sont-ils exécutés en mode Kernel, pour des performances maximales, ou en mode Utilisateur, pour une stabilité maximale ? Sous Windows, du moins, la réponse est que cela dépend. Les pilotes de périphériques peuvent s’exécuter en mode utilisateur ou en mode noyau. De nos jours, la plupart des pilotes s’exécutent en mode utilisateur, à l’exception notable des pilotes de cartes vidéo, qui nécessitent des performances extrêmes en mode noyau. Mais même cela est en train de changer ; dans Windows Vista, les pilotes vidéo sont segmentés en sections Utilisateur et Noyau. C’est peut-être pour cela que les joueurs se plaignent que Vista est environ 10 % plus lent dans les jeux.
La frontière exacte entre ces modes est encore un peu floue. Quel code doit être exécuté en mode utilisateur ? Quel code doit s’exécuter en mode Kernel ? Ou peut-être allons-nous simplement redéfinir l’étage comme le sous-sol – la montée de la virtualisation a conduit à la création d’un nouvel anneau en dessous de tous les autres, l’anneau -1, que nous connaissons maintenant comme la virtualisation matérielle x86.
Le mode utilisateur est clairement un bien public net, mais il a un coût. La transition entre le mode utilisateur et le mode noyau est coûteuse. Vraiment cher. C’est pourquoi les logiciels qui lancent des exceptions sont lents, par exemple. Les exceptions impliquent des transitions en mode noyau. Accordé, nous avons tellement de performances maintenant que nous avons rarement à nous soucier des performances de transition, mais quand vous avez besoin de performances ultimes, vous commencez définitivement à vous soucier de ce genre de choses.
Probablement l’exemple le plus public de redessiner la ligne utilisateur / noyau est dans les serveurs web. IIS 6 de Microsoft a déplacé une partie considérable de sa fonctionnalité de base en mode noyau, notamment après qu’un serveur Web open-source particulier a tiré parti du mode noyau pour créer une énorme victoire de référence de l’industrie. C’était une guerre inutile, si vous voulez mon avis, puisque les optimisations du noyau (dans les deux camps) ne s’appliquent qu’au contenu HTML statique. Mais il en est ainsi de toutes les guerres, qu’il s’agisse de benchmark ou autre.
La stricte ségrégation du code du CPU entre le mode utilisateur et le mode noyau est complètement transparente pour la plupart d’entre nous, mais c’est littéralement la différence entre un ordinateur qui se plante tout le temps et un ordinateur qui se plante catastrophiquement tout le temps. C’est ce que nous, programmeurs extra-crashy-code-écrivains, aimons appeler le « progrès ». Donc, au nom de tous les programmeurs du monde entier, je voudrais dire merci au mode utilisateur. Vous êtes génial!