Aller au contenu

T5.2 Gestion des processus⚓︎

1. Notion de processus⚓︎

Au moment où j'écris ce cours sur mon PC de bureau, j'ai plusieurs fenêtres d'ouvertes (petite sélection ci-dessous).

Chaque fenêtre est l'affichage graphique d'un programme que j'ai «lancé» ou plutôt exécuté, par exemple:

  • un éditeur pour écrire le cours
  • un navigateur pour le visualiser, lire mes mails, consulter des pages web pour trouver des ressources, écouter de la musique...
  • un éditeur Python resté ouvert après avoir trouvé l'erreur du code de vendredi sur les labyrinthes
  • un visionneur de documents PDF
  • un terminal pour tester les commandes de ce thème
  • deux gestionnaires de fichiers

Pour chaque exécution d'un programme sur l'ordinateur, le système d'exploitation copie le programme dans la RAM à une adresse inscrite dans les registres du processeur. Cette instance d'exécution du programme s'appelle un processus.

Processus

Un processus est identifé par un PID, numéro attribué à sa création par le système d'exploitation.

Un processus est caractérisé par :

  • l'ensemble des instructions qu'il va devoir accomplir (écrites dans le fichier exécutable obtenu par la compilation du code-source du programme)
  • les ressources que le programme va mobiliser (fichier en ouverture, carte son, connexion réseau...)
  • l'état des registres du processeur (voir l'architecture de Von Neumann )

