II. Mécanismes de base d’exécution des programmes

II.1. Structure matérielle d'une machine de Von Neumann

Cette architecture est appelée ainsi en référence au mathématicien John Von Neumann qui a élaboré la première description d’un ordinateur dont le programme est stocké dans sa mémoire. L’architecture dite architecture de Von Neumann est un modèle pour un ordinateur qui utilise une structure de stockage unique pour conserver à la fois les instructions et les données demandées ou produites par le calcul. De telles machines sont aussi connues sous le nom d’ordinateur à programme enregistré. La séparation entre le stockage et le processeur est implicite dans ce modèle.

Figure 3. Schématisation de l'architecture de Von Neumann.

L’architecture de Von Neumann décompose l’ordinateur en 4 parties distinctes :

1.      L’unité arithmétique et logique (UAL) ou unité de traitement : son rôle est d’effectuer les opérations de base ;

2.      L’unité de contrôle, chargée du « séquençage » des opérations ;

3.      la mémoire qui contient à la fois les données et le programme qui indiquera à l’unité de contrôle quels sont les calculs à faire sur ces données. La mémoire se divise entre mémoire volatile (programmes et données en cours de fonctionnement) et mémoire permanente (programmes et données de base de la machine) ;

4.      les dispositifs d’entrée-sortie, qui permettent de communiquer avec le monde extérieur.

II.2. Cheminement d'un programme dans un système

Le passage d’un programme de la forme externe à la forme interne se fait en plusieurs étapes. Un programme est généralement écrit dans un langage évolué (Pascal, C, VB, Java, etc.). Pour faire exécuter un programme par  une machine, on passe généralement par les étapes suivantes:

Figure 4. Cheminement d’un programme dans un système

II.2.1. Editeur de texte (Text Editor)

C’est un logiciel interactif qui permet de saisir du texte à partir d’un clavier, et de l’enregistrer dans un fichier.

Exemple : Bloc-Notes, vi, vim, emacs, …etc.

II.2.2. Compilateur (Compiler)

Un compilateur est un programme qui traduit des programmes écrits dans des langages évolués (Pascal, C, Ada, Java, …etc.) en  programmes binaires ou en langage machine, appelés aussi objets.

Le  langage machine est un ensemble de codes binaires directement décodables et exécutables par la machine.

II.2.3. Editeur de liens (Linker)

Un programme source peut être constitué :

1.      des instructions,

2.      des données localement définies,

3.      des données externes, et

4.      des procédures ou sous-programmes externes (bibliothèques de fonctions).

Avant d’exécuter le programme objet, il est nécessaire de rassembler les parties non locales et les procédures externes avec le programme.

L’éditeur de liens est donc un logiciel permettant de combiner plusieurs programmes objets en un seul programme.

Figure 5. Principe d’édition de liens

Pour pouvoir développer de gros programmes, on structure ceux-ci en modules que l’on traduit indépendamment. Ainsi, un programme peut être constitué de plusieurs fichiers dont l’un est le programme principal. Ce dernier fait appel aux  sous-programmes, ce qui donne lieu à des références extérieures.

Lors de la compilation, le compilateur ne peut pas remplacer les références extérieures par les adresses correspondantes puisqu’il ne les connaît pas. Le programme objet généré contient donc le code machine des instructions et la liste des références extérieures, ainsi que la liste des adresses potentiellement référençables depuis l’extérieur du module. Après la compilation, chaque sous-programme commence à l’adresse logique 0.

L’éditeur de liens ordonne les sous-programmes et le programme appelant, modifie les adresses de chacun d’eux et produit un programme final dont l’origine est à l’adresse 0.

II.2.4. Le chargeur (Loader)

Après l’édition de liens, le programme exécutable doit se trouver en mémoire centrale pour être exécuté. Le chargeur est un programme qui installe ou charge un exécutable en mémoire centrale à partir d’une adresse déterminée par le système d’exploitation.  

Figure 6. Chargement d'un programme exécutable.

II.3. Concepts de processus et multiprogrammation

II.3.1. Définition

Un processus (Process en anglais) est un  programme en  cours d’exécution. Tout processus possède des caractéristiques propres (Ex. un numéro d’identification), des ressources qu’il utilise (comme des fichiers ouverts) et se trouve à tout moment dans un état (en exécution ou en attente …).

Un processus est constitué d’ :

        Un code exécutable du programme en exécution.

        Un contexte qui est une image décrivant l’environnement du processus.

II.3.2. Contexte d’un processus

Le contexte d’un processus est l’ensemble des données qui permettent de reprendre l’exécution d’un processus qui a été interrompu. Il est formé des contenus de :

        compteur ordinal (CO),

        Mot d’état (Program Status Word PSW),

        registres généraux,

        pile.

Le CO et le PSW représentent le  petit contexte, et les registres généraux et la pile représentent le grand contexte.

II.3.3. Image mémoire d’un processus

L’espace mémoire alloué à un processus, dit  image mémoire (Memory Map) du processus, est divisé en un ensemble de parties :

1.      Code (Text) : qui correspond au code des instructions du programme à exécuter. L’accès à cette zone se fait en lecture seulement (Read-Only).

2.      Données (Data) : qui contient l’ensemble des constantes et variables déclarées.

3.      Pile (Stack) : qui permet de stocker :

         les valeurs des registres,

         les variables locales et paramètres de fonctions,

         les adresses de retour des fonctions.

4.      Tas (Heap) : une zone à partir de laquelle l’espace peut être alloué dynamiquement en cours d’exécution (Runtime), en utilisant par exemple les fonctions new et malloc.

