Processus et programmes

07 Sep 2022 07 Sep 2022 2475 vues ESSADDOUKI Mostafa 10 min de lecture

Processus et Programmes

Définition : Programme vs Processus

Un programme est une entité passive qui n'effectue aucune action par elle-même ; il doit être exécuté pour que les actions qu'il demande aient lieu.

Un processus est l'exécution d'un programme. Il exécute réellement les actions spécifiées dans un programme.

Principe fondamental

Un système d'exploitation partage l'unité centrale (processeur) entre les processus. C'est ainsi qu'il fait exécuter les programmes utilisateur.

Un programme devient un processus lorsqu'un fichier exécutable est chargé en mémoire.

Qu'est-ce qu'un processus ?

De manière informelle, comme mentionné précédemment, un processus est un programme en cours d'exécution. L'état de l'activité en cours d'un processus est représenté par la valeur du compteur de programme et le contenu des registres du processeur.

Structure mémoire d'un processus

La disposition de la mémoire d'un processus est généralement divisée en plusieurs sections et est illustrée dans la figure ci-dessous.

Organisation de la mémoire d'un processus

Figure : Structure mémoire d'un processus avec ses différentes sections

Les quatre sections principales

 Code

Section texte (Text)

Contient le code exécutable du programme (instructions machine).

Caractéristique : Sa taille est fixe pendant l'exécution.

Cette section est souvent en lecture seule pour empêcher les modifications accidentelles.

 Données globales

Section de données (Data)

Contient les variables globales et statiques du programme.

Caractéristique : Sa taille est fixe pendant l'exécution.

On distingue parfois les données initialisées et non initialisées (section BSS).

 Allocation dynamique

Section tas (Heap)

Mémoire allouée dynamiquement pendant l'exécution du programme.

Caractéristique : Sa taille peut varier (augmenter/diminuer).

Gérée par les fonctions comme malloc(), calloc(), free() en C, ou new/delete en C++.

 Appels de fonctions

Section pile (Stack)

Stockage temporaire de données lors de l'appel de fonctions.

Contient : paramètres de fonction, adresses de retour, variables locales.

Caractéristique : Sa taille peut varier dynamiquement.

Fonctionne en mode LIFO (Last In, First Out).

Évolution dynamique de la mémoire

Notez que les tailles des sections de texte et de données sont fixes, car elles ne changent pas pendant l'exécution du programme. En revanche, les sections pile et tas peuvent diminuer et augmenter dynamiquement pendant l'exécution.

Fonctionnement de la pile :

Chaque fois qu'une fonction est appelée, un enregistrement d'activation (stack frame) contenant les paramètres de la fonction, les variables locales et l'adresse de retour est poussé sur la pile. Lorsque le contrôle est rendu par la fonction, l'enregistrement d'activation est retiré de la pile.

Fonctionnement du tas :

Le tas s'agrandit au fur et à mesure que la mémoire est allouée dynamiquement, et se rétrécit lorsque la mémoire est rendue au système.

Attention : Chevauchement pile/tas

Bien que les sections pile et tas croissent l'une vers l'autre, le système d'exploitation doit s'assurer qu'elles ne se chevauchent pas. Un chevauchement provoquerait des corruptions de données et des plantages.

Distinction fondamentale entre programme et processus

