Aller au contenu

Gestion des processus

Programme

Notions Compétences Remarques
Gestion des processus et des ressources par un système d’exploitation. Décrire la création d’un processus, l’ordonnancement de plusieurs processus par le système.
Mettre en évidence le risque de l’interblocage (deadlock).
À l’aide d’outils standard, il s’agit d’observer les processus actifs ou en attente sur une machine.
Une présentation débranchée de l’interblocage peut être proposée.
Terminal Linux

Les processus

Le processeur appelé aussi CPU ( Central Processing Unit ) est l'unité matérielle en charge de l'exécution au sein d'un ordinateur.
Il exécute des instructions de bas niveau. Ces instructions proviennent en général de programmes lancés sur la machine.

Écriture du programme dans un fichier source :

  • Il peut y avoir un ou plusieurs fichiers sources
  • Les fichiers source sont Ă©crits dans un langage haut niveau
  • Les fichiers sont des donnĂ©es stockĂ©es sur disque

Exécution d'un programme

  • soit le programme est compilĂ© : on obtient un fichier exĂ©cutable et on le lance
    $ gcc -o prog prog.c # compilation d'un programme en C
    $ chmod u+x prog # autorisation de l'exécution
    $ ./prog # execution du programme
    
  • soit le programme est interprĂ©té : c'est l'interprĂ©teur qui doit ĂŞtre lancĂ©
    $ python prog.py
    

Au sein de la machine l’exécution d’un programme créé un processus. Un ordinateur équipé d'un OS multitâches comme Linux, MacOS ou Windows est capable d'exécuter plusieurs processus de façon quasi simultanée. S'il y a plusieurs processeurs, l'exécution des processus est distribuée sur ces processeurs.

Par exemple, lorsque nous ouvrons un navigateur Internet comme Firefox, nous pouvons dire qu’un processus, responsable de l’exécution de Firefox a été lancé et est en cours d’exécution jusqu’à ce que nous fermions le navigateur. Si nous ouvrons la même application deux fois ou si vous et un ami l'ouvrez sur le même système, deux processus distincts seront lancés.

En résumé : un processus est un "programme" en cours d’exécution.

Attention

Il y a une différence entre programme et processus : le même programme peut être lancé plusieurs fois et donner naissances à des processus distincts.

Le système gère les processus:

  • il sait tout et il peut tout
  • il sait combien de processus sont lancĂ©s
  • il sait ce qu'ils exĂ©cutent
  • il sait combien de ressources ils utilisent
  • il peut agir sur leur Ă©tat de fonctionnement
  • il dĂ©cide si et quand ils s'exĂ©cutent

On rencontre 2 types de processus

Les processus « système » :

  • Pilotes d’entrĂ©es/sorties, processus de sauvegarde, ...
  • Usuellement lancĂ©s au dĂ©marrage

Les processus « utilisateur » :

  • Applications : Firefox, Libreoffice, ...
  • ExĂ©cution de commandes : ls, cd, grep, …
  • LancĂ©s par une action explicite de l’utilisateur
Visualisation des processus avec une interface graphique (GUI: Graphical User Interface)

Sur chaque OS, il y a des utilitaires en mode graphique (GUI) ou en mode console ( CLI ) pour observer les processus en cours d’exécution.

  • Sous Windows 10, il y a le bien connu gestionnaire de tâches ( raccourci : CRTL+MAJ+ECHAP )

  • Sous Linux Mint, une distribution Linux, il y a par exemple Moniteur Système.

Les commandes de la console sous Linux (CLI= Command Line Interface)
top

La commande top permet d'afficher la liste des processus de manière dynamique ( la liste est rafraîchit toutes les 3 secondes) (Pensez à la commande man top pour plus d'informations).

Lorsque la commande top fonctionne, les lettres suivantes permettent de changer son fonctionnement :

  • h : affiche l'aide
  • q : quitte la commande top
  • M : tri les processus par utilisation de la mĂ©moire (du plus gourmand au plus sobre)
  • P : tri les processus par utilisation du processeur (du plus gourmand au plus sobre)
  • s : permet de changer la durĂ©e de rafraĂ®chissement de top
  • k : permet d'envoyer un signal Ă  un processus

Pour en savoir plus : https://debian-facile.org/doc:systeme:top

Les différentes colonnes nous renseignent sur le nom du processus, son propriétaire , etc. Le système d'exploitation alloue des ressources nécessaires aux processus : mémoires et temps processeur notamment.

Au démarrage de l'ordinateur, le système charge le noyau Linux qui se charge de l'initialisation du matériel et de la détection des périphériques. Ceci fait, il démarre ensuite le processus init qui a comme particularité d'être le premier processus et de toujours utiliser le PID 1.