II.3.4. Descripteur de Processus (PCB)

Chaque processus est représenté dans le système d’exploitation par un bloc de contrôle de processus (Process Control Bloc, PCB). Le contenu du PCB varie d’un système à un autre suivant sa complexité. Il peut contenir :

1.      Identité du processus : chaque processus possède deux noms pour son identification :

        Un nom externe sous forme de chaîne de caractères fourni par l’usager (c’est le nom du fichier exécutable).

        Un nom interne sous forme d’un entier fourni par le système. Toute référence au processus à l’intérieur du système se fait par le nom interne pour des raisons de facilité de manipulation.

2.      Etat du processus : l’état peut être nouveau, prêt, en exécution, en attente, arrêté, …etc.

3.      Contexte du processus : compteur ordinal, mot d’état, registres ;

4.      Informations sur le scheduling de l’unité centrale : ces informations comprennent la priorité du processus, des pointeurs sur les files d’attente de scheduling, …etc.

5.      Informations sur la gestion mémoire : ces informations peuvent inclure les valeurs des registres base et limite, les tables de pages ou les tables de segments.

6.      Information sur l’état des E/S : l’information englobe la liste de périphériques d’E/S alloués à ce processus, une liste de fichiers ouverts, etc.

7.      Informations de Comptabilisation : ces informations concernent l’utilisation des ressources par le processus pour facturation du travail effectué par la machine (chaque chose a un coût).

Figure 7. Bloc de contrôle de processus (PCB).

Le système d’exploitation maintient dans une table appelée «table des processus» les informations sur tous les processus créés (une  entrée par processus : Bloc de Contrôle de Processus PCB). Cette table permet au SE de localiser et gérer tous les processus. 

Donc, un processus en cours d’exécution peut être schématisé comme suit :

Figure 8. Schéma général d’un processus en cours exécution. 

II.3.5. Etat d’un processus

Un processus prend un certain nombre d’états durant son exécution, déterminant sa situation dans le système vis-à-vis de ses  ressources. Les trois principaux états d’un processus sont :

  • Prêt (Ready) : le processus attend la libération du processeur pour s’exécuter.
  • Actif (Running) : le processus est en exécution.
  • Bloqué (Waiting) : le processus attend une ressource physique ou logique autre que le processeur pour s’exécuter (mémoire, fin d’E/S, …etc.).

Figure 9. Diagramme de transition des états d’un processus.

II.3.6. Multiprogrammation

Dans un système multiprogrammé, le processeur assure l’exécution de plusieurs processus en parallèle (pseudo-parallélisme).

Le passage dans l’exécution d’un processus à un autre nécessite une opération de sauvegarde du contexte du processus arrêté, et le chargement de celui du nouveau processus. Ceci s’appelle la commutation du contexte (Context Switch).

II.3.7. Mécanisme de commutation de contexte

La commutation de contexte consiste à changer les contenus des registres du processeur central par les informations de contexte du nouveau processus à exécuter.

Figure 10. Mécanisme de commutation de contexte.

La commutation du contexte se fait en deux phases:

        La  première phase consiste à commuter le petit contexte (CO, PSW) par une instruction indivisible.

        La deuxième phase consiste quant à elle à commuter le grand contexte par celui du nouveau processus.

Figure 11. Les phases d’une commutation  de contexte.

II.4. Les systèmes d'interruption

II.4.1. Définition et organigramme général d'une interruption.

II.4.1.1. Définition

Une  interruption est une réponse à un événement qui interrompt l’exécution du programme en cours à un  point observable (interruptible) du processeur central. Physiquement, l’interruption se traduit par un signal envoyé au processeur. Elle permet de forcer le processeur à  suspendre l’exécution du programme en cours, et à déclencher l’exécution d’un programme prédéfini, spécifique à l’événement, appelé  routine d’interruption (Rit).

II.4.1.2. Organigramme général

Figure 12. Traitement d'une interruption.

Le programme repris après le traitement de l’interruption peut être le programme interrompu ou autre.

II.4.2. Mécanismes de gestion des interruptions

Lorsqu'une interruption survient, le processeur achève l'exécution de l'instruction en cours pour les interruptions externes, puis il se produit :

1.      Sauvegarde du contexte dans une pile :

-          adresse de la prochaine instruction à exécuter  dans le programme interrompu,

-          contenu des registres qui seront modifiés par le programme d'interruption,

-          contenu du mot d'état (registre de drapeaux) rassemblant les indicateurs

(Tout cela forme le contexte sauvegardé)

2.      Chargement du contexte du programme d'interruption (contexte  actif) et passage en mode système (ou superviseur)

3.      Exécution du programme d'interruption

4.      Retour au programme interrompu en restaurant le contexte (commande Assembleur IRET) et en repassant en mode utilisateur.

II.4.3. Systèmes d'interruption sur les PCs. 

Les interruptions ne  jouent pas seulement un rôle important dans le domaine logiciel, mais aussi pour l'exploitation de l'électronique.

On distingue donc :

  • interruptions internes : protection du système et des processus, appelées par une instruction à l'intérieur d'un programme (overflow, erreur d'adressage, code opération inexistant, problème de parité…) (hardware internes)
  • interruptions logiques : permet à un processus utilisateur de faire un appel au système (software),
  • interruptions matérielles déclenchées par une unité électronique (lecteur, clavier, canal, contrôleur de périphérique, panne de courant,....) ou par l'horloge (hardware externes).