Archi Processus

Identification

Infoforall

23 - Gestion des processus


Cette activité traite de questions assez importantes qui ont été mises de côté jusqu'à présent :

  • qu'est-ce qu'un processus par rapport à un programme ?
  • comment démarre un processus ?
  • comment l'ordinateur parvient-il à gérer plusieurs processus en même temps ?
  • pourquoi certaines applications se figent-elles définitement parfois ?
  • que viennent faire des zombis dans un cours de NSI ?
Image CC-BY-NC-SA https://turnoff.us

Evaluation ✎ : -

Documents de cours : open document ou pdf

1 - Vocabulaire : Programme, processus et processeur

Programme

Un programme est un ensemble d'instructions permettant de faire réaliser certaines tâches à un système informatique. Il s'agit donc d'une implémentation en machine d'un algorithme.

En réalité, derrière ce mot "programme" se trouve deux notions :

  • Un programme binaire :
    • Il s'agit d'une suite de bits directement compréhensible par le processeur.
    • Exemple d'un ensemble de bits permettant de transférer le contenu d'une zone-mémoire dans l'un des registres de processeur :
      • En base 02 :  0010 0010 0011 1001 0000 0000 0000 0000 0000 0000 0010 0000 
      • En base 16 :  2239 0000 0020  en utilisant la méthode des quartets
      • On peut le traduire si on sait qu'il s'agit du jeu d'instructions 68000 de Motorola, on peut lire dans la notice que  001  en début d'instruction signifie qu'on veut déplacer des données (dont on donne l'adresse-mémoire ensuite) vers un registre (dont on donne la référence).
      • La traduction mot à mot en utilisant quelques mots clés plutôt que les valeurs réelles des bits se nomme le langage d'assemblage, ou assembleur par abus de langage.
  • Un programme source :
    • Il s'agit des instructions fournies dans un langage de programmation.
    • Ce code-source est compréhensible par un humain.
    • Ce code-source n'est pas compréhensible par le processeur d'un système informatique et doit être traduit en langage machine.
    • Voyons deux manières de gérer cette traduction :
      • les langages compilés (comme le langage C par exemple)
        • En première approximation, on peut le voir comme le fait de fournir le code-source à un compilateur qui va le transformer en "code-machine" binaire.
        • On transmet directement le "code-machine" aux personnes qui veulent utiliser le programme. Ils devront donc avoir une machine compatible (système d'exploitation et processeur)
        • Avantages : rapidité (la traduction est déjà faite en grande partie) et la personne n'a pas d'autres programmes à installer sur sa machine.
        • Désavantages : le "code-machine" créé n'est compréhensible que par les systèmes d'exploitation et processeurs compatibles, compilation à faire à chaque fois qu'on veut vérifier le programme
      • les langages interprétés (comme le langage Python par exemple)
      • En première approximation, on peut le voir comme le fait de fournir le code-source à un interpréteur qui va transformer le code-source à la volée en code-machine.
      • On transmet le code-source lorsqu'on veut transmettre le programme. L'utilisateur devra donc avoir un interpréteur installé.
      • Avantages : le code-source est traduit directement par l'interpréteur du système sur lequel il doit tourner et va donc être compatible. La mise au point du programme est rapide puisqu'on peut le tester rapidement sans passer par la phase compilation.
      • Désavantages : c'est souvent lent (la traduction doit être faite en grande partie à la volée) et la personne doit avoir un interpréteur installé sur sa machine.
    Processeur

    Le processeur a pour acronyme UCT (Unité Centrale de Traitement en français) ou CPU (Central Processing Unit en anglais).

    Le processeur est composé principalement des parties suivantes :

    • L'UDC (Unité de Commande) permettant de gérer X bits à la fois : la partie de la puce qui lit la prochaine tâche élémentaire à effectuer en mémoire et qui commande l'UAL pour effectuer cette tâche élémentaire.
    • L'UAL (Unité Arithmétique et Logique) permettant de traiter X bits à la fois : la partie de la puce qui effectue les calculs, les déplacements en mémoire...
    • Quelques registres permettent de stocker et lire très rapidement en mémoire
    • Des bus permettant de transporter X bits à la fois
    Création d'un processus

    Que se passe-t-il lorsqu'on veut exécuter un programme ?

    Sachant que le programme n'est qu'une suite d'octets placés en mémoire de masse (disque dur, disque SSD, clé USB...), on va devoir :

    1. réserver une place spécifique en mémoire vive (RAM) (on parle de virtualisation de la mémoire)
    2. copier le code du programme en mémoire vive (RAM)
    3. commençer à gérer l'exécution du code du processus

    Un processus est donc l'exécution concrète d'un programme par le processeur à partir d'une zone mémoire virtuelle propre où on a placé ses instructions et ses données.

    On dit également qu'un processus est l'instance d'un programme : le programme est bien le moule permettant de générer le processus. Cette façon de voir les choses montrent bien qu'on peut lancer deux fois un même programme : on obtient en réalité deux instances, deux processus différents, disposant chacun de sa propre zone mémoire.

    C'est pour cela que vous pouvez ouvrir un programme plusieurs fois sur votre ordinateur. En réalité, vous n'exécutez pas plusieurs fois le programme. Vous avez simplement provoqué la création de plusieurs processus en RAM à partir du code du programme situé en mémoire de masse.

    Vocabulaire : les mots tâches et processus sont équivalents.

    01° Qu'est-ce qui limite concrétement le nombre de processus pouvant être lancer en même temps ?

    ...CORRECTION...

    La taille de la mémoire vive (RAM).

    Dès que cette mémoire est pleine, cela va énormément ralentir l'ordinateur : il est obligé de faire des copier-coller réguliers des données et des instructions entre la RAM et la mémoire de masse (qui est beaucoup plus lente).

    02° Qu'est-ce qu'un système d'exploitation multitâche ?

    ...CORRECTION...

    Un système d'exploitation qui sait faire fonctionner plusieurs processus "en même temps".

    03° Que va devoir faire un système d'exploitation multitâche lorsque plusieurs processus fonctionnent "en même temps" sur un ordinateur ne disposant que d'un seul microprocesseur (un coeur) ?

    ...CORRECTION...

    Le système d'exploitation va devoir choisir à qui offir les services du processeur.

    04° Que se passe-t-il au démarrage de l'ordinateur ?

    ...CORRECTION...

    Un premier programme bien spécifique est placé en mémoire automatiquement pour en faire le premier processus au démarrage.

    Premier démarrage : le chargeur d’amorçage

    Lorsqu'on démarre un système informatique, il est conçu pour générer automatiquement un premier processus en allant chercher un programme dans une zone précise de la mémoire : le chargeur d'amorçage ou bootloader en anglais.

    Ce processus va alors déclencher tous un tas d'autres processus : ceux permettant le démarrage du système d'exploitation par exemple.

    Les démons (daemons en anglais)

    Il s'agit d'une catégorie particulière de processus : des processus qui tournent en boucle car ils surveillent spécifiquement certaines choses.

    Leurs noms finissent souvent par ...d.

    Exemples :

    • httpd : le processus qui surveille notamment les messages qui arrivent sur le serveur HTTP
    • crond : le processus du planificateur de tâches Cron (pour Chrono Table) de Linux (et Unix), qui surveille si il doit lancer automatiquement certains processus à certaines heures.
    Et une application ?

    Une application peut être vue comme étant un ensemble de processus produisant un effet commun.

    La plupart des applications réelles ne sont pas modélisables comme un seul processus : on encapsule certaines de leurs fonctions dans des processus indépendants discutant entre eux en utilisant des signaux, de la mémoire partagée, ou des tubes.

    2 - Cycle de vie et états du processus

    Voyons maintenant le cycle de vie d'un processus.

    Etats d'un processus

    Le programme est initialement en mémoire.

    On commence par l'état initialisé : on réserve de la place en mémoire vive, on copie le code...

    Le processus passe alors automatiquement à l'état PRET : il est prêt à faire exécuter sa prochaine instruction élémentaire au processeur. Mais pour l'instant, il n'y a pas accès.

    Le système d'exploitation va alors faire une élection : il va choisir parmi les processus actifs celui qui pourra accéder au service du processeur .

    Le processus passe à l'état ELU s'il remporte l'élection : ce sont ses instructions qui vont être traitées par le processeur.

    Trois situations vont permettre de sortir de cet état :

    1. Le processus est en attente d'une réponse d'une ressource ou d'une entrée : il passe à l'état BLOQUE. On nomme cela le blocage. La partie de l'OS qui se charge de gérer les processeurs va alors mémoriser ce qu'attend ce processus. Cela permettra de le replacer à l'état PRET une fois que la réponse attendue sera arrivée. On nomme cette transition d'état le déblocage.
    2. Le processus a dépassé la durée de travail que lui a donné la partie de l'OS chargée des processus. Le processus repasse alors à l'état PRET. On appelle cela la préemption.
    3. Le processus n'a plus d'instructions à traiter : il passe à l'état FINI (ZOMBI). Il n'est pas encore mort, mais ça ne devrait pas tarder. L'OS reprend une grande partie de la mémoire qu'il avait réservé pour ce processus mais on garde encore quelques informations en mémoire : sa réponse, qui est son créateur... Il ne peut pas se faire disparaître lui-même. C'est son créateur qui devra signaler qu'on peut faire disparaître définitivement les derniers éléments qui restent en mémoire. D'où le mot zombie : pas vivant mais pas mort non plus.

    05° Quels sont les états pendant lesquels la mémoire vive réserve de la place au processus ?

    ...CORRECTION...

    Dans les 5 états.

    Dans le premier état, le processus vient de gagner sa place mémoire.

    Dans les 3 blancs (PRET - ELU - BLOQUE), il est en cours de traitement.

    Dans le dernier (FINI/ZOMBIE), il n'est pas encore mort. La mémoire est libérée en partie mais pas entièrement : nous allons voir que le processus qui l'a créé va venir récolter quelques dernières informations (comme une réponse par exemple) afin de le supprimer définitivement.

    Gestionnaire d'interruption

    Si on se limitait à cela, un processus n'aura pas son mot à dire en étant à l'état BLOQUE ou PRET. Il devrait tranquillement attendre son tour même si un événement important survenait pour lui.

    Imaginons qu'on veuille émettre un bip lorsqu'on tape sur une touche. Si le processus pouvant faire cela est en PRET, il ne pourrait rien faire tant qu'une nouvelle élection n'ai lieu.

    Les systèmes d'exploitation (OS) intégrent donc un système de gestion d'interruption : un processus peut signaler qu'il doit effectuer des actions si un certain événement apparaît, on peut surveiller qu'une ressource finit par répondre à un appel provoqué par le processus...

    Le système d'exploitation va alors stocker cette demande dans un tableau et peut interrompre le fonctionnement du processus actuel en le plaçant de l'état ELU à PRET (préemption) et provoquer une nouvelle élection.

    L'une des interruptions est d'ailleurs l'interruption d'horloge qui permet de provoquer périodiquement une préemption et une nouvelle élection toutes les x tops d'horloge.

    3 - Linux

    Commande ps (process status) - introduction

    La commande ps permet d'obtenir la liste des processus actifs dans un terminal Linux (ici en utilisant la "simulation" de terminal, l'application graphique bash en réalité).

    rv@rv-HP2:~$ ps PID TTY TIME CMD 17255 pts/1 00:00:00 bash 18060 pts/1 00:00:00 ps

    Cette commande donne plusieurs informations sur les processus actifs :

    • PID : le numéro d'identification du processus dans le système d'exploitation. PID veut dire Process IDentifier. Sous Linux, c'est un entier naturel encodé sur 32 bits.
    • TTY : le terminal ou son équivalent application graphique qui "contrôle" le processus. Si le processus est un démon non rattaché à un terminal, vous verriez "?".
    • TIME : fournit le temps d'utilisation du CPU par ce processus. Attention, il s'agit bien du temps d'utilisation du processus : si on active Blender via le bash, le temps d'utilisation sera attribué à Blender : le Bash n'a servi qu'à lancer le processus de Blender.
    • CMD : la commande qui a engendré la création du processus.

    La commande ps est similaire à la commande tasklist de Microsoft Windows. Dans Windows PowerShell, ps est un alias pré-défini de la commande Get-Process qui a globalement la même fonction.

    06° Lancer Blender de cette façon via le bash. Gardez-vous la main sur le bash tant que Blender reste ouvert ?

    rv@rv-HP2:~$ blender

    ...CORRECTION...

    Non, nous n'avons plus la main sur le terminal tant que Blender est en route.

    07° Stopper Blender à l'aide de son interface graphique. Retaper ensuite un appel à Blender mais en rajoutant un &. Que constate-t-on au niveau du bash ? A quoi sert le rajout de &?

    Saved session recovery to '/tmp/quit.blend' Blender quit rv@rv-HP2:~$ blender & [1] 19369 rv@rv-HP2:~$

    ...CORRECTION...

    Cette fois, on peut encore taper des instructions dans le bash des informations sont apparues après l'appel de Blender.

    & permet de faire fonctionner plusieurs choses en même temps : le bash peut ainsi fonctionner "en même temps" que le processus qu'il a créé.

    08° Nouvelle commande ps. A quoi correspondent les informations que nous avions sous l'appel de Blender ?

    rv@rv-HP2:~$ blender & [1] 19369 rv@rv-HP2:~$ ps PID TTY TIME CMD 17255 pts/1 00:00:00 bash 19369 pts/1 00:00:37 blender 19883 pts/1 00:00:00 ps

    ...CORRECTION...

    Nous obtenons le PID qui a été attribué à Blender.

    rv@rv-HP2:~$ blender & [1] 19369 rv@rv-HP2:~$ ps PID TTY TIME CMD 17255 pts/1 00:00:00 bash 19369 pts/1 00:00:37 blender 19883 pts/1 00:00:00 ps

    09° Fermer le bash sans fermer Blender. Que constate-t-on ?

    ...CORRECTION...

    Cela a fermé Blender tout seul !

    Vous venez de voir qu'il y a un lien entre les deux programmes : la fermeture du bash a provoqué la fermeture de Blender.

    On peut donc dire que le bash est le père de Blender. Nous allons retrouver les Arbres !

    Observer l'arbre des processus avec pstree

    Voici un exemple de hierarchie qu'on peut observer sur les processus qui lance d'autres processus :

    On peut ouvrir un nouveau terminal et utiliser ceci :

    rv@rv-HP2:~$ ps PID TTY TIME CMD 20552 pts/1 00:00:00 bash 20562 pts/1 00:00:00 ps rv@rv-HP2:~$ blender & [1] 20563 rv@rv-HP2:~$ pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─accounts-daemon───2*[{accounts-daemon}] ├─acpid ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─colord───2*[{colord}] ├─cron ├─cups-browsed───2*[{cups-browsed}] ├─cupsd ├─dbus-daemon ├─dnsmasq───dnsmasq ├─fwupd───4*[{fwupd}] ├─gdm3─┬─gdm-session-wor─┬─gdm-x-session─┬─Xorg───20*[{Xorg}] │ │ │ ├─gnome-session-b─┬─ssh-agent │ │ │ │ └─2*[{gnome-+ │ │ │ └─2*[{gdm-x-session}] │ │ └─2*[{gdm-session-wor}] │ └─2*[{gdm3}] ├─gnome-keyring-d─┬─ssh-agent │ └─3*[{gnome-keyring-d}] ├─irqbalance───{irqbalance} ├─2*[kerneloops] ├─libvirtd───16*[{libvirtd}] ├─networkd-dispat ├─polkitd───2*[{polkitd}] ├─rsyslogd───3*[{rsyslogd}] ├─rtkit-daemon───2*[{rtkit-daemon}] ├─snapd───19*[{snapd}] ├─switcheroo-cont───2*[{switcheroo-cont}] ├─systemd─┬─(sd-pam) │ ├─at-spi-bus-laun─┬─dbus-daemon │ │ └─3*[{at-spi-bus-laun}] │ ├─at-spi2-registr───2*[{at-spi2-registr}] │ ├─atom─┬─atom───atom─┬─atom │ │ │ └─4*[{atom}] │ │ ├─atom───atom │ │ ├─atom───4*[{atom}] │ │ ├─atom───18*[{atom}] │ │ ├─atom───10*[{atom}] │ │ └─33*[{atom}] │ ├─dbus-daemon │ ├─dconf-service───2*[{dconf-service}] │ ├─2*[evince───5*[{evince}]] │ ├─evinced───2*[{evinced}] │ ├─evolution-addre───5*[{evolution-addre}] │ ├─evolution-calen───8*[{evolution-calen}] │ ├─evolution-sourc───3*[{evolution-sourc}] │ ├─firefox─┬─Privileged Cont───24*[{Privileged Cont}] │ │ ├─RDD Process───2*[{RDD Process}] │ │ ├─3*[Web Content───28*[{Web Content}]] │ │ ├─2*[Web Content───24*[{Web Content}]] │ │ ├─Web Content───29*[{Web Content}] │ │ ├─2*[Web Content───32*[{Web Content}]] │ │ ├─WebExtensions───24*[{WebExtensions}] │ │ └─106*[{firefox}] │ ├─gimp-2.10─┬─script-fu───2*[{script-fu}] │ │ └─7*[{gimp-2.10}] │ ├─gjs───6*[{gjs}] │ ├─gnome-session-b─┬─evolution-alarm───5*[{evolution-alarm}] │ │ ├─gsd-disk-utilit───2*[{gsd-disk-utilit}] │ │ ├─solaar───3*[{solaar}] │ │ ├─update-notifier───3*[{update-notifier}] │ │ └─3*[{gnome-session-b}] │ ├─gnome-session-c───{gnome-session-c} │ ├─gnome-shell─┬─evince───4*[{evince}] │ │ ├─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}] │ │ │ ├─ibus-engine-sim───2*[{ibus-engi+ │ │ │ ├─ibus-extension-───3*[{ibus-exte+ │ │ │ └─2*[{ibus-daemon}] │ │ ├─notepadqq-bin───7*[{notepadqq-bin}] │ │ ├─oosplash─┬─soffice.bin───5*[{soffice.bin}] │ │ │ └─{oosplash} │ │ └─12*[{gnome-shell}] │ ├─gnome-shell-cal───5*[{gnome-shell-cal}] │ ├─gnome-terminal-─┬─bash───python───python───7*[{python}] │ │ ├─bash─┬─blender───20*[{blender}] │ │ │ └─pstree │ │ └─4*[{gnome-terminal-}] │ ├─goa-daemon───3*[{goa-daemon}] │ ├─goa-identity-se───2*[{goa-identity-se}] │ ├─gsd-a11y-settin───3*[{gsd-a11y-settin}] │ ├─gsd-color───3*[{gsd-color}] │ ├─gsd-datetime───3*[{gsd-datetime}] │ ├─gsd-housekeepin───3*[{gsd-housekeepin}] │ ├─gsd-keyboard───3*[{gsd-keyboard}] │ ├─gsd-media-keys───3*[{gsd-media-keys}] │ ├─gsd-power───3*[{gsd-power}] │ ├─gsd-print-notif───2*[{gsd-print-notif}] │ ├─gsd-printer───2*[{gsd-printer}] │ ├─gsd-rfkill───2*[{gsd-rfkill}] │ ├─gsd-screensaver───2*[{gsd-screensaver}] │ ├─gsd-sharing───3*[{gsd-sharing}] │ ├─gsd-smartcard───4*[{gsd-smartcard}] │ ├─gsd-sound───3*[{gsd-sound}] │ ├─gsd-wacom───2*[{gsd-wacom}] │ ├─gsd-xsettings───3*[{gsd-xsettings}] │ ├─gvfs-afc-volume───3*[{gvfs-afc-volume}] │ ├─gvfs-goa-volume───2*[{gvfs-goa-volume}] │ ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}] │ ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}] │ ├─gvfs-udisks2-vo───3*[{gvfs-udisks2-vo}] │ ├─gvfsd─┬─gvfsd-dnssd───2*[{gvfsd-dnssd}] │ │ ├─gvfsd-network───3*[{gvfsd-network}] │ │ ├─gvfsd-smb-brows───3*[{gvfsd-smb-brows}] │ │ ├─gvfsd-trash───2*[{gvfsd-trash}] │ │ └─2*[{gvfsd}] │ ├─gvfsd-fuse───5*[{gvfsd-fuse}] │ ├─gvfsd-metadata───2*[{gvfsd-metadata}] │ ├─ibus-portal───2*[{ibus-portal}] │ ├─ibus-x11───2*[{ibus-x11}] │ ├─nautilus───5*[{nautilus}] │ ├─pulseaudio───3*[{pulseaudio}] │ ├─sd_dummy───2*[{sd_dummy}] │ ├─sd_espeak-ng───4*[{sd_espeak-ng}] │ ├─snap-store───4*[{snap-store}] │ ├─speech-dispatch───2*[{speech-dispatch}] │ ├─tracker-miner-f───4*[{tracker-miner-f}] │ ├─xdg-document-po─┬─fusermount │ │ └─5*[{xdg-document-po}] │ └─xdg-permission-───2*[{xdg-permission-}] ├─systemd-journal ├─systemd-logind ├─systemd-machine ├─systemd-resolve ├─systemd-timesyn───{systemd-timesyn} ├─systemd-udevd ├─thermald───{thermald} ├─udisksd───4*[{udisksd}] ├─unattended-upgr───{unattended-upgr} ├─upowerd───2*[{upowerd}] ├─whoopsie───2*[{whoopsie}] └─wpa_supplicant rv@rv-HP2:~$

    Impressionnant non ?

    On peut aussi faire la même chose mais en affichant en plus les PID (résultat tronqué car trop long...).

    rv@rv-HP2:~$ pstree -p systemd(1)─┬─ModemManager(1064)─┬─{ModemManager}(1135) │ └─{ModemManager}(1139) ├─NetworkManager(922)─┬─{NetworkManager}(1038) │ └─{NetworkManager}(1063) ├─accounts-daemon(975)─┬─{accounts-daemon}(1009) │ └─{accounts-daemon}(1034) ├─systemd(1335)─┬─(sd-pam)(1336) │ ├─gnome-terminal-(3791)─┬─bash(3799)───python(3808)─+++ │ │ ├─bash(20552)─┬─blender(2056+ │ │ │ └─pstree(20927+ rv@rv-HP2:~$

    Quelques options

    • pstree affiche l'arbre des processus partant de la racine init ou systemd (par ordre alphabétique)
    • pstree -p affiche l'arbre avec les PID (par ordre alphabétique).
    • pstree -n affiche l'arbre en triant par numéro PID.
    • pstree -np affiche l'arbre en triant par numéro PID et en affichant le PID.
    • Pour voir toutes les options : man pstree.

    10° Etudier les réponses précédentes.

    • Qui est le processus-père (nom et ID) du processus pstree ?
    • A-t-il d'autres enfants (noms et PID éventuels) ?
    • Qui est le processus-racine (celui qui n'a pas de parent) ? Quel est le PID de ce processus si particulier ?

    ...CORRECTION...

    Voici l'Arbre fortement simplifié :

    rv@rv-HP2:~$ pstree -p systemd(1)─┬─systemd(1335)─┬─(sd-pam)(1336) │ ├─gnome-terminal-(3791)─┬─bash(3799)───python(3808)─+++ │ │ ├─bash(20552)─┬─blender(2056+ │ │ │ └─pstree(20927+

    On voit que le processus-parent de pstree(PID 20927) est une instance de bash, l'instance bash(PID 20552).

    Le processus bash(PID 20552) a un autre enfant : blender(PID 2056).

    On remarque enfin que TOUS les processus sont des descendants d'un seul processus :

    Le processus systemd dont le PID est 1.

    Il finit en d car c'est un processus daemon/démon : il fonctionne en boucle.

    11° A votre avis, que va-t-il se passer si on tape ceci ?

    rv@rv-HP2:~$ kill 3791

    ...CORRECTION...

    Nous allons demander de tuer ce processus ce qui va provoquer la mort de tous ses descendants également.

    rv@rv-HP2:~$ kill 3791

    Comme toutes les commandes, pstree possède de multiples options. On peut par exemple afficher directement les parents d'un processus dont on connait le PID :

    rv@rv-HP2:~$ pstree -s 20563 systemd───systemd───gnome-terminal-───bash───blender───20*[{blender}]
    Commande ps (process status) - états des processus

    La commande ps permet d'obtenir la liste des processus actifs dans un terminal Linux.

    Vous devez savoir :

    • que les processus sont identifiés par un identifiant nommé PID.
    • Un processus est toujours l'enfant d'un autre processus, excepté pour les deux premiers d'entre eux qui servent de racine à leur propre arbre :
      • PID 1 : la racine init dans l'espace utilisateur.
      • PID 2 : la racine kthreadd dans l'espace noyau
    • A partir de ce moment, on ne peut créer un nouveau processus qu'en utilisant un appel système fork(). A l'aide de cette commande, on va dupliquer le processus en cours, notamment les données d'environnement. En modifiant ensuite ce nouvau processus qui est une copie conforme du parent, on peut
      • obtenir une nouvelle version du processus (plusieurs fois Firefox..)
      • modifier les instructions du processus pour y charger un autre programme et créer ainsi un vrai nouveau processus (bash créant Blender ou l'interface graphique Gnome créant Blender)
    • Dans les deux cas, on a créé un nouveau processus dépendant du processus parent.
      • Chaque processus connait donc le PID de son parent. On le nomme PPID, comme Parent PID
      • Chaque processus connait le PID de ses enfants
    • Tuer un processus (avec kill PID ou juste via l'interface graphique) provoque également la disparition de tous les descendants du processus qu'on détruit.

    La commande ps possède en réalité de très nombreuses options. On peut ainsi si on le veut visualiser le PID du processus ainsi que le PID de processus parent (celui qui a lancé ce processus).

    Pour obtenir de la description de la commande :

    rv@rv-HP2:~$ man ps

    Pour obtenir une liste avec pas mal d'informations :

    rv@rv-HP2:~$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 169288 12032 ? Ss 08:16 0:03 /sbin/init sp root 2 0.0 0.0 0 0 ? S 08:16 0:00 [kthreadd] systemd+ 809 0.0 0.1 25308 13280 ? Ss 08:16 0:05 /lib/systemd/ rv 1335 0.0 0.1 20448 10808 ? Ss 08:17 0:03 /lib/systemd/ rv 22334 0.7 0.0 15344 5956 pts/1 Ss 18:11 0:00 bash rv 22342 0.0 0.0 16928 4336 pts/1 R+ 18:11 0:00 ps aux
    • USER : l'utilisateur ayant généré le processus
    • PID : le numéro d'identification du processus
    • %CPU : % d'utilisation du CPU par ce processus
    • %MEM : % d'utilisation de la mémoire par ce processus
    • VSZ : donne l'utilisation des bibliotheques partagées et la memoire utilisé pour son fonctionnement
    • RSS : mémoire physique utilisée en kilobytes
    • TTY : le terminal contrôlant le processus
    • STAT : affiche l'état actuel du processus (voir plus bas)
    • START : heure à laquelle le procédure à démarrer
    • TIME : le temps d'utilisation du CPU par ce processus.
    • CMD : la commande qui a engendré la création du processus.

    Cette commande donne plusieurs informations sur les processus actifs :

    • PID : le numéro d'identification du processus dans le système d'exploitation. PID veut dire Process IDentifier. Sous Linux, c'est un entier naturel encodé sous 32 bits.
    • TTY : le terminal ou son équivalent application graphique qui "contrôle" le processus. Si le processus est un démon non rattaché à un terminal, vous verriez "?".
    • TIME : fournit le temps d'utilisation du CPU par ce processus. Attention, il s'agit bien du temps d'utilisation du processus : si on active Blender via le bash, le temps d'utilisation sera attribué à Blender : le Bash n'a servi qu'à lancer le processus de Blender.
    • CMD : la commande qui a engendré la création du processus.

    L'état des processus (STAT, comme Status) est ce qui nous intéresse ici :

    Les status possibles d'un processus LINUX sont :

    • R (Running et Runnable) : en cours d'exécution. Cela correspond à la fois aux états PRET (Runnable an anglais) ou ELU (Running en anglais) de la partie 2.
    • S (Sleeping) : endormi. C'est un cas de l'état BLOQUE de la partie 2. Le processus attend une ressource mais peu être reveillé s'il reçoit certains signaux. Le sommeil est donc interruptible.
    • D (Down) : en attente absolue d'une ressource d'entrée/sortie. Ce type de sommeil ne peut pas être interrompu. Cela correspond à l'état également à l'état BLOQUE de la partie 2. La différence avec S est bien que seule l'arrivée de la ressource demandée pourra remettre le processus dans l'état PRET (R). On notera qu'il est quasi-impossible de détruire un tel processus puisque seul l'arrivée de la ressource peut le faire sortir de son sommeil.
    • T (sTopped) : le processus a été stoppé par un signal d'un processus ayant autorité sur lui. Il ne pourra redémarrer qu'avec un signal de redémarrage. Cela correspond également à une catégorie d'état BLOQUE.
    • Le système d'exploitation Linux détaille deux états terminaux FINI :

    • Z (Zombie) : processus terminé, ayant donc répondu à son parent, mais dont le parent n'a pas encore eu le temps de gérer la destruction finale.
    • X (Dead) : processus terminé et détruit (vous ne devriez donc jamais voir de X dans votre liste des processus en cours !).
    • Il existe également un état propre aux threads internes du noyau Linux :

    • I (Iddle) : je n'en parlerai pas plus que cela. Cela concerne les threads internes au noyau du système d'exploitation qui sont inactifs. C'est une sorte de sommeil interruptible. Si vous voulez savoir ce qu'est un thread, allez voir la partie FAQ.

    On peut trouver une deuxième lettre derrière l'état : il s'agit de la priorité du processus :

    • < : Priorité haute
    • + : Processus au premier plan
    • s : Leader de session
    • l : multi-theads
    • N : Priorité basse
    • L : ressources verrouillées en mémoire

    Pour visualiser l'état des processus, plusieurs façons de faire.

    Pour obtenir PID et STAT du processus, ps aux fait l'affaire :

    rv@rv-HP2:~$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 165340 11536 ? Ss 17:31 0:02 /sbin/init sp root 2 0.0 0.0 0 0 ? S 17:31 0:00 [kthreadd] ... rv 11051 0.2 0.9 2411716 74108 ? Sl 19:28 0:00 /snap/firefox rv 11192 0.6 0.0 15848 6308 pts/1 Ss 19:30 0:00 bash rv 11202 0.0 0.0 17052 4344 pts/1 R+ 19:30 0:00 ps aux

    rv@rv-HP2:~$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 165340 11536 ? Ss 17:31 0:02 /sbin/init sp root 2 0.0 0.0 0 0 ? S 17:31 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 17:31 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 17:31 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< 17:31 0:00 [kworker/0:0H root 9 0.0 0.0 0 0 ? I< 17:31 0:00 [mm_percpu_wq root 10 0.0 0.0 0 0 ? S 17:31 0:00 [rcu_tasks_ru root 11 0.0 0.0 0 0 ? S 17:31 0:00 [rcu_tasks_tr root 12 0.0 0.0 0 0 ? S 17:31 0:00 [ksoftirqd/0] root 13 0.1 0.0 0 0 ? I 17:31 0:11 [rcu_sched] root 14 0.0 0.0 0 0 ? S 17:31 0:00 [migration/0] root 15 0.0 0.0 0 0 ? S 17:31 0:00 [idle_inject/ root 16 0.0 0.0 0 0 ? S 17:31 0:00 [cpuhp/0] root 17 0.0 0.0 0 0 ? S 17:31 0:00 [cpuhp/1] root 18 0.0 0.0 0 0 ? S 17:31 0:00 [idle_inject/ root 19 0.0 0.0 0 0 ? S 17:31 0:00 [migration/1] root 20 0.2 0.0 0 0 ? S 17:31 0:20 [ksoftirqd/1] root 22 0.0 0.0 0 0 ? I< 17:31 0:00 [kworker/1:0H root 23 0.0 0.0 0 0 ? S 17:31 0:00 [cpuhp/2] root 24 0.0 0.0 0 0 ? S 17:31 0:00 [idle_inject/ root 25 0.0 0.0 0 0 ? S 17:31 0:00 [migration/2] root 26 0.0 0.0 0 0 ? S 17:31 0:00 [ksoftirqd/2] root 28 0.0 0.0 0 0 ? I< 17:31 0:00 [kworker/2:0H root 29 0.0 0.0 0 0 ? S 17:31 0:00 [cpuhp/3] root 30 0.0 0.0 0 0 ? S 17:31 0:00 [idle_inject/ root 31 0.0 0.0 0 0 ? S 17:31 0:00 [migration/3] root 32 0.0 0.0 0 0 ? S 17:31 0:00 [ksoftirqd/3] root 34 0.0 0.0 0 0 ? I< 17:31 0:00 [kworker/3:0H root 35 0.0 0.0 0 0 ? S 17:31 0:00 [kdevtmpfs] root 36 0.0 0.0 0 0 ? I< 17:31 0:00 [netns] root 37 0.0 0.0 0 0 ? I< 17:31 0:00 [inet_frag_wq root 38 0.0 0.0 0 0 ? S 17:31 0:00 [kauditd] root 39 0.0 0.0 0 0 ? S 17:31 0:00 [khungtaskd] root 40 0.0 0.0 0 0 ? S 17:31 0:00 [oom_reaper] root 41 0.0 0.0 0 0 ? I< 17:31 0:00 [writeback] root 42 0.0 0.0 0 0 ? S 17:31 0:00 [kcompactd0] root 43 0.0 0.0 0 0 ? SN 17:31 0:00 [ksmd] root 44 0.0 0.0 0 0 ? SN 17:31 0:00 [khugepaged] root 91 0.0 0.0 0 0 ? I< 17:31 0:00 [kintegrityd] root 92 0.0 0.0 0 0 ? I< 17:31 0:00 [kblockd] root 93 0.0 0.0 0 0 ? I< 17:31 0:00 [blkcg_punt_b root 94 0.0 0.0 0 0 ? I< 17:31 0:00 [tpm_dev_wq] root 95 0.0 0.0 0 0 ? I< 17:31 0:00 [ata_sff] root 96 0.0 0.0 0 0 ? I< 17:31 0:00 [md] root 97 0.0 0.0 0 0 ? I< 17:31 0:00 [edac-poller] root 98 0.0 0.0 0 0 ? I< 17:31 0:00 [devfreq_wq] root 99 0.0 0.0 0 0 ? S 17:31 0:00 [watchdogd] root 101 0.0 0.0 0 0 ? I< 17:31 0:02 [kworker/0:1H root 103 0.0 0.0 0 0 ? S 17:31 0:00 [kswapd0] root 104 0.0 0.0 0 0 ? S 17:31 0:00 [ecryptfs-kth root 107 0.0 0.0 0 0 ? I< 17:31 0:00 [kthrotld] root 108 0.0 0.0 0 0 ? S 17:31 0:00 [irq/42-pcieh root 110 0.0 0.0 0 0 ? I< 17:31 0:00 [acpi_thermal root 112 0.0 0.0 0 0 ? I< 17:31 0:00 [vfio-irqfd-c root 116 0.0 0.0 0 0 ? I< 17:31 0:00 [mld] root 117 0.0 0.0 0 0 ? I< 17:31 0:00 [ipv6_addrcon root 119 0.0 0.0 0 0 ? I< 17:31 0:02 [kworker/3:1H root 127 0.0 0.0 0 0 ? I< 17:31 0:00 [kstrp] root 130 0.0 0.0 0 0 ? I< 17:31 0:00 [zswap-shrink root 131 0.5 0.0 0 0 ? D< 17:31 0:39 [kworker/u9:0 root 139 0.0 0.0 0 0 ? I< 17:31 0:00 [charger_mana root 161 0.0 0.0 0 0 ? I< 17:31 0:02 [kworker/2:1H root 190 0.0 0.0 0 0 ? I< 17:31 0:00 [kworker/1:1H root 194 0.0 0.0 0 0 ? S 17:31 0:00 [scsi_eh_0] root 197 0.0 0.0 0 0 ? I< 17:31 0:00 [scsi_tmf_0] root 200 0.0 0.0 0 0 ? S 17:31 0:00 [scsi_eh_1] root 202 0.0 0.0 0 0 ? I< 17:31 0:00 [scsi_tmf_1] root 239 0.0 0.0 0 0 ? S 17:31 0:00 [jbd2/sda5-8] root 240 0.0 0.0 0 0 ? I< 17:31 0:00 [ext4-rsv-con root 288 0.0 0.2 50560 18252 ? S<s 17:31 0:01 /lib/systemd/ root 346 0.0 0.0 0 0 ? S< 17:31 0:00 [loop0] root 349 0.0 0.0 0 0 ? S< 17:31 0:00 [loop1] root 350 0.0 0.0 0 0 ? S< 17:31 0:00 [loop2] root 351 0.0 0.0 0 0 ? S< 17:31 0:00 [loop3] root 355 0.0 0.0 0 0 ? S< 17:31 0:00 [loop4] root 363 0.0 0.0 0 0 ? S< 17:31 0:00 [loop5] root 364 0.0 0.0 0 0 ? S< 17:31 0:00 [loop6] root 368 0.0 0.0 0 0 ? S< 17:31 0:00 [loop7] root 377 0.0 0.1 27644 8184 ? Ss 17:31 0:04 /lib/systemd/ root 378 0.0 0.0 0 0 ? S< 17:31 0:00 [loop8] root 379 0.0 0.0 0 0 ? S< 17:31 0:00 [loop9] root 380 0.0 0.0 0 0 ? S< 17:31 0:00 [loop10] root 381 0.0 0.0 0 0 ? S< 17:31 0:00 [loop11] root 382 0.0 0.0 0 0 ? S< 17:31 0:00 [loop12] root 383 0.0 0.0 0 0 ? S< 17:31 0:00 [loop13] root 384 0.0 0.0 0 0 ? S< 17:31 0:00 [loop14] root 385 0.0 0.0 0 0 ? S< 17:31 0:00 [loop15] root 386 0.0 0.0 0 0 ? S< 17:31 0:00 [loop16] root 387 0.0 0.0 0 0 ? S< 17:31 0:00 [loop17] root 388 0.0 0.0 0 0 ? S< 17:31 0:00 [loop18] root 389 0.0 0.0 0 0 ? S< 17:31 0:00 [loop19] root 390 0.0 0.0 0 0 ? S< 17:31 0:00 [loop20] root 391 0.0 0.0 0 0 ? S< 17:31 0:00 [loop21] root 392 0.0 0.0 0 0 ? S< 17:31 0:00 [loop22] root 393 0.0 0.0 0 0 ? S< 17:31 0:00 [loop23] root 394 0.0 0.0 0 0 ? S< 17:31 0:00 [loop24] root 395 0.0 0.0 0 0 ? S< 17:31 0:00 [loop25] root 396 0.0 0.0 0 0 ? S< 17:31 0:00 [loop26] root 397 0.0 0.0 0 0 ? S< 17:31 0:00 [loop27] root 398 0.0 0.0 0 0 ? S< 17:31 0:00 [loop28] root 399 0.0 0.0 0 0 ? S< 17:31 0:00 [loop29] root 400 0.0 0.0 0 0 ? S< 17:31 0:00 [loop30] root 401 0.0 0.0 0 0 ? S< 17:31 0:00 [loop31] root 402 0.0 0.0 0 0 ? S< 17:31 0:00 [loop32] root 403 0.0 0.0 0 0 ? S< 17:31 0:00 [loop33] root 404 0.0 0.0 0 0 ? S< 17:31 0:00 [loop34] root 405 0.0 0.0 0 0 ? S< 17:31 0:00 [loop35] root 406 0.0 0.0 0 0 ? S< 17:31 0:00 [loop36] root 407 0.0 0.0 0 0 ? S< 17:31 0:00 [loop37] root 408 0.0 0.0 0 0 ? S< 17:31 0:00 [loop38] root 409 0.0 0.0 0 0 ? S< 17:31 0:00 [loop39] root 410 0.0 0.0 0 0 ? S< 17:31 0:00 [loop40] root 472 0.0 0.0 0 0 ? S 17:31 0:00 [irq/49-mei_m root 476 0.0 0.0 0 0 ? S 17:31 0:00 [card1-crtc0] root 477 0.0 0.0 0 0 ? S 17:31 0:00 [card1-crtc1] root 478 0.0 0.0 0 0 ? S 17:31 0:00 [card1-crtc2] root 486 0.0 0.0 0 0 ? I< 17:32 0:00 [cryptd] root 512 0.0 0.0 0 0 ? I< 17:32 0:00 [cfg80211] root 571 0.0 0.0 0 0 ? I< 17:32 0:00 [kworker/u9:2 systemd+ 918 0.0 0.1 24044 13256 ? Ss 17:32 0:03 /lib/systemd/ systemd+ 919 0.0 0.0 88160 5940 ? Ssl 17:32 0:00 /lib/systemd/ root 1026 0.0 0.0 2796 1128 ? Ss 17:32 0:00 /usr/sbin/acp avahi 1029 0.0 0.0 9524 5004 ? Ss 17:32 0:00 avahi-daemon: root 1030 0.0 0.0 10424 4976 ? Ss 17:32 0:00 /usr/lib/blue message+ 1031 0.0 0.0 12928 7816 ? Ss 17:32 0:02 @dbus-daemon root 1032 0.0 0.2 410804 19920 ? Ssl 17:32 0:06 /usr/sbin/Net root 1038 0.0 0.0 82564 3608 ? Ssl 17:32 0:00 /usr/sbin/irq root 1051 0.0 0.2 43368 21836 ? Ss 17:32 0:00 /usr/bin/pyth root 1053 0.0 0.1 248212 12536 ? Ssl 17:32 0:00 /usr/libexec/ root 1054 0.0 0.0 238944 6380 ? Ssl 17:32 0:00 /usr/libexec/ syslog 1055 0.0 0.0 223244 6528 ? Ssl 17:32 0:00 /usr/sbin/rsy root 1058 0.0 0.5 1097040 41416 ? Ssl 17:32 0:07 /usr/lib/snap root 1068 0.0 0.1 245536 9472 ? Ssl 17:32 0:00 /usr/lib/acco root 1069 0.0 0.0 13944 3880 ? Ss 17:32 0:00 /usr/sbin/cro root 1070 0.0 0.0 238928 6588 ? Ssl 17:32 0:00 /usr/libexec/ root 1071 0.0 0.1 48456 8532 ? Ss 17:32 0:00 /lib/systemd/ root 1072 0.0 0.0 13256 6212 ? Ss 17:32 0:00 /lib/systemd/ root 1073 0.0 0.1 129608 8920 ? Ssl 17:32 0:02 /usr/sbin/the root 1074 0.0 0.1 396136 14820 ? Ssl 17:32 0:02 /usr/libexec/ root 1075 0.0 0.1 14576 8640 ? Ss 17:32 0:00 /sbin/wpa_sup avahi 1078 0.0 0.0 9240 508 ? S 17:32 0:00 avahi-daemon: root 1180 0.0 0.1 74380 14148 ? Ss 17:32 0:00 /usr/sbin/cup root 1181 0.0 0.3 1552484 24252 ? Ssl 17:32 0:00 /usr/sbin/lib root 1184 0.0 0.3 121040 24372 ? Ssl 17:32 0:00 /usr/bin/pyth root 1195 0.0 0.1 242276 10964 ? Ssl 17:32 0:00 /usr/sbin/Mod root 1212 0.0 0.1 245556 10996 ? Ssl 17:32 0:00 /usr/sbin/gdm root 1251 0.0 0.1 320588 12348 ? Sl 17:32 0:00 gdm-session-w colord 1294 0.0 0.1 249936 14104 ? Ssl 17:32 0:00 /usr/libexec/ clamav 1383 0.0 0.1 130304 15752 ? Ss 17:32 0:01 /usr/bin/fres whoopsie 1386 0.0 0.1 323944 14396 ? Ssl 17:32 0:00 /usr/bin/whoo kernoops 1397 0.0 0.0 12792 432 ? Ss 17:32 0:00 /usr/sbin/ker kernoops 1399 0.0 0.0 12792 432 ? Ss 17:32 0:00 /usr/sbin/ker lp 1460 0.0 0.0 16300 6620 ? S 17:32 0:00 /usr/lib/cups libvirt+ 1480 0.0 0.0 11724 2304 ? S 17:32 0:00 /usr/sbin/dns root 1481 0.0 0.0 11624 540 ? S 17:32 0:00 /usr/sbin/dns root 1515 0.0 0.1 174512 11120 ? Ssl 17:33 0:00 /usr/sbin/cup rv 1558 0.0 0.1 16464 10220 ? Ss 17:33 0:01 /lib/systemd/ rv 1565 0.0 0.0 168888 4376 ? S 17:33 0:00 (sd-pam) rv 1592 0.0 0.0 43908 7296 ? S<sl 17:33 0:00 /usr/bin/pipe rv 1593 0.0 0.0 27640 7080 ? S<sl 17:33 0:00 /usr/bin/pipe rv 1594 0.0 0.2 1934628 20940 ? S<sl 17:33 0:00 /usr/bin/puls rv 1598 0.0 0.0 243480 6828 ? SLl 17:33 0:00 /usr/bin/gnom rv 1603 0.0 0.0 164988 6084 tty2 Ssl+ 17:33 0:00 /usr/libexec/ rv 1605 0.0 0.0 12164 7416 ? Ss 17:33 0:02 /usr/bin/dbus rtkit 1606 0.0 0.0 155756 3888 ? SNsl 17:33 0:00 /usr/libexec/ rv 1615 0.0 0.1 224048 15168 tty2 Sl+ 17:33 0:00 /usr/libexec/ rv 1616 0.0 0.1 243164 8312 ? Ssl 17:33 0:00 /usr/libexec/ rv 1642 0.0 0.0 379020 5672 ? Sl 17:33 0:00 /usr/libexec/ root 1666 0.0 0.0 0 0 ? S< 17:33 0:00 [krfcommd] rv 1673 0.0 0.0 94152 5056 ? Ssl 17:33 0:00 /usr/libexec/ rv 1682 0.0 0.2 593848 17540 ? Ssl 17:33 0:00 /usr/libexec/ rv 1700 0.0 0.0 309376 7416 ? Sl 17:33 0:00 /usr/libexec/ rv 1701 11.6 4.0 5319248 324060 ? Rsl 17:33 13:40 /usr/bin/gnom rv 1709 0.0 0.0 10336 5364 ? S 17:33 0:00 /usr/bin/dbus rv 1773 0.0 0.2 581152 19412 ? Sl 17:33 0:00 /usr/libexec/ rv 1774 0.0 0.0 238884 6040 ? Ssl 17:33 0:00 /usr/libexec/ root 1782 0.0 0.1 252056 9104 ? Ssl 17:33 0:00 /usr/libexec/ rv 1786 0.0 0.3 1008204 26432 ? Ssl 17:33 0:00 /usr/libexec/ rv 1794 0.0 0.0 157228 6160 ? Ssl 17:33 0:00 /usr/libexec/ rv 1816 0.0 0.1 320768 11360 ? Ssl 17:33 0:01 /usr/libexec/ rv 1823 0.0 0.0 316392 7808 ? Ssl 17:33 0:00 /usr/libexec/ rv 1828 0.0 0.0 239288 6680 ? Ssl 17:33 0:00 /usr/libexec/ rv 1831 0.0 0.5 557740 40928 ? Sl 17:33 0:00 /usr/libexec/ rv 1836 0.0 0.3 841692 31004 ? Ssl 17:33 0:00 /usr/libexec/ rv 1849 0.0 0.1 318300 9252 ? Sl 17:33 0:00 /usr/libexec/ rv 1854 0.0 0.3 673176 28684 ? Ssl 17:33 0:00 /usr/libexec/ rv 1856 0.0 0.0 239068 6608 ? Ssl 17:33 0:00 /usr/libexec/ rv 1869 0.0 0.0 240148 6724 ? Ssl 17:33 0:00 /usr/libexec/ root 1878 0.0 0.4 372384 39936 ? Ssl 17:33 0:06 /usr/libexec/ rv 1885 0.0 0.1 317840 8604 ? Sl 17:33 0:00 /usr/libexec/ rv 1896 0.0 0.3 2661852 27640 ? Sl 17:33 0:00 /usr/bin/gjs rv 1898 0.0 0.0 162404 7180 ? Sl 17:33 0:00 /usr/libexec/ rv 1906 0.0 0.0 313248 7032 ? Ssl 17:33 0:00 /usr/libexec/ rv 1907 0.0 0.3 464160 26264 ? Ssl 17:33 0:02 /usr/libexec/ rv 1908 0.0 0.2 376796 16612 ? Ssl 17:33 0:00 /usr/libexec/ rv 1915 0.0 0.1 315388 8328 ? Ssl 17:33 0:00 /usr/libexec/ rv 1916 0.0 0.3 345984 24468 ? Ssl 17:33 0:00 /usr/libexec/ rv 1917 0.0 0.3 933376 28132 ? Ssl 17:33 0:00 /usr/libexec/ rv 1919 0.0 0.3 380384 26872 ? Ssl 17:33 0:00 /usr/libexec/ rv 1921 0.0 0.1 252628 12164 ? Ssl 17:33 0:00 /usr/libexec/ rv 1922 0.0 0.0 460496 6572 ? Ssl 17:33 0:00 /usr/libexec/ rv 1924 0.0 0.0 239064 6352 ? Ssl 17:33 0:00 /usr/libexec/ rv 1927 0.0 0.1 468616 11132 ? Ssl 17:33 0:00 /usr/libexec/ rv 1929 0.0 0.1 388852 8332 ? Ssl 17:33 0:00 /usr/libexec/ rv 1930 0.0 0.1 323924 10280 ? Ssl 17:33 0:00 /usr/libexec/ rv 1931 0.0 0.2 343916 22544 ? Ssl 17:33 0:00 /usr/libexec/ rv 1933 0.0 0.0 232096 7000 ? Sl 17:33 0:00 /usr/libexec/ rv 1934 0.0 0.7 560732 56900 ? Sl 17:33 0:00 /usr/bin/pyth rv 1935 0.0 0.8 799068 67224 ? Sl 17:33 0:00 /usr/libexec/ rv 1946 0.0 0.6 574964 54772 ? Sl 17:33 0:01 /usr/lib/x86_ rv 2033 0.0 0.1 344580 15304 ? Sl 17:33 0:00 /usr/libexec/ rv 2067 0.1 2.3 905752 191752 ? Sl 17:34 0:12 /snap/snap-st rv 2086 0.0 0.0 608316 6848 ? Ssl 17:34 0:00 /usr/libexec/ root 2090 0.0 0.0 4696 2736 ? Ss 17:34 0:00 fusermount -o rv 2178 0.6 1.1 704828 94528 ? SNsl 17:34 0:45 /usr/libexec/ rv 2202 0.0 0.0 167240 7900 ? Ssl 17:34 0:00 /usr/libexec/ rv 2204 0.0 0.3 2735552 27280 ? Sl 17:34 0:00 /usr/bin/gjs rv 2289 0.0 0.1 628036 14764 ? Ssl 17:34 0:00 /usr/libexec/ rv 2293 0.0 0.3 529888 28988 ? Ssl 17:34 0:00 /usr/libexec/ root 2322 0.0 0.3 387872 31452 ? Ssl 17:34 0:01 /usr/libexec/ rv 2795 0.0 0.4 498780 32504 ? Sl 17:34 0:00 update-notifi rv 3097 0.0 0.8 2930244 65476 ? Sl 17:50 0:01 gjs /usr/shar rv 3122 24.4 9.0 13050044 727512 ? Sl 17:50 24:26 /snap/firefox rv 3300 0.0 0.4 202516 35256 ? Sl 17:51 0:00 /snap/firefox rv 3340 0.2 1.4 2445456 115648 ? Sl 17:51 0:12 /snap/firefox rv 3507 0.0 0.3 793892 25600 ? Sl 17:51 0:00 /usr/bin/snap rv 3576 0.0 1.2 2443860 100260 ? Sl 17:51 0:03 /snap/firefox rv 4239 0.9 2.3 2573212 189860 ? Sl 17:59 0:51 /snap/firefox rv 4291 0.1 0.5 338644 47152 ? Sl 17:59 0:06 /snap/firefox rv 4439 0.0 0.6 824144 55596 ? Ssl 18:03 0:02 /usr/libexec/ rv 4457 0.0 0.0 15848 6344 pts/0 Ss 18:03 0:00 bash rv 4960 0.0 1.0 877788 84448 ? Sl 18:08 0:04 /usr/bin/naut rv 5425 1.6 3.3 4791516 271956 ? Sl 18:18 1:13 /snap/atom/28 rv 5429 0.0 0.5 213092 47052 ? S 18:18 0:00 /snap/atom/28 rv 5430 0.0 0.5 213092 47148 ? S 18:18 0:00 /snap/atom/28 rv 5432 0.0 0.1 213092 11220 ? S 18:18 0:00 /snap/atom/28 rv 5443 0.5 0.9 721920 79284 ? Sl 18:18 0:24 /usr/bin/Xway rv 5459 0.0 0.1 392984 12636 ? Sl 18:18 0:03 ibus-daemon - rv 5461 0.0 0.8 578520 65248 ? Ssl 18:18 0:00 /usr/libexec/ rv 5469 0.0 0.0 240092 7416 ? Sl 18:18 0:00 /usr/libexec/ rv 5470 0.0 0.3 350076 28564 ? Sl 18:18 0:02 /usr/libexec/ rv 5472 0.0 0.7 429544 63048 ? Sl 18:18 0:00 /usr/libexec/ rv 5481 0.0 0.0 239996 7664 ? Sl 18:18 0:00 /usr/libexec/ rv 5493 0.0 0.0 166236 7304 ? Sl 18:18 0:00 /usr/libexec/ rv 5538 0.9 0.8 307332 68396 ? Sl 18:18 0:42 /snap/atom/28 rv 5541 0.0 0.6 263392 54264 ? Sl 18:18 0:00 /snap/atom/28 rv 5554 0.0 0.1 230424 12024 ? S 18:18 0:00 /snap/atom/28 rv 5562 6.6 3.8 4839056 308884 ? SLl 18:18 4:50 /snap/atom/28 rv 5622 0.0 1.9 4556096 154052 ? Sl 18:18 0:00 /snap/atom/28 rv 6462 1.5 1.7 2483352 143004 ? Sl 18:22 1:01 /snap/firefox rv 6824 1.8 1.6 2579144 133764 ? Sl 18:28 1:07 /snap/firefox rv 6879 0.9 1.5 2519268 124988 ? Sl 18:29 0:35 /snap/firefox rv 6983 0.5 1.4 2437588 116032 ? Sl 18:30 0:18 /snap/firefox rv 7038 0.0 0.4 71948 38612 pts/0 S+ 18:31 0:01 python manage rv 7040 1.8 0.6 724776 54528 pts/0 Sl+ 18:31 1:05 /home/rv/Envs root 7621 0.0 0.0 0 0 ? I 18:45 0:01 [kworker/u8:1 rv 7922 1.2 2.2 2501944 183140 ? Sl 18:47 0:31 /snap/firefox rv 7928 0.1 1.1 2420780 93984 ? Sl 18:47 0:03 /snap/firefox rv 8040 0.0 1.1 2426164 92624 ? Sl 18:48 0:01 /snap/firefox rv 8370 1.4 1.8 2488628 150672 ? Sl 18:59 0:27 /snap/firefox root 8503 0.7 0.0 0 0 ? I 19:04 0:11 [kworker/1:2- root 8546 0.0 0.0 0 0 ? I 19:06 0:00 [kworker/u8:4 rv 8619 0.4 1.6 2572640 130476 ? Sl 19:06 0:06 /snap/firefox root 8668 0.1 0.0 0 0 ? I 19:07 0:01 [kworker/2:0- rv 8674 0.0 1.2 2422344 98452 ? Sl 19:07 0:01 /snap/firefox root 8755 0.0 0.0 0 0 ? I 19:07 0:00 [kworker/3:2- rv 8765 0.1 1.1 2429268 93780 ? Sl 19:07 0:01 /snap/firefox rv 8770 0.1 1.1 2427320 94588 ? Sl 19:07 0:02 /snap/firefox rv 8856 0.0 1.1 2422092 93028 ? Sl 19:07 0:01 /snap/firefox rv 8860 0.1 1.1 2424420 93896 ? Sl 19:07 0:01 /snap/firefox rv 8942 0.1 1.1 2421348 91192 ? Sl 19:07 0:01 /snap/firefox rv 8945 0.1 1.1 2425176 93340 ? Sl 19:07 0:02 /snap/firefox rv 8991 0.0 1.1 2421604 91644 ? Sl 19:07 0:01 /snap/firefox rv 8999 0.1 1.1 2422132 93184 ? Sl 19:07 0:02 /snap/firefox rv 9068 2.8 2.5 2815840 208980 ? Sl 19:07 0:39 /snap/firefox rv 9154 0.2 1.2 2443844 103260 ? Sl 19:07 0:03 /snap/firefox rv 9187 0.1 1.1 2421828 92704 ? Sl 19:07 0:01 /snap/firefox rv 9196 0.0 1.1 2419260 91968 ? Sl 19:07 0:01 /snap/firefox rv 9200 0.1 1.1 2421312 91276 ? Sl 19:07 0:01 /snap/firefox rv 9269 0.0 1.1 2419296 89892 ? Sl 19:07 0:01 /snap/firefox rv 9332 0.1 1.1 2421308 92024 ? Sl 19:07 0:01 /snap/firefox rv 9433 0.2 1.2 2434688 103424 ? Sl 19:07 0:03 /snap/firefox rv 9464 1.2 1.3 2438496 110484 ? Sl 19:07 0:16 /snap/firefox rv 9517 1.3 1.5 2528580 123920 ? Sl 19:07 0:18 /snap/firefox root 9705 0.0 0.0 0 0 ? I 19:09 0:00 [kworker/0:0- root 9845 0.0 0.0 0 0 ? I 19:10 0:00 [kworker/1:0- rv 10221 3.4 2.6 2583612 211480 ? Sl 19:11 0:40 /snap/firefox root 10603 0.0 0.0 0 0 ? I 19:15 0:00 [kworker/3:0- root 10631 0.0 0.0 0 0 ? I 19:17 0:00 [kworker/u8:0 root 10647 0.1 0.0 0 0 ? I 19:17 0:00 [kworker/2:2- root 10652 0.0 0.0 0 0 ? I 19:17 0:00 [kworker/0:2- rv 10718 0.7 1.8 2477544 146916 ? Sl 19:17 0:05 /snap/firefox rv 10763 0.5 1.8 2486704 150384 ? Sl 19:18 0:04 /snap/firefox rv 10815 0.0 0.9 2411716 74308 ? Sl 19:18 0:00 /snap/firefox root 10911 0.0 0.0 0 0 ? I 19:26 0:00 [kworker/2:1- root 10917 0.0 0.0 0 0 ? I 19:26 0:00 [kworker/0:1- root 10922 0.0 0.0 0 0 ? I 19:26 0:00 [kworker/3:1- rv 10932 0.1 0.9 2411720 74148 ? Sl 19:26 0:00 /snap/firefox root 10975 0.0 0.0 0 0 ? I 19:26 0:00 [kworker/u8:2 rv 11051 0.2 0.9 2411716 74108 ? Sl 19:28 0:00 /snap/firefox root 11104 0.0 0.0 0 0 ? I 19:28 0:00 [kworker/u8:3 root 11108 0.3 0.0 0 0 ? I 19:28 0:00 [kworker/1:1- rv 11192 0.6 0.0 15848 6308 pts/1 Ss 19:30 0:00 bash rv 11202 0.0 0.0 17052 4344 pts/1 R+ 19:30 0:00 ps aux

    Pour avoir PID et PPID , on peut faire ps -ef.

    rv@rv-HP2:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 17:31 ? 00:00:02 /sbin/init splash root 2 0 0 17:31 ? 00:00:00 [kthreadd] ... rv 12008 3122 0 20:37 ? 00:00:00 /snap/firefox/1025/usr/lib/f rv 12542 11946 0 21:06 pts/2 00:00:00 ps -ef

    Pour avoir PID, PPID et STAT en même temps ps ax -ef.

    rv@rv-HP2:~$ ps ax -ef UID PID PPID C STIME TTY STAT TIME CMD root 1 0 0 17:31 ? Ss 0:02 /sbin/init splash root 2 0 0 17:31 ? S 0:00 [kthreadd] ... rv 12008 3122 0 20:37 ? Sl 0:00 /snap/firefox/1025/usr/li root 12219 2 0 20:44 ? I 0:00 [kworker/u8:0-flush-8:0] rv 12660 11946 0 21:10 pts/2 R+ 0:00 ps ax -ef

    Comment est-ce que cela fonctionne ?

    Après ps, on peut formuler des demandes spécifiques.

    • a pour l'option BSD (Berkeley Software Distribution) permettant de voir les processus de tous les utilisateurs, et pas que ceux de l'utilisateur actuel.
    • x pour l'option BSD (Berkeley Software Distribution) permettant de voir même les processus qui ne sont pas liés à un terminal.
    • u pour afficher au format utilisateur.
    • s pour afficher au format signal.
    • -e pour l'option Linux permettant de voir tous les processus de tous les utilisateurs.
    • -f pour un affichage complet.

    12° Un processus doit disparaître. Il passe en STAT Z. Qui peut le faire passer à l'état STAT X ?

    ...CORRECTION...

    Son parent direct.

    On peut configurer ps pour lui faire afficher ce qu'on désire bien entendu. Il faut juste utiliser l'option -o et fournir un string contenant les intitulés des choses à afficher.

    rv@rv-HP2:~$ ps -ef -o "user pid ppid stat start command" USER PID PPID STAT STARTED COMMAND rv 23006 3791 Ss+ 18:36:54 bash GJS_DEBUG_TOPICS=JS ERROR;JS LOG SSH_AUTH_SOCK=/run/use rv 22334 3791 Ss 18:11:15 bash GJS_DEBUG_TOPICS=JS ERROR;JS LOG SSH_AUTH_SOCK=/run/use rv 22990 22334 T 18:36:28 \_ python SHELL=/bin/bash SESSION_MANAGER=local/rv-HP2:@/tm rv 23435 22334 SLl 18:52:17 \_ blender SHELL=/bin/bash SESSION_MANAGER=local/rv-HP2:@/t rv 23498 22334 SLl 18:54:19 \_ blender SHELL=/bin/bash SESSION_MANAGER=local/rv-HP2:@/t rv 23672 22334 R+ 19:02:00 \_ ps -ef -o user pid ppid stat start command SHELL=/bin/ba rv 3799 3791 Ss 08:23:36 bash GJS_DEBUG_TOPICS=JS ERROR;JS LOG SSH_AUTH_SOCK=/run/use rv 3808 3799 S+ 08:23:53 \_ python manage.py runserver SHELL=/bin/bash SESSION_MANAG rv 9087 3808 Sl+ 11:27:21 \_ /home/rv/Envs/siteifa3/bin/python manage.py runserve rv 1498 1144 Ssl+ 08:17:22 /usr/libexec/gdm-x-session --run-script env GNOME_SHELL_SESS rv 1502 1498 Sl+ 08:17:22 \_ /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000 rv 1652 1498 Sl+ 08:17:43 \_ /usr/libexec/gnome-session-binary --systemd --session=ub

    On peut filtrer en cherchant les instances d'un programme spécifique.

    Un exemple où j'ai ouvert blender deux fois de suite pour avoir deux versions du programme à l'écran.

    rv@rv-HP2:~$ blender & [2] 23435 rv@rv-HP2:~$ blender & [3] 23498 rv@rv-HP2:~$ ps -fC blender UID PID PPID C STIME TTY TIME CMD rv 23435 22334 6 18:52 pts/1 00:00:08 blender rv 23498 22334 45 18:54 pts/1 00:00:02 blender

    13° Les deux instances de Blender ont-elles été créées à partir du même endroit ?

    ...CORRECTION...

    Oui car leur PPID est le même : ils ont le même parent.

    4 - Interblocage (deadlock)

    Un interblocage est une situation assez commune dans la vie de tous les jours, notamment sur un carrefour avec priorité à droite : c'est une situation où personne ne peut plus agir à cause du comportement des autres protagonistes.

    Image CC-BY-SA Olivier Lecluse

    En Informatique, cette situation peut se produire si plusieurs processus se bloquent les uns les autres.

    Cela survient principalement à cause des accès aux ressources (écriture sur un fichier, accès à un périphérique n'autorisant pas les utilisateurs multiples...)

    14° Imaginons deux processus 1 et 2 qui pourront exécuter leurs instructions à tour de rôle, une fois le processus 1, puis le 2....

    La ressource A contient "4" initialement et la ressource B contient "2".

    Actions du processus 1

    1. Prendre le contrôle exclusif de la ressource A
    2. Prendre le contrôle exclusif de la ressource B
    3. Rajouter "2" à la fin de la ressource A
    4. Rajouter le contenu de la ressource A dans la ressource B

    Actions du processus 2

    1. Prendre le contrôle exclusif de la ressource A
    2. Prendre le contrôle exclusif de la ressource B
    3. Rajouter "8" à la fin de la ressource B
    4. Rajouter le contenu de la ressource B dans la ressource A

    On commence par exemple avec la première instruction du processus 1 : il prend le contrôle de la ressource A.

    Expliquer si cette situation mènera à un interblocage, ou pas.

    Donner l'ordre des instructions qui pourront s'effectuer jusqu'au blocage ou jusqu'à la fin du déroulement des processus.

    ...CORRECTION...

    15° Même question, seules les instructions changent.

    La ressource A contient "4" initialement et la ressource B contient "2".

    Actions du processus 1

    1. Prendre le contrôle exclusif de la ressource B
    2. Prendre le contrôle exclusif de la ressource A
    3. Rajouter "2" à la fin de la ressource A
    4. Rajouter le contenu de la ressource A à la fin de la ressource B

    Actions du processus 2

    1. Prendre le contrôle exclusif de la ressource A
    2. Prendre le contrôle exclusif de la ressource B
    3. Rajouter "8" à la fin de la ressource B
    4. Rajouter le contenu de la ressource B à la fin de la ressource A

    Expliquer si cette situation est un interblocage, ou pas.

    Donner l'ordre des instructions qui pourront s'effectuer jusqu'au blocage ou jusqu'à la fin du déroulement des processus.

    ...CORRECTION...

    L'interblocage en Informatique peut intervenir dans les cas de demandes circulaires : des ressources aux accès exclusifs sont détenues par des processus différents qui ne peuvent continuer leurs déroulement qu'en accédant à une nouvelle ressource à laquelle ils n'ont pas accès pour le moment. En conséquence, ils attendent tous...

    Cette situation peut survenir en programmation concurrente sous 4 conditions :

    1. Au moins une des ressources en accès exclusif.
    2. Un processus détenant déjà une ressource aura besoin d'un autre ressource (détenue par un autre processus)
    3. Seul le détenteur d'une ressource peut la libérer.
    4. Attente circulaire : Chaque processus attend une ressource détenue par un autre processus.

    5 - FAQ

    tty, pty et pts, c'est quoi ça ?

    Le sigle tty désigne un vrai terminal de commande, en texte et implémenté directement dans le système.

    Le sigle pty désigne un pseudo-terminal de commande, une émulation à travers un autre programme comme ssh pour une connexion à distance ou bash pour un "terminal" à l'intérieur d'une application graphque.

    Le sigle pts désigne un pseudo-terminal slave, une partie d'un pty.

    Processus et Thread, c'est pareil ?

    Non, un processus est bien une instance d'un programme qui sa propre zone mémoire virtuelle.

    Par contre, un processus peut faire tourner à tour de rôle plusieurs petits processus qui partagent sa propre zone mémoire virtuelle. On nomme ces processus légers des threads. Les threads ne sont donc pas des processus autonomes mais font partie d'un processus.

    Chaque processus a son propre espace mémoire virtuelle.

    Un thread est une processus plus léger puisqu'il utilise l'espace mémoire de son parent. Vous verrez dans l'activité suivante qu'il partage aussi son temps d'accès au processeur.

    Activité publiée le 16 05 2021
    Dernière modification : 07 03 2022
    Auteur : ows. h.