Le processus init démarre ensuite des processus noyaux et les premiers processus systèmes.
Chaque processus a ainsi un père (sauf init), et peut être à son tour le père d'autres processus, etc...

Un processus est toujours identifié par un numéro unique que l'on appelle le PID (Process IDentifiant).
Un processus dispose d'un processus père que l'on appelle le PPID (Parent PID).
La particularité d'un processus est de s'exécuter avec les droits accordés à l'utilisateur qui a lancé la commande. Ceci participe fortement à la sécurité du système.

pstree

La commande pstree permet de visualiser l'arbre des processus.
L'option -p permet de visualiser les PID de chaque processus.
La création d’un nouveau processus à partir d'un programme sous Linux est réalisée par un appel système avec la fonction fork().
Tous les processus sauf le tout premier processus sont créés par un appel à fork.
Le processus qui appelle le fork est appelé processus père. Le nouveau processus est appelé processus fils. Chaque processus possédera en mémoire les instructions à exécuter et ses propres données.
Par exemple, si on ouvre deux consoles sous linux, deux processus seront créés ; les deux processus sont exactement identiques et exécutent le même programme sur deux copies distinctes des données.
Les espaces de données sont complètement séparés: la modification d'une variable dans l'un est invisible dans l'autre.
À l’issue d’un fork() les deux processus s’exécutent simultanément.



ps

Sous un système UNIX comme Linux on utilise la commande ps.
Pour rappel, en tapant man ps dans la console vous pouvez voir les très nombreuses options de cette commande.

Exemple

  • ouvrez un terminal et exĂ©cutez la commande ps -a
  • ouvrez un autre terminal et exĂ©cutez python3 dans la console
  • revenez sur le premier terminal et relancez la commande ps -a

La première commande ps -a permet de voir qu’il y a un processus de PID 9984 créé en lançant la commande ps -a !
Après avoir exécuter la commande python3 puis en relançant la commande ps -a on peut voir que son PID est 10055 et que celui de python est 10054.