Plusieurs processus peuvent être associés à un même programme (c'est le cas du gestionnaire de fichiers sur mon PC), ils occupent alors des espaces mémoire différents.

Observation des processus sous Linux

La commande ps (comme process status) permet d'afficher dans un terminal la liste des processus actifs. On l'utilise avec les option l pour obtenir tous les renseignements et u pour préciser l'utilisateur propriétaire des processus.

Exercice 1

Dans un terminal, tapez la commande ps -lu nsi et retrouver le sens des colonnes S, PID, PPID et CMD

Exemple et signification
  • PID est le process identifier : un entier attribué par le système d'exploitation
  • PPID est le parent process identifier : l'identifiant du parent qui a engendré le processus
  • S indique le statut du processus (S pour stopped et R pour running)
  • CMD est le nom de la commande qui a créé le processus
    cedric@cedric-PC:~$ ps -lu cedric
    F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S  1000    1310       1  0  80   0 -  4389 ep_pol ?        00:00:00 systemd
    5 S  1000    1311    1310  0  80   0 - 42400 -      ?        00:00:00 (sd-pam)
    0 S  1000    1317    1310  0  69 -11 - 10532 ep_pol ?        00:00:00 pipewire
    0 S  1000    1318    1310  0  80   0 -  6534 ep_pol ?        00:00:00 pipewire-m
    0 S  1000    1319    1310  0  69 -11 - 142331 do_pol ?       00:00:00 pulseaudio
    0 S  1000    1324    1310  0  80   0 -  2258 ep_pol ?        00:00:00 dbus-daemo
    4 S  1000    1326    1305  0  80   0 - 78896 do_pol ?        00:00:00 xfce4-sess
    1 S  1000    1429       1  0  80   0 - 115692 do_pol ?       00:00:00 ibus-daemo
    0 S  1000    1439    1310  0  80   0 - 77383 do_pol ?        00:00:00 at-spi-bus
    0 S  1000    1450    1310  0  80   0 - 60851 do_pol ?        00:00:00 gvfsd
    0 S  1000    1453    1439  0  80   0 -  2142 ep_pol ?        00:00:00 dbus-daemo
    0 S  1000    1457    1310  0  80   0 - 57778 do_pol ?        00:00:00 xfconfd
    0 S  1000    1466    1310  0  80   0 - 40704 do_pol ?        00:00:00 at-spi2-re
    0 S  1000    1468    1310  0  80   0 - 95221 futex_ ?        00:00:00 gvfsd-fuse
    0 S  1000    1474    1429  0  80   0 - 60045 do_pol ?        00:00:00 ibus-dconf
    0 S  1000    1478    1429  0  80   0 - 106103 do_pol ?       00:00:00 ibus-ui-gt
    0 S  1000    1481    1429  1  80   0 - 68816 do_pol ?        00:00:01 ibus-exten
    0 S  1000    1485       1  0  80   0 - 49190 do_pol ?        00:00:00 ibus-x11
    0 S  1000    1487    1310  0  80   0 - 58199 do_pol ?        00:00:00 xfce4-scre
    0 S  1000    1491    1310  0  80   0 - 60024 do_pol ?        00:00:00 ibus-porta
    0 S  1000    1528    1310  0  80   0 - 101344 do_pol ?       00:00:00 xdg-deskto
    1 S  1000    1538       1  0  80   0 - 97827 do_pol ?        00:00:00 gnome-keyr
    0 S  1000    1541    1326  1  80   0 - 117383 do_pol ?       00:00:00 xfwm4
    0 S  1000    1563    1310  0  80   0 - 116509 do_pol ?       00:00:00 xdg-docume
    0 S  1000    1570    1310  0  80   0 - 59709 do_pol ?        00:00:00 xdg-permis
    0 S  1000    1579    1310  0  80   0 - 86782 do_pol ?        00:00:00 xdg-deskto
    0 S  1000    1592    1429  0  80   0 - 41586 do_pol ?        00:00:00 ibus-engin
    0 S  1000    1609    1326  0  80   0 - 58769 do_pol ?        00:00:00 xfsettings
    0 S  1000    1647    1326  0  80   0 - 118593 do_pol ?       00:00:00 xfce4-pane
    0 S  1000    1651    1326  0  80   0 - 86365 do_pol ?        00:00:00 Thunar
    0 S  1000    1656    1326  0  80   0 - 123972 do_pol ?       00:00:00 xfdesktop
    0 S  1000    1666    1326  0  80   0 - 87346 do_pol ?        00:00:00 xfce4-clip
    0 S  1000    1670    1310  0  99  19 - 142146 do_pol ?       00:00:00 tumblerd
    1 S  1000    1671       1  0  80   0 -  3225 do_pol ?        00:00:00 xcape
    0 S  1000    1674    1326  0  80   0 - 124064 do_pol ?       00:00:00 update-not
    0 S  1000    1676    1326  0  80   0 - 47524 do_pol ?        00:00:00 polkit-gno
    0 S  1000    1680    1326  0  80   0 - 15702 do_pol ?        00:00:00 applet.py
    0 S  1000    1685    1326  0  80   0 - 126155 do_pol ?       00:00:00 nm-applet
    0 S  1000    1686    1326  0  80   0 - 59959 do_pol ?        00:00:00 agent
    0 S  1000    1689    1326  0  80   0 - 49261 do_pol ?        00:00:00 xfce4-powe
    0 S  1000    1698    1326  0  80   0 - 126367 do_pol ?       00:00:00 kdeconnect
    0 S  1000    1712    1326  0  80   0 - 195837 do_pol ?       00:00:00 xiccd
    0 S  1000    1735    1326  0  80   0 - 63761 do_pol ?        00:00:00 ayatana-in
    0 S  1000    1737    1310  0  80   0 - 66229 do_pol ?        00:00:00 xfce4-noti
    0 S  1000    1765    1310  0  80   0 - 79720 do_pol ?        00:00:00 gvfs-udisk
    0 S  1000    1782    1310  0  80   0 - 59848 do_pol ?        00:00:00 gvfs-goa-v
    0 S  1000    1787    1310  0  80   0 - 79491 do_pol ?        00:00:00 gvfs-afc-v
    0 S  1000    1792    1310  0  80   0 - 59797 do_pol ?        00:00:00 gvfs-mtp-v
    0 S  1000    1798    1310  0  80   0 - 60069 do_pol ?        00:00:00 gvfs-gphot
    0 S  1000    1809    1647  0  80   0 - 101142 do_pol ?       00:00:00 panel-12-i
    0 S  1000    1810    1647  0  80   0 - 149060 do_pol ?       00:00:00 panel-30-p
    0 S  1000    1811    1647  0  80   0 - 86407 do_pol ?        00:00:00 panel-31-s
    4 S  1000    2068    1647  4  80   0 - 9593857 do_pol ?      00:00:01 code
    0 S  1000    2071    2068  0  80   0 - 8439921 do_pol ?      00:00:00 code
    4 S  1000    2072    2068  0  80   0 - 8439919 do_wai ?      00:00:00 code
    1 S  1000    2074    2072  0  80   0 - 8439919 do_pol ?      00:00:00 code
    0 S  1000    2087       1  0  80   0 - 8393934 ep_pol ?      00:00:00 chrome_cra
    1 S  1000    2102    2071  4  80   0 - 8489213 do_pol ?      00:00:01 code
    1 S  1000    2111    2102  0  80   0 - 8455671 skb_wa ?      00:00:00 code
    0 S  1000    2118    2068  0  80   0 - 8454311 futex_ ?      00:00:00 code
    0 S  1000    2139    2068 19  80   0 - 14278157 futex_ ?     00:00:08 code
    0 S  1000    2175    2068  6  80   0 - 9542674 ep_pol ?      00:00:02 code
    0 S  1000    2189    2068  7  80   0 - 11655640 futex_ ?     00:00:02 code
    0 S  1000    2203    2189  1  80   0 - 9542663 ep_pol ?      00:00:00 code
    0 S  1000    2240    2189  0  80   0 - 9542629 ep_pol ?      00:00:00 code
    4 S  1000    2248    1647 18  80   0 - 761314 do_pol ?       00:00:07 firefox
    4 S  1000    2318    2248  0  80   0 - 50981 do_pol ?        00:00:00 Socket Pro
    4 S  1000    2363    2248  0  80   0 - 601385 do_pol ?       00:00:00 Privileged
    4 S  1000    2404    2248  3  80   0 - 4857744 do_pol ?      00:00:01 WebExtensi
    4 S  1000    2448    2248  2  80   0 - 618721 do_pol ?       00:00:00 Isolated W
    0 S  1000    2513    2203  0  80   0 -  3492 do_sel pts/0    00:00:00 bash
    0 S  1000    2530    2203  0  80   0 -  3492 do_wai pts/1    00:00:00 bash
    0 S  1000    2581    2530 35  80   0 - 180036 futex_ pts/1   00:00:09 mkdocs
    4 S  1000    2607    2248  0  80   0 - 601744 do_pol ?       00:00:00 Web Conten
    4 S  1000    2610    2248  9  80   0 - 1729401 do_pol ?      00:00:02 Isolated W
    4 S  1000    2692    2248  0  80   0 - 599832 do_pol ?       00:00:00 Web Conten
    4 S  1000    2722    2248  0  80   0 - 599832 do_pol ?       00:00:00 Web Conten
    0 S  1000    2767    2175  1  80   0 - 9530216 ep_pol ?      00:00:00 code
    0 S  1000    2785    1310  1  80   0 - 155025 do_pol ?       00:00:00 gcr-prompt
    4 S  1000    2904    2248  2  80   0 - 599832 do_pol ?       00:00:00 Web Conten
    0 S  1000    2928       1  0  80   0 - 10643 hrtime ?        00:00:00 xfce4-mime
    0 R  1000    2929    2928  6  80   0 - 137689 -     ?        00:00:00 xfce4-term
    0 S  1000    2952    2929  0  80   0 -  3486 do_wai pts/2    00:00:00 bash
    4 R  1000    2958    2952  0  80   0 -  3827 -      pts/2    00:00:00 ps
    

La commande pstree permet d'afficher dans un terminal la liste des processus actifs sous forme d'arborescence.

Exercice 2

Testez.

La commande top permet de connaître en temps réel la liste des processus, classés par ordre décroissant de consommation de CPU (en pourcentage).

On ferme top par la combinaison de touches Ctrl-C.

Exercice 3

Testez.

Lorsqu'un programme ne répond plus, ou bien qui consomme beaucoup trop de ressources, on peut forcer son arrêt à l'aide de la commande kill (avec éventuellement l'option -9 si vraiment besoin).

Exercice 4

Combien de processus ai-je arrêté avec kill 2248 ?

Les états d'un processus

De sa création jusqu'à sa terminaison, un processus peut se trouver dans 3 états : prêt, élu ou bloqué.

  • prêt : le processus attend l'accès au processeur pour être traité;
  • élu: le processus a obtenu l'accès au processeur, il est en cours d'exécution;
  • bloqué: pendant son exécution, le processus attend une ressource non immédiatement disponible. Son exécution s'interrompt. Lorsque la ressource sera disponible, le processus repassera par l'état Prêt et attendra à nouveau son tour.

Les processus passent d'un état à un autre selon le schéma (à connaître) suivant:

2. L'ordonnancement⚓︎

Lorsqu'on utilise un ordinateur, on a l'impression que tous les processus en cours s'exécutent en parallèle: on peut télécharger un document sur le web avec son navigateur pendant qu'on écoute de la musique avec un lecteur de musique et qu'on s'entraîne à l'épreuve pratique de NSI avec Thonny...

Or un programme n'étant ni plus ni moins qu'une série d'instructions en langage machine, un processeur ne peut en exécuter qu'une à la fois. Comment le système d'exploitation fait-il alors pour gérer une exécution concurrente des processus (dont les temps d'exécution se chevauchent), c'est-à-dire décider quel processus doit être élus, prêts, bloqués?

Dans un système d'exploitation, c'est le rôle de l'ordonnanceur de gérer les états des processus et de décider quel processus doit être traité à quel moment.

Le schéma ci-dessous (issu de ce site) présente quelques politiques d'ordonnancement :

image

Dans le cas (très fréquent maintenant) d'un processeur multi-cœurs, le problème reste identique. Certes, sur 4 cœurs, 4 processus pourront être traités simultanément (une réelle simultanéité) mais il reste toujours beaucoup plus de processus à traiter que de cœurs dans le processeur... et un ordonnancement est donc toujours nécessaire.

Exemples de politiques d'ordonnancement

On considère une situation où quatre processus C₁, C₂, C₃ et C₄ sont créés sur un ordinateur, et où aucun autre processus n’est lancé sur celui-ci, ni préalablement ni pendant l’exécution des quatre processus.

On suppose que les quatre processus arrivent dans la file et y sont placés dans l’ordre C₁, C₂, C₃ et C₄.

  • Les temps d’exécution totaux de C₁, C₂, C₃ et C₄ sont respectivement 100 ms, 150 ms, 80 ms et 60 ms.
  • Après 40 ms d’exécution, le processus C₁ demande une opération d’écriture disque, opération qui dure 200 ms. Pendant cette opération d’écriture, le processus C₁ passe à l’état bloqué.
  • Après 20 ms d’exécution, le processus C₃ demande une opération d’écriture disque, opération qui dure 10 ms. Pendant cette opération d’écriture, le processus C₃ passe à l’état bloqué.

Principe: comme son nom l'indique, on élit les processus par ordre croissant d'exécution. Efficace, mais il est en pratique la plupart du temps impossible de prévoir à l'avance le temps d'exécution d'un processus.

Principe: les processus sont gérés dans une file par ordre de création. Une fois bloqués ou terminés, ils sont défilés, et enfilés s'ils passent à nouveau à l'état prêt. Simple, mais peu adapté à la plupart des situations.

Principe: un quantum de temps est alloué à chaque processus. Si le processus n'est pas terminé au bout de ce temps, il est mis en bout de file en état prêt.

Sous Linux, l'ordonnancement est effectué par un système hybride où les processus sont exécutés à tour de rôle (sur un modèle tourniquet / Round Robin) suivant un ordre de priorité dynamique.

3. Interblocage (deadlock)⚓︎

Comme nous venons de le voir, un processus peut être dans l'état bloqué dans l'attente de la libération d'une ressource.

Ces ressources (l'accès en écriture à un fichier, à un registre de la mémoire...) ne peuvent être données à deux processus à la fois. Des processus souhaitant accéder à cette ressource sont donc en concurrence sur cette ressource. Un processus peut donc devoir attendre qu'une ressource se libère avant de pouvoir y accéder (et ainsi passer de l'état bloqué à l'état prêt).

Situation critique

Imaginons deux processus A et B, dont les étapes d'exécution nécessitent l'accès à deux ressources A et B selon le schéma suivant:

Écrire le déroulement de ces processus, en supposant qu'ils ne réalisent qu'une étape à l'état élu avant interruption par l'ordonnanceur.

Les deux processus A et B sont donc dans l'état bloqué, chacun en attente de la libération d'une ressource bloquée par l'autre : ils se bloquent mutuellement.

Cette situation (critique) est appelée interblocage ou deadlock.

On représente les processus par ces cercles, et les ressources par des carrés.

  • Si un processus a demandé et obtenu une ressource, on trace un arc de la ressouce vers le processus;
  • Si un processus est en attente d'une ressource, on trace un arc du processus vers la ressource.

Dans le cas présent, on obtient ce schéma:

La présence d'un cycle dans ce schéma caractérise la situation d'interblocage.

4. Exercices⚓︎

Exercice 5

Sept processus P1 à P7 sont dans la situation suivante par rapport aux ressources R1 à R6:

  • P1 a obtenu R1 et demande R2;
  • P2 deamnde R3 et n'a obtenu aucune ressource tout comme P3 qui demande R2;
  • P4 a obtenu R2 et R4 et demande R3;
  • P5 a obtenu R3 et demande R5;
  • P6 a obtenu R6 et demande R2;
  • P7 a obtenu R5 et demande R2.

Déterminer à l'aide d'un schéma s'il y a interblocage dans cette situation.

Exercices Type BAC

Énoncé 1 Énoncé 2