Systèmes d'exploitation: trois pièces faciles. Partie 2: Abstraction: Processus (traduction)

Introduction aux systèmes d'exploitation


Bonjour, Habr! Je veux attirer votre attention sur une série d'articles-traductions d'une littérature intéressante à mon avis - OSTEP. Cet article décrit assez en profondeur le travail des systèmes d'exploitation de type Unix, à savoir le travail avec les processus, les différents planificateurs, la mémoire et d'autres composants similaires qui composent le système d'exploitation moderne. L'original de tous les matériaux que vous pouvez voir ici . Veuillez noter que la traduction a été effectuée de manière non professionnelle (assez librement), mais j'espère avoir conservé le sens général.

Les travaux de laboratoire sur ce sujet peuvent être trouvés ici:

Autres parties:

Et vous pouvez regarder ma chaîne en télégramme =)


Considérez l'abstraction la plus fondamentale que l'OS fournit aux utilisateurs: un processus. Définir un processus est assez simple - c'est un programme de travail . Le programme lui-même est une chose sans vie située sur le disque - c'est un ensemble d'instructions et peut-être une sorte de données statiques en attente de lancement. C'est le système d'exploitation qui prend ces octets et les lance, convertissant le programme en quelque chose d'utile.
Le plus souvent, les utilisateurs souhaitent exécuter plusieurs programmes à la fois, par exemple, vous pouvez exécuter un navigateur, un jeu, un lecteur multimédia, un éditeur de texte et autres sur votre ordinateur portable. En fait, un système typique peut exécuter des dizaines et des centaines de processus simultanément. Ce fait rend le système plus facile à utiliser, vous n'avez jamais à vous soucier de savoir si le CPU est libre, vous exécutez simplement les programmes.

Cela pose le problème: comment donner l'illusion de plusieurs processeurs? Comment le système d'exploitation crée-t-il l'illusion d'une quantité presque infinie de processeurs, même si vous n'avez qu'un seul processeur physique?