Les différents champs

  • USER indique le nom de l'utilisateur du processus
  • PID est l'identificateur unique du processus qui Ă  Ă©tĂ© dĂ©finit par le système.
  • %CPU affiche l'utilisation du processeur en pourcentage
  • %MEM affiche l'utilisation de la mĂ©moire vive en pourcentage
  • VSZ donne l'utilisation des bibliothèques partagĂ©es et la mĂ©moire utilisĂ© pour son fonctionnement
  • RSS donne l'utilisation de la mĂ©moire physique utilisĂ©e en kilobytes par le processus (hors swap)
  • TTY indique le numĂ©ro de port du terminal (le "?" indique que la commande n'est pas associĂ©e Ă  un terminal)
  • STAT affiche l'Ă©tat actuel du processus
  • START indique l'heure a laquelle le processus a commencĂ©
  • TIME affiche le temps processeur utilisĂ© par ce processus
  • COMMAND affiche le nom de la commande qui utilise ce PID

Quelques options de la commande ps

  • L'option -x permet de visualiser tout les processus actifs de l'utilisateur courant
  • L'option -ax permet de visualiser tous les processus de la machine de tous les utilisateurs
  • L'option -aux permet d’afficher tous les utilisateurs associĂ©s Ă  chaque processus
  • L'option -u nom_utilisateur affiche chaque processus associĂ©s Ă  utilisateur
  • L'option -p PID affiche les informations sur un processus
  • L'option -t affiche tout les processus liĂ©es a un terminal
Etat d'un processus

Un processus peut avoir plusieurs états. Pour exécuter un processus sur le processeur, le processus doit être prêt.

En effet, un processus peut ne pas être en état de s'exécuter puisque en attente par exemple :

  • d'une entrĂ©e clavier
  • de rĂ©ception de message rĂ©seau
  • en attente d'un autre processus

Selon les systèmes, le nombre et le nom des états peut varier. Mais la base commune est :

  • Élu: en train de s’exĂ©cuter sur un processeur
  • Éligible ou PrĂŞt : en attente d’un processeur pour s’exĂ©cuter
  • BloquĂ©: en attente d’un Ă©vĂ©nement ; ne peut donc pas s’exĂ©cuter pour l’instant

On peut voir l’état d’un processus dans le champ STAT après une commande ps. Ci-dessous quelques exemples d’attributs possibles :

  • D en sommeil non interruptible (normalement entrĂ©es et sorties) ;
  • I fil inactif du noyau ;
  • R s’exĂ©cutant ou pouvant s’exĂ©cuter (dans la file d’exĂ©cution) ;
  • S en sommeil interruptible (en attente d’un Ă©vĂ©nement pour finir) ;
  • T arrĂŞtĂ© par le signal de contrĂ´le de la tâche ;
  • Z processus zombie , terminĂ© mais pas dĂ©truit par son parent...

Envoi d'un signal Ă  un processus

Un signal est une interruption logicielle envoyée par un processus à un autre processus.
Il peut signaler une anomalie ou solliciter l'arrêt définitif ou temporaire d'un processus. Un utilisateur ne peut envoyer de signal qu'à des processus qui lui appartiennent.

La syntaxe est la suivante :

kill -SIG pid : Envoie au processus, dont le numéro identificateur est pid, le signal SIG. La liste des signaux possibles peut être obtenue avec l'option -l : kill -l

Exemple de signaux

1 - HUP qui permet de recharger un processus

9 - KILL qui permet de tuer un processus

15 - TERM qui permet de terminer proprement un processus

Si un processus ne répond plus on peut prendre l’initiative de le stopper avec un signal approprié en identifiant son PID au préalable.

Ordonnancement des processus ( Scheduling )
  • Il est possible de charger plusieurs processus en mĂ©moire, il peut donc y avoir plusieurs processus prĂŞts
  • Le choix du processus Ă  exĂ©cuter parmi tous ceux qui sont prĂŞts s’appellent l’ordonnancement.

Au début de l'informatique, un seul processus était chargé en mémoire et pouvait s'exécuter.
Le temps de récupérer les résultats et de préparer le prochain processus, le CPU était inutilisé…

L'OS doit permettre Ă  toutes les applications et tous les utilisateurs de travailler en mĂŞme temps ; dans la pratique, il doit donner l'impression Ă  chacun qu'il est le seul Ă  utiliser l'ordinateur et ses ressources.
Cette gestion des ressources est réalisée par un module dédié du noyau : l'ordonnanceur. Comme une ressource ne peut pas être réellement partagée, c'est son temps d'utilisation qui va l'être : l'ordonnanceur va allouer les ressources en divisant le temps d'utilisation en intervalles très courts.

L'ordonnanceur cherche :

  • Ă  minimiser le temps de traitement du processus d'un utilisateur
  • Ă  garantir l'Ă©galitĂ© entre les diffĂ©rents utilisateurs
  • d'optimiser l'utilisation des ressources
  • d'Ă©viter les blocages

Algorithmes d'ordonnancement fréquemment utilisés :

  • L'algorithme FIFO ( First in, First out ) : Premier entrĂ© / Premier sorti
    Les processus sont dans une file d’attente. Le premier arrivé est admis immédiatement et s'exécute tant qu'il n'est pas bloqué ou terminé. Lorsqu'il se bloque, le processus suivant commence à s'exécuter et le processus bloqué va se mettre au bout de la file d'attente.
    Avantages : l'algorithme est simple, l'ordonnancement est Ă©quitable.
    Inconvénient : Le processus qui utilise davantage de temps est favorisé par rapport à ceux qui font beaucoup d'appels aux entrées/sorties.
  • L'algorithme du "plus court d'abord" (SJF - Shorted Job First) :
    Sera Ă©lu, le processus dont on suppose que le traitement sera le plus court. C'est ce qui se passe quand Ă  la caisse d'une grande surface des clients sympathiques laissent passer devant quelqu'un qui n'a qu'un article.
    Inconvénient : les processus les plus courts sont favorisés. Si des processus courts arrivent sans cesse, les processus plus longs n'auront jamais le temps de s'exécuter
  • L'algorithme du tourniquet (RR = Round Robin) : Chaque processus reçoit tour Ă  tour un intervalle de temps appelĂ© quantum. Au terme de ce quantum ou, si le processus s'achève ou se bloque avant cet instant, l'ordonnanceur attribue directement le processeur au processus suivant. L'algorithme est simple et Ă©quitable. C'est gĂ©nĂ©ralement cet ordonnancement circulaire qui est utilisĂ© dans les systèmes Ă  temps partagĂ©.
  • L'ordonnancement avec prioritĂ©:\ Un ordre de prioritĂ© est assignĂ©e Ă  chaque processus. Un processus en temps rĂ©el sera par exemple prioritaire par rapport Ă  une tâche de fond.
L'interblocage (Deadlock)

Le dîner des philosophes

Une version imagée de ce problème est présentée sous la forme d'un groupe de philosophes qui mangent des spaghettis.
Imaginons 4 philosophes qui passent leur temps soit à réfléchir, soit à manger. Ils disposent seulement de 4 fourchettes : il y a une fourchette entre 2 assiettes. Les règles sont les suivantes :

  • Chacun possède une place autour d'une table circulaire.
  • Chaque place est reprĂ©sentĂ©e par une assiette de spaghetti.
  • Un philosophe doit avoir deux fourchettes pour manger.
  • Un philosophe peut seulement prendre la fourchette situĂ©e immĂ©diatement Ă  sa droite et celle situĂ©e immĂ©diatement Ă  sa gauche.

Supposons que tous les philosophes prennent leur fourchette de droite et qu’ils attendent que la fourchette de gauche se libère. Alors, aucun philosophe ne pourra obtenir la fourchette de gauche manquante. Les philosophes attendent mutuellement l’un après l'autre. Le philosophe A attend après B, B après C, C après D et D après A. Il y a attente circulaire et les philosophes sont bloqués et vont mourir de faim !

L’analogie consiste maintenant à identifier un philosophe à un processus et une fourchette à une ressource pouvant être sollicitée par un philosophe… On obtient alors ce que l’on appelle un interblocage de processus.

Un exemple plus détaillé

Pour terminer, illustrons ce phénomène avec deux processus P1 et P2 initialement « éligibles » et deux ressources R1 et R2, initialement libres. On rappelle à droite les 3 états de bases dans lesquels se trouvent en général un processus.
On suppose que l’algorithme d’ordonnancement utilisé est celui du tourniquet et que les processus P1 et P2 contiennent les instructions décrites ci-contre. Démarrons :

  • Le système passe le processus P1 Ă  l’état « élu », P1 commence son exĂ©cution et une instruction demande la ressource R1. Il obtient satisfaction puisque R1 est libre puis le système repasse P1 dans l'Ă©tat « éligible ».
  • Le système passe ensuite le processus P2 Ă  l'Ă©tat « élu » : P2 commence son exĂ©cution et demande la ressource R2. Il obtient immĂ©diatement R2 puisque cette ressource Ă©tait libre.
  • Le système maintient P2 Ă  l'Ă©tat « élu » et P2 poursuit donc son exĂ©cution et une instruction de P2 demande la ressource R1, il passe donc dans l’état « bloqué » puisque la ressource R1 n’est pas libre : P1 Ă©tant toujours dans l'Ă©tat « éligible », il n'a pas pu libĂ©rer la ressource R1 (pour libĂ©rer R1, P1 doit ĂŞtre dans l'Ă©tat « élu »).
  • P2 Ă©tant bloquĂ© (en attente de R1), le système repasse P1 dans l'Ă©tat « élu » et avant de libĂ©rer R1, une des instructions de P1 demande Ă  utiliser R2. Problème : R2 n'a pas encore Ă©tĂ© libĂ©rĂ© par P2, R2 n'est donc pas disponible, P1 passe donc aussi Ă  l’ Ă©tat « bloqué ».

