Connexion élèves

Choisir le(s) module(s) à installer :

Processus

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.

Définitions

Processus

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...

Création des processus

Les processus peuvent être créés :

Des processus peuvent être créés à tout moment :

PID d'un processus

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.

Processus père et processus fils

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.

Gestion des processus

Ordonnancement

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 ).

Ordonnancement des processus

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 !

Cycle de vie d'un processus

Un processus passe donc par plusieurs états pendant la durée où il tourne sur le système :

  • éligible ( prêt ) : le processus est prêt à être exécuté
  • élu ( actif ) : le processus s'exécute sur le processeur
  • bloqué : en attente pendant l'exécution d'un autre processus ou d'une ressource non disponible
Etats d'un processus

Priorité

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.

Visualiser et gérer les processus

Différents commandes existent pour visualiser les processus en cours d'exécution sur une machine Linux :

Lancement de processus : avant-plan et arrière-plan

  1. Lancez quelques programmes depuis l’interface graphique XFCE.
  2. lancer ensuite le terminal, et exécuter les utilitaires xclock ou xcalc.
    Noter que la fenêtre de l'utilitaire s'ouvre, mais que l'on n'a plus la main dans le terminal : l'utilitaire s'exécute en avant-plan; le retour au terminal ne se fait que lors de l'arrêt du processus, c'est à dire ici la fermeture de la fenêtre de l'utilitaire ( noter qu'à ce moment, le PID du processus fermé s'affiche alors dans le Terminal ).
  3. fermer la fenêtre de l’utilitaire, puis lancer les deux programmes successivement en faisant maintenant suivre leur nom du caractère & :
    
    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.

Arborescence des processus : commande pstree

  1. Dans le terminal, tester la commande pstree qui affiche l'arborescence des processus.
  2. Quel est le processus à la "racine" de cette arborescence ?
  3. Repérer dans l’arborescence les processus correspondant aux programmes que vous venez de lancer.
  4. Identifier tous les ancêtres des processus correspondant aux utilitaires xclock et xcalc.
  5. en consultant l'aide de la commande 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.

Informations sur les processus : commandes ps et top

Des informations plus précises sur les processus peuvent être obtenues à l’aide de la commande ps.

  1. Sans fermer les programmes lancés à l’exercice précédent, lancer ps sans argument depuis le même terminal. Lancer un second terminal et recommencer.

    Que constate-t-on ?
    Fermer le second terminal.
  2. L’option -f de ps 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.
  3. Utiliser l'aide pour trouver comment afficher la liste de tous les processus du système.

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.

  1. Lancez la commande top. Dans quel ordre les processus affichés sont-ils classés ?
  2. Quand top est actif, un appui sur la touche u permet de sélectionner uniquement les processus appartenant à un utilisateur donné. Affichez uniquement vos processus.
  3. Cet utilitaire offre un grand nombre de fonctionnalités, comme celle de modifier la colonne de tri, sélectionner les colonnes à afficher, etc.
    Explorer la page de manuel et tester certaines de ces options.

Contrôler l’exécution d’un 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.

Signaux

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 ).

  1. La liste des signaux que l’on peut envoyer aux processus s’obtient grâce à l’option -l de kill. Repérer les numéros des signaux mentionnés ci-dessus.
  2. Teste les signaux mentionnés ci-dessus sur le processus xclock préalablement lancé (utilisez l’une des commandes précédentes pour accéder à son PID ).
  3. Lancer un second terminal. Repérer son identifiant de processus, puis testez les signaux SIGTERM et SIGKILL sur ce processus. Que constate-t-on ?
    Ce comportement illustre le fait que dans certains cas, être « poli » ne suffit pas : SIGTERM demande au processus de s’arrêter ( ce qu’il peut refuser ), tandis que SIGKILL demande au système de le "tuer" ( utile aussi si un programme "ne répond pas"...).
  4. Repérer parmi les processus actifs un processus dont vous n’êtes pas propriétaire, et tenter de le stopper à l’aide du signal SIGSTOP. Que peut-on en déduire ?

Tuer un processus avec style.

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é ).

  1. Lancer deux ou trois processus quelconques depuis le terminal ou l’interface graphique.
  2. Dans un terminal, lancer la commande top.
  3. La touche k permet d’indiquer que l'on souhaite terminer un processus. Il est ensuite demandé de désigner un processus par son identificateur, puis de spécifier un signal à lui envoyer.
    C’est en quelque sorte un "kill interactif".
    Terminer ainsi les programmes qui viennent d'être lancés.

Utiliser le clavier

  1. Depuis un terminal, lancez un processus 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 ).
  2. Depuis un terminal, lancer un processus libreoffice sans le & final. LibreOffice fonctionne mais on perd la la main sur le terminal ( processus en avant-plan ).
  3. Depuis le terminal, presser la combinaison de touche Ctrl-Z, aussi appelée commande de suspension ( suspend ). Quel est le résultat ? Peut-on encore utiliser LibreOffice ? Le processus libreoffice est alors suspendu : il est toujours en mémoire, mais inactif.
  4. La commande Ctrl-Z correspond à l’envoi d’un signal SIGTSTP aux éventuels processus d’avant-plan. Il est donc aussi possible d’envoyer explicitement ce signal grâce à la commande kill. Suspendre le processus firefox de cette façon, et constater l’effet sur le programme.
  5. Terminer chacun des processus en les ramenant à l’avant-plan avec la commande fg, puis en pressant la combinaison de touches Ctrl-C correspondant à l’envoi du signal SIGINT.

Un peu de vocabulaire à retenir

  • Processus : instance d'un programme en cours d’exécution.
    Un processus est décrit par :
    • L’ensemble de la mémoire allouée pour l’exécution de ce programme (ce qui inclut le code exécutable copié en mémoire et toutes les données manipulées par le programme (pile d’exécution))
    • l’ensemble des ressources utilisées (fichiers, connections...)
    • les valeurs stockées dans les registres.
  • État d'un processus : signale si un processus est en cours d'exécution, à l'arrêt, en attente, etc...
  • Ordonnancement : gestion de l’exécution concurrente des processus dans le temps
  • Exécution concurrente : deux processus s’exécutent de manière concurrente si leur exécution se fait en alternance dans le temps; si cette alternance est rapide, l’exécution donne l'illusion de la simultanéité.
    Sur les systèmes mono-processeurs, c'est la seule manière dont les processus peuvent s’exécuter.
  • Exécution parallèle : deux processus s’exécutent de manière parallèle s’ils s’exécutent réellement en même temps.
    Pour que plusieurs processus s’exécutent en parallèle, il faut plusieurs processeurs sur la même machine, ou un processeur multi-cœurs.
Top Linux