CaractéristiqueProgrammeProcessus
NatureEntité passiveEntité active
LocalisationStocké sur disque (fichier exécutable)Chargé en mémoire
Durée de viePermanent (tant que le fichier existe)Limitée (de la création à la terminaison)
ÉtatStatique (liste d'instructions)Dynamique (compteur programme, registres, etc.)
RessourcesAucune (simple fichier)CPU, mémoire, fichiers ouverts, etc.
Plusieurs instancesUn seul fichierPlusieurs processus peuvent exécuter le même programme
Exemple concret

Le navigateur Firefox est un programme stocké sur le disque (par exemple, /usr/bin/firefox sous Linux ou firefox.exe sous Windows).

Lorsque vous lancez Firefox, le système d'exploitation charge ce programme en mémoire et crée un processus. Si vous ouvrez trois fenêtres Firefox distinctes, vous aurez trois processus distincts exécutant le même programme.

Relations entre processus et programmes

Un programme est constitué d'un ensemble de fonctions et de procédures. Lors de son exécution, le contrôle circule entre les fonctions et les procédures selon la logique du programme. L'exécution d'une fonction ou d'une procédure est-elle un processus ? Ce doute conduit à la question évidente : quelle est la relation entre les processus et les programmes ?

Point de vue du système d'exploitation

Le système d'exploitation ne sait rien de la nature d'un programme, y compris les fonctions et les procédures de son code. Il ne sait que ce qu'on lui dit par le biais des appels système. Le reste est sous le contrôle du programme.

Ainsi, les fonctions d'un programme peuvent être des processus distincts ou constituer la partie code d'un seul processus.

Deux approches possibles

Modèle monolithique

Toutes les fonctions du programme s'exécutent dans un seul processus.

Exemple : Un programme C classique avec main() et des fonctions. Tout s'exécute dans le même processus.

int main() {
    fonctionA();
    fonctionB();
    return 0;
}

Les fonctions sont des parties du code, pas des processus distincts.

Modèle multiprocessus

Différentes parties du programme s'exécutent dans des processus distincts.

Exemple : Un serveur web peut créer un processus enfant pour chaque connexion client.

// Création d'un nouveau processus
pid_t pid = fork();
if (pid == 0) {
    // Code exécuté dans le processus enfant
    traiter_connexion();
}

Exemple particulier : La Machine Virtuelle Java (JVM)

 Cas d'étude

Java Virtual Machine

Notez qu'un processus peut lui-même être un environnement d'exécution pour un autre code. L'environnement de programmation Java en est un bon exemple.

Dans la plupart des cas, un programme Java exécutable est exécuté dans la machine virtuelle Java (JVM). La JVM s'exécute comme un processus qui interprète le code Java chargé et prend des mesures (via des instructions machine natives) au nom de ce code.

Organisation :

  • Niveau 1 : La JVM est un processus du système d'exploitation.
  • Niveau 2 : Le programme Java s'exécute dans ce processus.
  • Niveau 3 : La JVM peut créer des threads Java qui sont des unités d'exécution légères au sein du même processus.

Ainsi, le programme Java n'est pas directement un processus au sens du système d'exploitation, mais il s'exécute à l'intérieur d'un processus (la JVM).

Plusieurs processus pour un même programme

Bien que deux processus puissent être associés au même programme, ils sont néanmoins considérés comme deux séquences d'exécution distinctes. Chacun d'eux est un processus distinct.

ÉlémentProcessus 1Processus 2Relation
Section texteCode du programmeCode du programmeÉquivalente (souvent partagée en mémoire)
Section donnéesVariables globales du processus 1Variables globales du processus 2Différentes (chaque processus a ses propres données)
Section tasAllocations dynamiques du processus 1Allocations dynamiques du processus 2Différentes
Section pilePile d'appels du processus 1Pile d'appels du processus 2Différente
Registres CPUÉtat d'exécution du processus 1État d'exécution du processus 2Différent
Partage de la section texte

Pour économiser la mémoire, le système d'exploitation partage souvent la section texte (le code) entre plusieurs processus exécutant le même programme. Ainsi, le code n'est chargé qu'une seule fois en mémoire physique, mais chaque processus a ses propres données, pile et tas.

 Exercice pratique

Analyse de la mémoire d'un processus

 Niveau : Débutant

Considérons le programme C suivant :

#include <stdio.h>
#include <stdlib.h>

int variable_globale = 10;
int variable_non_initialisee;

void fonction(int a) {
    int variable_locale = a * 2;
    int* ptr = (int*)malloc(sizeof(int));
    *ptr = variable_locale;
    printf("Valeur : %d\n", *ptr);
    free(ptr);
}

int main() {
    int x = 5;
    fonction(x);
    return 0;
}

Questions :

  1. Quelles sont les différentes sections de mémoire utilisées par ce programme ?
  2. Où se trouve la variable variable_globale ?
  3. Où se trouve la variable variable_non_initialisee ?
  4. Où se trouve la variable x ?
  5. Où se trouve la variable variable_locale ?
  6. Où est allouée la mémoire par malloc ?
  7. Que contient la section texte ?
Points clés à retenir
  • Un programme est une entité passive (fichier sur disque).
  • Un processus est une entité active (programme en cours d'exécution en mémoire).
  • La mémoire d'un processus est divisée en quatre sections principales : texte, données, tas, pile.
  • Les sections texte et données ont une taille fixe.
  • Les sections tas et pile ont une taille dynamique (peuvent croître/rétrécir).
  • La pile stocke les variables locales, paramètres de fonction et adresses de retour (LIFO).
  • Le tas stocke la mémoire allouée dynamiquement (malloc, new).
  • Plusieurs processus peuvent exécuter le même programme (section texte souvent partagée).
  • Le système d'exploitation ne connaît pas la structure interne d'un programme (fonctions, procédures).
  • Un processus peut être un environnement d'exécution pour d'autres programmes (ex: JVM).

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.