Diagramme des Ă©tats de bases pour un processus

Processus P1 | Processus P2

...        | ...
demande R1 | demande R2
demande R2 | demande R1
...        | ...
libère R1  | libère R2
libère R2  | libère R1
...        | ...

Résumons la situation à cet instant : P1 possède la ressource R1 et se trouve dans l'état « bloqué » (attente de R2), P2 possède la ressource R2 et se trouve dans l'état « bloqué » (attente de R1).
Pour que P1 puisse poursuivre son exécution, il faut que P2 libère la ressource R2, mais P2 ne peut pas poursuivre son exécution (et donc libérer R2) puisqu'il est bloqué dans l'attente de R1.
Pour que P2 puisse poursuivre son exécution, il faut que P1 libère la ressource R1, mais P1 ne peut pas poursuivre son exécution (et donc libérer R1) puisqu'il est bloqué dans l'attente de R2.

La situation est donc totalement bloquée !

Dans de nombreux cas , deux processus peuvent souhaiter accéder à la même ressource sur le disque dur , par exemple :

  • les 2 processus ont juste besoin de lire la donnĂ©e ; celle-ci est alors partagĂ©e sans problème.
  • les 2 processus ont besoin de la donnĂ©e de façon exclusive pour la modifier par exemple.
  • les 2 processus ont besoin de communiquer entre eux : l’un doit attendre un rĂ©sultat de l’autre

L’interblocage est donc le risque pour plusieurs processus qui interagissent de se bloquer l’un et l’autre.
Il existe plusieurs solutions permettant, soit de mettre fin à un interblocage (cela passe par l'arrêt d'un des processus), soit d'éviter les interblocages, mais ces solutions ne seront pas étudiées ici.
La plupart des OS ont choisi de ne pas essayer d’éviter les interblocages, mais de le détecter s’ils surviennent et de les résoudre.