Le système d'exploitation crée cette illusion grâce à la virtualisation du processeur. En démarrant un processus, puis en l'arrêtant, en démarrant un autre processus, etc., le système d'exploitation peut prendre en charge l'illusion qu'il existe de nombreux processeurs virtuels, bien qu'il s'agisse en fait d'un ou de plusieurs processeurs physiques. Cette technique est appelée partage du temps CPU . Cette technique permet aux utilisateurs d'exécuter autant de processus simultanés qu'ils le souhaitent. Le coût d'une telle solution est la performance - car si le CPU est partagé par plusieurs processus, chaque processus sera traité plus lentement.
Pour implémenter la virtualisation du CPU, et surtout pour bien le faire, le système d'exploitation a besoin d'un support de bas niveau et de haut niveau. La prise en charge de bas niveau est appelée mécanismes - ce sont des méthodes ou des protocoles de bas niveau qui implémentent la partie nécessaire de la fonctionnalité. Un exemple d'une telle fonctionnalité est le changement de contexte, qui donne au système d'exploitation la possibilité d'arrêter un programme et d'exécuter un autre programme sur le processeur. Cette division temporelle est implémentée dans tous les systèmes d'exploitation modernes.
Au sommet de ces mécanismes se trouve une logique intégrée au système d'exploitation, sous la forme de «politiques». Une politique est un certain algorithme de prise de décision par un système d'exploitation. Ces politiciens, par exemple, décident en premier lieu du programme à exécuter (à partir de la liste des commandes). Ainsi, par exemple, une politique appelée politique de planification résoudra ce problème et lors du choix d'une solution, elle sera guidée par des données telles que: l'historique de démarrage (quel programme a fonctionné le plus longtemps au cours des dernières minutes), quel type de charge ce processus effectue (quels types de programmes ont été lancés ), des mesures de performances (que le système soit optimisé pour l'interaction interactive ou pour la bande passante), etc.

Abstraction: processus


L'abstraction d'un programme en cours d'exécution effectuée par le système d'exploitation est ce que nous appelons un processus . Comme mentionné précédemment, un processus est simplement un programme de travail, à tout moment instantané. Un programme à l'aide duquel nous pouvons obtenir des informations récapitulatives à partir de diverses ressources du système, et auquel ce programme s'adresse ou qui affecte lors de son exécution.
Pour comprendre les composants du processus, vous devez comprendre l'état du système: que le programme peut lire ou modifier pendant son fonctionnement. À tout moment, vous devez comprendre quels éléments du système sont importants pour l'exécution du programme.
L'un des éléments évidents de l'état du système que le processus comprend est la mémoire . Les instructions sont en mémoire. Les données que le programme lit ou écrit également se trouvent en mémoire. Ainsi, la mémoire que le processus peut adresser (ce que l'on appelle l'espace d'adressage) fait partie du processus.
Les registres font également partie de l'état du système. De nombreuses instructions visent à changer la signification des registres ou à lire leur signification, et ainsi les registres deviennent également une partie importante du processus.
Il convient de noter que l'état de la machine est également formé à partir de certains registres spéciaux. Par exemple, IP - pointeur d'instruction - un pointeur vers l'instruction que le programme exécute actuellement. Il existe également un pointeur de pile et le pointeur de trame associé, qui sont utilisés pour contrôler: les paramètres de fonction, les variables locales et les adresses de retour.
Enfin, les programmes accèdent souvent à la ROM (mémoire morte). Ces informations sur les «E / S» (entrée-sortie) doivent inclure une liste des fichiers actuellement ouverts par le processus.

API de processus


Afin d'améliorer la compréhension du processus, examinons des exemples d'appels système qui devraient être inclus dans n'importe quelle interface du système d'exploitation. Ces API sous une forme ou une autre sont disponibles sur n'importe quel système d'exploitation.

● Créer : le système d'exploitation doit inclure une méthode qui vous permet de créer de nouveaux processus. Lorsque vous entrez une commande dans le terminal ou lancez l'application en double-cliquant sur l'icône, un appel est envoyé à l'OS pour créer un nouveau processus puis lancer le programme spécifié.
● Suppression : une fois qu'il existe une interface pour créer un processus, le système d'exploitation devrait également permettre de forcer la suppression du processus. La plupart des programmes seront naturellement lancés et complétés par eux-mêmes au fur et à mesure de leur exécution. Sinon, l'utilisateur aimerait pouvoir les tuer, et donc l'interface pour arrêter le processus ne sera pas superflue.
â—Ź Attendre : il est parfois utile d'attendre la fin du processus, de sorte que certaines interfaces sont fournies qui permettent d'attendre.
● Contrôle divers (contrôle divers): en plus de tuer et d'attendre le processus, il existe diverses autres méthodes de contrôle. Par exemple, la plupart des systèmes d'exploitation offrent la possibilité de geler un processus (l'arrêter pendant une certaine période) puis de le reprendre (poursuivre l'exécution)
● État : il existe différentes interfaces pour recevoir des informations sur l'état du processus, telles que la durée de son fonctionnement ou son état actuel.

image

Création de processus: détails



L'une des choses intéressantes est de savoir exactement comment les programmes sont transformés en processus. Surtout comment le système d'exploitation récupère et exécute le programme. Comment le processus est-il créé exactement?
Tout d'abord, le système d'exploitation doit charger le code du programme et les données statiques en mémoire (dans l'espace d'adressage du processus). Les programmes sont généralement situés sur le disque ou sur un disque SSD dans un certain format exécutable. Ainsi, le processus de chargement d'un programme et de données statiques en mémoire nécessite que le système d'exploitation lise ces octets à partir du disque et les place quelque part en mémoire.

Dans les premiers systèmes d'exploitation, le processus de démarrage était exécuté avec impatience, ce qui signifie que le code était entièrement chargé en mémoire avant le démarrage du programme. Les systèmes d'exploitation modernes le font paresseusement, c'est-à-dire en ne chargeant des morceaux de code ou des données que lorsque le programme en a besoin pendant son exécution.

Une fois le code et les données statiques chargés dans la mémoire du système d'exploitation, vous devez effectuer quelques opérations supplémentaires avant de démarrer le processus. Une certaine quantité de mémoire doit être allouée à la pile. Les programmes utilisent la pile pour les variables locales, les paramètres de fonction et les adresses de retour . L'OS alloue cette mémoire et la donne au processus. La pile peut également être allouée avec certains arguments, en particulier elle remplit les paramètres de la fonction main (), par exemple, avec le tableau argc et argv.

Le système d'exploitation peut également allouer une certaine quantité de mémoire pour le tas du programme. Le tas est utilisé par les programmes pour les données allouées dynamiquement explicitement demandées . Les programmes demandent cet espace en appelant la fonction malloc () et effacent explicitement en appelant la fonction free () . Un tas est nécessaire pour les structures de données telles que les feuilles liées, les tables de hachage, les arbres et autres. Dans un premier temps, une petite quantité de mémoire est allouée sous le tas, mais au fil du temps, pendant le fonctionnement du programme, le tas peut demander plus de mémoire via l'appel de la bibliothèque malloc (). Le système d'exploitation est impliqué dans le processus d'allocation de mémoire supplémentaire afin de répondre à ces défis.

Le système d'exploitation effectuera également des tâches d'initialisation, en particulier celles liées aux E / S. Par exemple, sur les systèmes UNIX, chaque processus a 3 descripteurs de fichiers ouverts par défaut, pour les flux d'entrée, de sortie et d'erreur standard. Ces descripteurs permettent aux programmes de lire les entrées du terminal, ainsi que d'afficher des informations à l'écran.

Ainsi, en chargeant le code et les données statiques dans la mémoire, en créant et en initialisant la pile, et en effectuant également d'autres travaux liés à l'exécution des tâches d'E / S, l'OS prépare le site pour le processus. En fin de compte, la dernière tâche reste: exécuter le programme via son point d'entrée, appelé la fonction main (). En passant à la fonction main (), le système d'exploitation transfère le contrôle du processeur au processus nouvellement créé, de sorte que le programme commence à s'exécuter.

Statut du processus


Maintenant que nous comprenons ce qu'est un processus et comment il est créé, nous énumérons les états du processus dans lequel il peut être. Dans sa forme la plus simple, un processus peut être dans l'un de ces états:
● En cours d'exécution . Dans l'état en cours d'exécution, le processus s'exécute sur le processeur. Cela signifie que les instructions sont en cours d'exécution.
● Prêt . Dans un état prêt, le processus est prêt à démarrer, mais pour une raison quelconque, le système d'exploitation ne l'exécute pas à un moment donné.
● Bloqué . Dans un état verrouillé, le processus effectue certaines opérations qui l'empêchent d'être prêt à être exécuté jusqu'à ce qu'un événement se produise. Un exemple courant est lorsqu'un processus initie une opération d'E / S, il devient bloqué et donc un autre processus peut utiliser le processeur.

image

Vous pouvez imaginer ces états sous la forme d'un graphique. Comme nous pouvons le voir sur l'image, l'état du processus peut changer entre RUNNING et READY à la discrétion de l'OS. Lorsque l'état d'un processus passe de READY à RUNNING, cela signifie que le processus a été planifié. Dans la direction opposée - retiré de la mise en page. Au moment où le processus devient BLOQUÉ, par exemple, j'initie une opération d'E / S, le système d'exploitation le maintiendra dans cet état jusqu'à ce qu'un événement se produise, par exemple, la fin d'E / S. à ce moment, transition vers l'état READY et éventuellement instantanément vers l'état RUNNING, si le système d'exploitation en décide ainsi.
Voyons un exemple de la façon dont deux processus passent par ces états. Tout d'abord, imaginez que les deux processus sont en cours d'exécution et que chacun utilise uniquement le CPU. Dans ce cas, leurs états se présenteront comme suit.

image

Dans l'exemple suivant, après un certain temps, le premier processus demande un E / S et entre dans l'état BLOQUÉ, donnant à un autre processus la possibilité de démarrer (FIG. 1.4). Le système d'exploitation voit que le processus 0 n'utilise pas la CPU et démarre le processus 1. Pendant l'exécution du processus 1 - IO se termine et l'état du processus 0 passe à READY. Enfin, le processus 1 est terminé et, à sa fin, le processus 0 démarre, s'exécute et termine son travail.

image

Structure des données


Le système d'exploitation lui-même est un programme et, comme tout autre programme, il possède des structures de données clés qui suivent une variété d'informations pertinentes. Pour suivre l'état de chaque processus dans le système d'exploitation, une certaine liste de processus pour tous les processus à l'état PRET et quelques informations supplémentaires pour le suivi des processus en cours d'exécution seront prises en charge. De plus, le système d'exploitation doit suivre et bloquer les processus. Après avoir terminé l'IO, le système d'exploitation doit réveiller le processus souhaité et le mettre en état de préparation au lancement.

Ainsi, par exemple, le système d'exploitation doit enregistrer l'état des registres du processeur. Au moment où le processus est arrêté, l'état des registres est sauvegardé dans l'espace d'adressage du processus, et au moment de sa poursuite, il est possible de restaurer les valeurs des registres et ainsi de continuer le processus.

En plus des états prêts, bloqués et en cours d'exécution, il existe d'autres états. Parfois, au moment de la création, un processus peut avoir un état INIT. Enfin, un processus peut être placé dans l'état FINAL lorsqu'il est déjà terminé, mais les informations le concernant n'ont pas encore été effacées. Sur les systèmes UNIX, cet état est appelé processus zombie . Cet état est utile dans les cas où le processus parent veut connaître le code retour du descendant, par exemple, généralement 0 indique une exécution réussie et 1 indique une erreur, mais les programmeurs peuvent créer des codes de sortie supplémentaires, signalant divers problèmes. Une fois terminé, le processus parent effectue le dernier appel système, par exemple, wait (), pour attendre la fin du processus descendant et signaler au système d'exploitation que toutes les données associées au processus terminé peuvent être effacées.



Points clés de la conférence:


● Processus - l'abstraction principale d'un programme en cours d'exécution dans le système d'exploitation. À tout moment, un processus peut être décrit par son état: le contenu de la mémoire dans son espace d'adressage, le contenu des registres du processeur, y compris le pointeur d'instruction et le pointeur de pile, également avec des informations sur les E / S, par exemple, les fichiers ouverts qui sont lus ou écrits.
● L' API de processus se compose d'appels que les programmes peuvent effectuer concernant les processus. Il s'agit généralement d'appels à créer, à supprimer ou à d'autres.
● Un processus se trouve dans l'un des nombreux états, notamment en cours d'exécution, prêt, bloqué. Divers événements, tels que la planification, l'exclusion de la planification ou les attentes, peuvent traduire l'état d'un processus de l'un à l'autre.
● La liste des processus contient des informations sur tous les processus du système. Chaque entrée est appelée un bloc de contrôle de processus, qui est en réalité une structure qui contient toutes les informations nécessaires sur un processus particulier.

Source: https://habr.com/ru/post/fr446866/


All Articles