Lorsqu'on observe un écran, il apparaît clairement que l'ordinateur mène plusieurs activités en parallèle : une horloge, par exemple, affiche l'heure pendant qu'on utilise un traitement de texte.
Mieux encore, on apprécie de pouvoir imprimer un document tout en continuant à écrire un autre texte.
Ces activités sont gérées, en apparence, simultanément alors que la machine ne dispose que d'un processeur unique. Ces activités échangent des informations: ainsi le traitement de texte déclenche régulièrement une copie sur disque qui sauvegarde le texte écrit.
Sur une même machine tournent donc en permanence plusieurs "tâches" appelées processus, dont la gestion est un des rôles du système d'exploitation.
Un processus est l'ensemble des informations correspondant à l’exécution d’une suite d’instructions par un processeur :
Un processus est donc une instance d'un programme ( au même titre qu'on objet est une instance d'une classe ); un même programme peut donc "tourner" en même temps dans plusieurs processus différents...
Les processus peuvent être créés :
root
.Des processus peuvent être créés à tout moment :
A chaque processus est associé un identifiant unique, son PID ( Process IDentifier ) affecté par le noyau.
Le PID est un entier de 0 à 215 , ou de 0 à 232 sur les systèmes 64 bits.
Le premier processus lancé au démarrage du système, et qui reste actif jusqu'à son extinction, appelé init
, reçoit le numéro 1.
La tache de ce processus est de lancer les autres processus.
Lorsqu'il a été lancé par un autre processus, appelé processus-père, le processus-fils aura donc aussi un numéro de PPID ( Parent Process IDentifier ), c'est à dire le PID du processus père.
Seul le processus init
n'a pas de processus-père, il est à la "racine" de la hiérarchie de tous les autres processus.
Sur un processeur à un seul noyau ne peut s'exécuter qu'un seul processus à la fois.
Le noyau d’un système d’exploitation gère alors l'ordonnancement des processus, c'est à dire le temps-processeur et l'accès aux ressources, qu'il va leur allouer à tour de rôle.
Ce temps dépend de plusieurs facteurs, comme l'algorithme d'ordonnancement utilisé, la priorité donné au processus, la complexité de la tache réalisée par le processus, etc...( voir TP )
L'ensemble des processus peut donc être vu comme des "sous-machines" indépendantes et ne faisant fonctionner qu'un seul programme ( mono-tache ), que le noyau feraient fonctionner à tour de rôle en passant très rapidement de l'une à l'autre pour exécuter tel ou tel travail, ce qui, pour l'utilisateur, donne l'illusion d'un système multi-tâches, c'est à dire exécutant plusieurs processus simultanément ( les processeurs à plusieurs noyaux permettent réellement d'exécuter plusieurs tâches en parallèle ).
Le contexte d'un processus, c'est à dire les zones mémoire contenant son code et ses données, les valeurs sauvegardées des registres processeurs, de la pile exécution, etc... permet de reprendre où elle en était l'exécution d'un processus qui a été interrompue par celle d'un autre.
Différents algorithmes sont utilisés pour gérer l'ordonnancement des processus, et c'est toujours un domaine très actif de recherche !
Un processus passe donc par plusieurs états pendant la durée où il tourne sur le système :
Un processus donné peut utiliser plus ou moins de temps-processeur ou de ressources par rapport aux autres selon la priorité qui lui est affecté
Sous Linux, la priorité est une valeur ( appelée nice
) comprise entre 19 ( la plus petite priorité ) et -20 ( la plus grande priorité).
Par défaut, un processus est lancé avec une valeur nice
de 0; un utilisateur normal peut augmenter la valeur nice
d'un processus, mais seul le super-utilisateur root
peut la diminuer.
Différents commandes existent pour visualiser les processus en cours d'exécution sur une machine Linux :
xclock
ou xcalc
.&
:
user@pc:~$ xclock &
user@pc:~$ xcalc &
Noter qu'à présent, les deux utilitaires "tournent" toujours, mais on a également toujours la main dans le terminal : les processus s'exécutent maintenant en arrière-plan, et le terminal n'attend pas la
fin de leur exécution pour rendre la main à l'utilisateur.
Laisser tourner les utilitaires et ne pas fermer le terminal pour la suite.
pstree
pstree
qui affiche l'arborescence des processus.xclock
et xcalc
.pstree
( pstree -help
), déterminer l'option qui permet d’afficher le propriétaire de chaque branche de processus, et celle qui affiche le
PID de chaque processus.ps
et top
Des informations plus précises sur les processus peuvent être obtenues à l’aide de la commande ps
.
ps
sans argument depuis le même terminal. Lancer un second terminal et recommencer.
Que constate-t-on ?-f
de p
s permet d’afficher plus de détails sur les processus. Tester cette option et interpréter les informations données. Consulter au besoin le manuel
de la commande pour connaître la signification de chaque colonne.Pour un affichage dynamique et interactif de l’ensemble des processus, un troisième outil intéressant est la commande top
. C’est en quelque sorte l’équivalent Unix du « gestionnaire
de tâches » de Windows.
C'est cette commande qui est la plus utile pour gérer les processus et intervenir sur eux, notamment en cas de problème.
top
. Dans quel ordre les processus affichés sont-ils classés ?top
est actif, un appui sur la touche u permet de sélectionner uniquement les processus appartenant à un utilisateur donné. Affichez uniquement vos processus.Les programmes ne fonctionnent pas toujours comme prévu. Un garant important de la stabilité du système est donc de pouvoir mettre fin à l’exécution de processus devenus instables ou ne répondant plus.
Il existe plusieurs méthodes pour mettre fin à des processus récalcitrants.
La commande kill
permet d’envoyer différents types de signaux à un processus dont on connaît l’identifiant (PID). Malgré son nom, et même si c’est son usage principal, elle ne sert pas
seulement à « tuer » un processus. Les signaux les plus courants sont SIGTERM et SIGKILL, qui servent à terminer un processus. D’autres signaux fréquents sont SIGSTOP ( suspension ) et SIGCONT ( reprise ).
La syntaxe d'envoi d'un signal à un processus est : kill -signal PID
, où signal est un numéro ou un nom de signal ( le signal par défaut est SIGTERM ).
-l
de kill
. Repérer les numéros des signaux mentionnés ci-dessus.xclock
préalablement lancé (utilisez l’une des commandes précédentes pour accéder à son PID ).Il existe au moins deux autres techniques pour terminer des processus ( sans compter le fait d’appuyer sur le bouton « fermer » dans le cas d’un processus fenêtré ).
top
.kill
interactif".xclock
et un processus firefox
( par exemple ) avec un &
final : les fenêtres correspondantes s’affichent, et l'on ne perd pas la main
sur le terminal car les processus s'exécutent en arrière-plan. ( le PID du processus déclenché s'affiche ).libreoffice
sans le &
final. LibreOffice fonctionne mais on perd la la main sur le terminal ( processus en
avant-plan ).libreoffice
est alors suspendu : il est toujours en mémoire, mais inactif.kill
. Suspendre le processus firefox
de cette façon, et constater l’effet sur le programme.fg
, puis en pressant la combinaison de touches Ctrl-C correspondant à l’envoi du signal SIGINT.