Je lis l'article Wikipedia sur la gestion des processus . Je me concentre sur Linux. Je ne peux pas comprendre la relation et les différences entre l'appel système, le passage de message et l'interruption, dans leurs concepts et objectifs. S'agit-il tous de processus pour faire des requêtes au noyau pour des ressources et des services?
Quelques citations de l'article et quelques autres:
Il existe deux façons possibles pour un système d'exploitation de reprendre le contrôle du processeur pendant l'exécution d'un programme afin que le système d'exploitation effectue une désallocation ou une allocation:
- Le processus émet un appel système (parfois appelé interruption logicielle); par exemple, une demande d'E / S se produit demandant d'accéder à un fichier sur le disque dur.
- Une interruption matérielle se produit; par exemple, une touche a été enfoncée sur le clavier ou un minuteur est épuisé (utilisé dans le multitâche préventif).
Il existe deux techniques par lesquelles un programme s'exécutant en mode utilisateur peut demander les services du noyau:
* System call * Message passing
une interruption est un signal asynchrone indiquant le besoin d'attention ou un événement synchrone dans le logiciel indiquant le besoin d'un changement d'exécution.
Une interruption matérielle oblige le processeur à sauvegarder son état d'exécution et à commencer l'exécution d'un gestionnaire d'interruption. Les interruptions logicielles sont généralement implémentées en tant qu'instructions dans le jeu d'instructions, ce qui entraîne un changement de contexte vers un gestionnaire d'interruptions similaire à une interruption matérielle.
la source
Réponses:
Tous les systèmes d'exploitation modernes prennent en charge le multitâche. Cela signifie que le système est capable d'exécuter plusieurs processus en même temps; soit en pseudo-parallèle (lorsqu'une seule CPU est disponible) ou de nos jours avec des CPU multi-core communs en parallèle (une tâche / core).
Prenons le cas le plus simple d'un seul processeur disponible. Cela signifie que si vous exécutez en même temps deux processus différents (disons un navigateur Web et un lecteur de musique), le système n'est pas vraiment en mesure de les exécuter en même temps. Ce qui se passe, c'est que le processeur passe tout le temps d'un processus à l'autre; mais cela se produit extrêmement rapidement, donc vous ne le remarquez jamais.
Supposons maintenant que pendant que ces deux processus s'exécutent, vous appuyez sur le bouton de réinitialisation (mauvais garçon). Le CPU arrêtera immédiatement tout ce qui se passe et redémarrera le système. Félicitations: vous avez généré une interruption.
Le cas est similaire lorsque vous programmez et que vous souhaitez demander un service à la CPU. La différence est que dans ce cas, vous exécutez du code logiciel - généralement des procédures de bibliothèque qui exécutent des appels système (par exemple
fopen
pour ouvrir un fichier).Ainsi, 1 décrit deux façons différentes d'attirer l'attention du CPU.
La plupart des systèmes d'exploitation modernes prennent en charge deux modes d'exécution: le mode utilisateur et le mode noyau. Par défaut, un système d'exploitation s'exécute en mode utilisateur. Le mode utilisateur est très limité. Par exemple, toutes les E / S sont interdites; ainsi, vous n'êtes pas autorisé à ouvrir un fichier à partir de votre disque dur. Bien sûr, cela ne se produit jamais en réalité, car lorsque vous ouvrez un fichier, le système d'exploitation passe du mode utilisateur au mode noyau de manière transparente. En mode noyau, vous avez un contrôle total sur le matériel.
Si vous vous demandez pourquoi ces deux modes existent, la réponse la plus simple est la protection. Les systèmes d'exploitation basés sur le micro-noyau (par exemple MINIX 3) ont la plupart de leurs services fonctionnant en mode utilisateur, ce qui les rend moins nuisibles. Les noyaux monolithiques (comme Linux) ont presque tous leurs services fonctionnant en mode noyau. Ainsi, un pilote qui plante dans MINIX 3 est peu susceptible de faire tomber l'ensemble du système, alors que ce n'est pas inhabituel sous Linux.
Les appels système sont la primitive utilisée dans les noyaux monolithiques (modèle de données partagées) pour passer du mode utilisateur au mode noyau. Le passage de message est la primitive utilisée dans les micro-noyaux (modèle client / serveur). Pour être plus précis, dans un message, les programmeurs système utilisent également des appels système pour attirer l'attention du processeur. La transmission des messages n'est visible que par les développeurs du système d'exploitation. Les noyaux monolithiques utilisant des appels système sont plus rapides mais moins fiables, tandis que les micro-noyaux utilisant le passage de messages sont plus lents mais ont une meilleure isolation des pannes.
Ainsi, 2 mentionne deux façons différentes de passer du mode utilisateur au mode noyau.
Pour réviser, la façon la plus courante de créer une interruption logicielle, alias trap, est d'exécuter un appel système. En revanche, les interruptions sont générées uniquement par le matériel.
Lorsque nous interrompons le processeur (par logiciel ou par matériel), il doit enregistrer quelque part son état actuel - le processus qu'il exécute et à quel moment il s'est arrêté - sinon il ne pourra pas reprendre le processus lors du retour . Cela s'appelle un changement de contexte et cela a du sens: avant d'éteindre votre ordinateur pour faire autre chose, vous devez d'abord vous assurer que vous avez enregistré tous vos programmes / documents, etc. afin de pouvoir reprendre à partir du moment où vous avez arrêté le la prochaine fois que vous l'allumerez :)
Ainsi, 3 explique ce qui doit être fait après l'exécution d'un piège ou d'une interruption et la similitude des deux cas.
la source
creat
pour créer un nouveau fichier. Un exemple d'interruption est que l'imprimante envoie un signal à la CPU pour l'informer que l'impression est terminée.Les appels système, le passage de la messagerie (comme décrit dans l'article Wikipedia) et les interruptions sont toutes des choses qui provoquent un changement de contexte ou un passage du mode utilisateur au mode noyau. Comme vous le savez probablement:
mode noyau: les programmes ont une vue plate ou réelle de la mémoire, et les programmes peuvent lire / écrire librement sur toute la mémoire et tous les périphériques matériels directement sans restriction.
mode utilisateur: les programmes ont une vue virtualisée de la mémoire, les programmes ne peuvent pas lire / écrire librement sur toute la mémoire et ne peuvent pas lire / écrire les périphériques matériels directement. Pour obtenir plus de mémoire ou accéder aux périphériques matériels, le programme en mode utilisateur doit appeler le noyau. Les appels système et la transmission de messages sont deux méthodes pour ce faire.
Les appels système impliquent l'exécution d'une instruction ou d'un ensemble d'instructions spécifiques du CPU, qui font sauter le CPU (première adresse de retour d'enregistrement sur la pile) à une adresse prédéfinie (non accessible en écriture en mode utilisateur) et déplacer le CPU du mode utilisateur au mode noyau (anneau 3 pour sonner 0 dans l'architecture Intel).
Les interruptions matérielles font à peu près la même chose, elles font sauter le CPU (première sauvegarde de l'adresse de retour sur la pile) vers une adresse prédéfinie et déplacer le CPU du mode utilisateur au mode noyau. Ainsi, dans de nombreuses CPU, le même mécanisme peut être invoqué par un logiciel (appelé "interruption logicielle") et peut être utilisé pour les appels de CPU.
La transmission de messages implique (du moins pour moi) que le noyau est un "processus en cours" qui recevra un flux de messages et qu'il existe une fonction accessible en mode utilisateur qui enverra de tels messages. Ou il se pourrait que la fonction "envoyer" ne fasse que pousser des valeurs sur une pile et la prochaine fois que le noyau aura le contrôle (si un processus se bloque ou qu'une interruption se produit), il affiche des messages de la pile et les envoie aux routines internes en conséquence.
Dans une architecture micro-noyau où le "noyau" réel est très minimal et la plupart des fonctions fournies par un noyau sont déplacées vers des processus "serveur", qui peuvent tous s'exécuter simultanément sur un système multi-CPU, quelque chose comme ça pourrait être plus utile que la vieille approche des appels système. L'interprétation et le routage des "messages" vers le "serveur" du noyau approprié seraient l'une des rares tâches du micro-noyau.
la source
La transmission de messages est un concept de niveau supérieur d'un processus envoyant un message à un autre. Il est implémenté par un appel système (noyau), demandant au noyau de passer le message à l'autre processus. Les appels système demandent au noyau d'exécuter divers services pour le processus. Ils sont implémentés par une interruption logicielle / système, ce qui oblige le processeur à enregistrer un certain état sur la pile afin qu'il puisse revenir plus tard, puis passer en mode noyau et passer au gestionnaire du noyau.
Les interruptions matérielles et logicielles entraînent la sauvegarde de l'unité centrale, le passage en mode noyau et le passage à un gestionnaire défini pour cette interruption. La différence est que les interruptions matérielles sont générées par du matériel externe lorsqu'elles nécessitent une certaine attention, comme un clavier indiquant qu'une touche a été enfoncée. Le gestionnaire de clavier peut alors lire le port d'E / S du clavier pour voir quelle touche a été enfoncée, prendre les mesures appropriées, puis revenir au programme qui a été interrompu.
la source