Système d'exploitation 2

Nadia GUEALIA

Processus

Processus

Un processus est une abstraction de système d'exploitation qui  regroupe de multiples ressources :

  • Un espace d'adressage
  • Un ou plusieurs threads
  • Fichiers ouverts
  • Sockets
  • Semaphores
  • Régions de mémoire partagées
  • Timers
  • Gestionnaire   de signaux
  • Plusieurs autres informations sur les ressources/états

Toutes ces informations sont regroupées au sein du PCB. Dans Linux, c'est struct task_struct.

Vue d'ensemble des ressources du processus

ls -1 /proc/self/  # ls -1 /proc/<pid>
$ pahole -C task_struct
struct task_struct {/* ... */
	/* PID du processus */
	pid_t pid;

	/* Description de la mémoire virtuelle + table de page */
	struct mm_struct *mm;

	/* Etat du CPU / registres (specifique à la platforme) */
	struct thread_struct thread;

	/* Information sur l''ordonnancement du processus */
	struct sched_info sched_info;

	/* Contient notament la table des descripteur de fichier ainsi
	qu''une liste des descripteurs "close on-exec" */
	struct files_struct *files;

	/* ... (+ de 350 lignes au total) */
};

Identification et Création

/*Identification des Processus*/
#include <unistd.h>

//Data Type: pid_t
pid_t getpid (void)
pid_t getppid (void)

pid_t gettid (void)

/*Création des Processus*/
#include <unistd.h>
pid_t fork (void)

/*ref.     
https://www.gnu.org/software/libc/manual/html_node/Processes.html*/

Exécution d'un fichier

#include <unistd.h>

extern char **environ;

int execl(const char *pathname, const char *arg, ...
                /* (char  *) NULL */);
int execlp(const char *file, const char *arg, ...
                /* (char  *) NULL */);
int execle(const char *pathname, const char *arg, ...
                /*, (char *) NULL, char *const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

Terminaison de processus

La fonction exit permet de terminer un processus à tout moment:

#include <stdlib.h>

       void exit(int status);

Il existe deux constantes souvent utilisées EXIT_SUCCESS et EXIT_FAILURE.

Avant de terminer le processus la fonction exit:

  • ferme les descripteurs de fichiers ouverts (inclus STDIN, STDOUT, STDERR);
  • envoi le signal SIGCHLD au parent pour l’informer de la mort de l’enfant;
  • tous les enfants du processus deviennent enfant du processus 1 (systemd /init), on dit qu’ils sont orphelins;
  • appelle les fonctions enregistrées par atexit (c.f. man).

Il existe d’autres fonction pour terminer un programme

void _exit(int status);//appel système direct,sans appel aux fonction enregistrées avec atexit
void abort(void); // génération d’un core dump

Processus zombies

Si un processus se termine et que son parent ne l'a pas encore attendu, le processus entre dans une sorte d'animation suspendue appelée état zombie : les morts-vivants. Lorsque le parent l'attend enfin, le processus se termine(wait:Diapositive suivante).

Exemple:Processus Zombie

#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() 
{ 
    pid_t child_pid = fork(); 
  
    // process père   
    if (child_pid > 0) 
        sleep(50); 
  
    // processus fils
    else        
        exit(0); //processus fils se termine mais le père est occupé !
  
    return 0; 
} 
# commande pour lister les processus zombies
$ ps axo stat,ppid,pid,comm | grep -w defunct

Exercice

Ecrire un programme qui crée un processus orphan

Attente d'un processus

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *wstatus);

pid_t waitpid(pid_t pid, int *wstatus, int options);

int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
	

État d'achèvement du processus

/* man wait*/
Macro: int WEXITSTATUS (int status)

    Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

    If WIFEXITED is true of status, this macro returns the low-order 8 bits of the exit status value from the child process. See Exit Status. 

Macro: int WIFSIGNALED (int status)

    Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

    This macro returns a nonzero value if the child process terminated because it received a signal that was not handled. See Signal Handling. 

Macro: int WTERMSIG (int status)

    Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

    If WIFSIGNALED is true of status, this macro returns the signal number of the signal that terminated the child process. 

Macro: int WCOREDUMP (int status)

    Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

    This macro returns a nonzero value if the child process terminated and produced a core dump. 

Macro: int WIFSTOPPED (int status)

    Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

    This macro returns a nonzero value if the child process is stopped. 

Macro: int WSTOPSIG (int status)

    Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

    If WIFSTOPPED is true of status, this macro returns the signal number of the signal that caused the child process to stop. 

TP1

TP1: EXO1

TP1: Solution

$ man ps

PS(1)                                  Commandes de l'utilisateur                                 PS(1)

NOM
       ps - Présenter un cliché instantané des processus en cours

SYNOPSIS
       ps [options]

DESCRIPTION
       ps displays information about a selection of the active processes. If you want a repetitive
       update of the selection and the displayed information, use top instead.

       Cette version de ps accepte plusieurs types d'options :

       1   les options UNIX qui peuvent être regroupées et qui doivent être précédées d'un tiret ;
       2   les options BSD qui peuvent être regroupées et qui ne doivent pas être utilisées avec un
           tiret ;
       3   les options GNU de forme longue qui doivent être précédées de deux tirets.

       Les options de différents types peuvent être mélangées, mais des conflits peuvent apparaître.
       Certaines options sont synonymes (fonctionnellement identiques) à cause des différentes normes
       et implémentations de ps avec lesquelles ce ps est compatible.

       Note that ps -aux is distinct from ps aux. The POSIX and UNIX standards require that ps -aux
       print all processes owned by a user named x, as well as printing all processes that would be
       selected by the -a option. If the user named x does not exist, this ps may interpret the command
       as ps aux instead and print a warning. This behavior is intended to aid in transitioning old
       scripts and habits. It is fragile, subject to change, and thus should not be relied upon.

       Par défaut, ps sélectionne tous les processus avec le même identifiant utilisateur effectif
       (euid=EUID) que l'utilisateur en cours et associés au même terminal que l'appelant. Il affiche
       l'identifiant de processus (pid=PID), le terminal associé au processus (tname=TTY), le temps CPU
       cumulé au format [JJ-]HH:MM:SS (time=TIME) et le nom de l'exécutable (ucmd=CMD). La sortie n'est
       pas ordonnée par défaut.

       L'utilisation d'options « à la BSD » ajoutera l'état du processus (stat=STAT) à l'affichage par
       défaut et montrera les arguments de commande (args=COMMAND) au lieu du nom de l'exécutable. La
       variable d'environnement PS_FORMAT permet de modifier ce comportement. L'utilisation d'options
       « à la BSD » modifiera également la sélection de processus pour inclure les processus d'autres
       terminaux (TTY) vous appartenant ; autrement dit, il s'agit de la sélection de tous les
       processus, filtrés pour exclure les processus appartenant aux autres utilisateurs ou en dehors
       d'un terminal. Ces effets ne sont pas pris en compte pour les options décrites ci-dessous comme
       « identiques », donc -M sera considérée identique à Z et ainsi de suite.

       Aux exceptions près décrites ci-dessous, les options de sélection de processus sont cumulatives.
       La sélection par défaut est supprimée, puis les processus sélectionnés sont ajoutés à l'ensemble
       des processus à afficher. Un processus sera donc montré s'il satisfait n'importe quel critère de
       sélection donné.

EXEMPLES
       Pour voir tous les processus du système en utilisant la syntaxe traditionnelle :
          ps -e
          ps -ef
          ps -eF
          ps -ely

       Pour voir tous les processus du système en utilisant la syntaxe BSD :
          ps ax
          ps axu

       Pour afficher une arborescence des processus :
          ps -ejH
          ps axjf

       Pour obtenir des renseignements sur les processus légers (« threads ») :
          ps -eLf
          ps axms

       Pour obtenir des renseignements de sécurité :
          ps -eo euser,ruser,suser,fuser,f,comm,label
          ps axZ
          ps -eM

       Pour voir tous les processus exécutés en tant que superutilisateur (identifiant réel et
       effectif) au format utilisateur :
          ps -U root -u root u

       Pour voir tous les processus avec un format défini par l'utilisateur :
          ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
          ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
          ps -Ao pid,tt,user,fname,tmout,f,wchan

       N'afficher que le PID de syslogd :
          ps -C syslogd -o pid=

       Afficher uniquement le nom du PID 42 :
          ps -q 42 -o comm=

SÉLECTION SIMPLE DES PROCESSUS
       a      Lever la restriction « seulement vous » du style BSD, qui est imposée sur l'ensemble des
              processus si des options « à la BSD » (sans « - ») sont utilisées ou si la personnalité
              de ps est configurée « à la BSD ». L'ensemble des processus sélectionnés de cette façon
              est ajouté à l'ensemble des processus sélectionnés autrement. Autrement dit, cette option
              conduit ps à énumérer tous les processus avec un terminal (tty) ou énumérer tous les
              processus lorsqu'elle est utilisée avec l'option x.

       -A     Sélectionner tous les processus. Identique à -e.

       -a     Sélectionner tous les processus sauf les meneurs de session (consultez getsid(2)) et les
              processus non associés à un terminal.

       -d     Sélectionner tous les processus sauf les meneurs de session.

       --deselect
              Sélectionner tous les processus sauf ceux qui remplissent les conditions indiquées
              (inverse la sélection). Identique à -N.

       -e     Sélectionner tous les processus. Identique à -A.

       g      Vraiment tout, même les meneurs de session. Cette option est obsolète et peut disparaître
              des prochaines publications. Elle est normalement implicite avec l'option a, et n'est
              utile qu'en fonctionnement avec la personnalité sunos4.

       -N     Sélectionner tous les processus sauf ceux qui remplissent les conditions indiquées
              (inverse la sélection). Identique à --deselect.

       T      Sélectionner tous les processus associés à ce terminal. Identique à l'option t sans autre
              paramètre.

       r      Restreindre la sélection aux processus en cours d'exécution.

       x      Lever la restriction « doit avoir un terminal » du style BSD, qui est imposée sur
              l'ensemble des processus si des options « à la BSD » (sans « - ») sont utilisées ou si la
              personnalité de ps est configurée « à la BSD ». L'ensemble des processus sélectionnés de
              cette façon est ajouté à l'ensemble des processus sélectionnés autrement. Autrement dit,
              cette option conduit ps à énumérer tous les processus vous appartenant (même EUID que ps)
              ou énumérer tous les processus lorsqu'elle est utilisée avec l'option a.

SÉLECTION DES PROCESSUS PAR UNE LISTE
       Ces options acceptent un unique paramètre sous forme de liste séparée par des blancs ou des
       virgules. Elles peuvent être utilisées plusieurs fois. Par exemple : ps -p "1 2" -p 3,4.

       -123   Identique à --pid 123.

       123    Identique à --pid 123.

       -C liste_commandes
              Sélectionner par nom de commande. Cela sélectionne les processus dont le nom d'exécutable
              figure dans liste_commandes. REMARQUE : le nom de la commande n'est pas le même que le
              nom sur la ligne de commande. Les anciennes versions de procps et du noyau réduisaient ce
              nom de commande à 15 caractères. Cette limite n'existe plus. Si vous faisiez une
              recherche sur 15 caractères seulement, il se peut que votre recherche ne donne plus de
              résultats.

       -G liste_groupes
              Sélectionner par nom ou identifiant de groupe réel (RGID). Cela sélectionne les processus
              dont l'identifiant ou nom de groupe réel est dans liste_groupes. Le RGID identifie le
              groupe de l'utilisateur qui a créé le processus, consultez getgid(2).

       -g liste_groupes
              Sélectionner par session ou nom de groupe effectif. La sélection par session est précisée
              par plusieurs normes, mais la sélection par groupe effectif est le comportement logique
              utilisé par de nombreux autres systèmes d'exploitation. Ce ps sélectionnera par session
              quand la liste est complètement numérique (comme le sont les sessions). Les GID
              numériques fonctionneront seulement quand des noms de groupes sont également indiqués.
              Consultez les options -s et --group.

       --Group liste_groupes
              Sélectionner par identifiant de groupe réel (RGID) ou nom. Identique à -G.

       --group liste_groupes
              Sélectionner par identifiant de groupe effectif (EGID) ou nom. Cela sélectionne les
              processus dont l'identifiant ou nom de groupe effectif est dans liste_groupes. L'EGID
              identifie le groupe dont les droits d'accès au fichier sont utilisés par le processus,
              consultez getegid(2). L'option -g est souvent une alternative à --group.

       p liste_pid
              Sélectionner par identifiant de processus (PID). Identique à -p et --pid.

       -p liste_pid
              Sélectionner par PID. Cela sélectionne les processus dont l'identifiant de processus
              apparaît dans liste_pid. Identique à p et --pid.

       --pid liste_pid
              Sélectionner par identifiant de processus (PID). Identique à -p et p.

       --ppid liste_pid
              Sélectionner par PID parent. Cela sélectionne des processus dont le PID parent est dans
              liste_pid. Autrement dit, il sélectionne les processus enfants de ceux indiqués dans
              liste_pid.

       q liste_pid
              Sélectionner par identifiant de processus (PID). Identique à -q et --quick-pid.

       -q liste_pid
              Sélectionner par PID (mode rapide). Cela sélectionne les processus dont le numéro
              d'identifiant figure dans liste_pid. Avec cette option, ps ne lit les informations
              nécessaires que pour les PID se trouvant dans liste_pid et il n'applique aucune règle de
              filtrage supplémentaire. Les PID ne sont pas triés et ils sont préservés. Dans ce mode,
              aucune option de sélection supplémentaire, aucun tri ou listage en arborescence n'est
              possible. Identique à q et --quick-pid.

       --quick-pid liste_pid
              Sélectionner par identifiant de processus (PID). Identique à -q et q.

       -s liste_sessions
              Sélectionner par identifiant de session. Cela sélectionne les processus dont
              l'identifiant de session est indiqué dans liste_sessions.

       --sid liste_sessions
              Sélectionner par identifiant de session. Identique à -s.

       t liste_ttys
              Sélectionner par terminal (tty). Quasiment identique à -t et --tty, mais peut également
              être utilisé avec une liste_ttys vide pour indiquer le terminal associé à ps.
              L'utilisation de l'option T est considérée plus propre que l'utilisation de t avec une
              liste_ttys vide.

       -t liste_ttys
              Sélectionner par tty. Cela sélectionne les processus associés aux terminaux donnés dans
              liste_ttys. Les terminaux (ttys, ou écrans pour sortie texte) peuvent être indiqués sous
              différentes formes : /dev/ttyS1, ttyS1, S1. Un simple « - » permet de sélectionner les
              processus qui ne sont pas attachés à un terminal.

       --tty liste_ttys
              Sélectionner par terminal. Identique à -t et t.

       U liste_utilisateurs
              Sélectionner par identifiant d'utilisateur effectif (EUID) ou nom. Cela sélectionne les
              processus dont l'identifiant ou nom d'utilisateur effectif est dans liste_utilisateurs.
              L'EUID identifie l'utilisateur dont les droits d'accès au fichier sont utilisés par le
              processus, consultez geteuid(2). Identique à -u et --user.

       -U liste_utilisateurs
              Sélectionner par identifiant d'utilisateur réel (RUID) ou nom. Cela sélectionne les
              processus dont l'identifiant ou nom d'utilisateur réel est dans liste_utilisateurs. Le
              RUID identifie l'utilisateur qui a créé le processus, consultez getuid(2).

       -u liste_utilisateurs
              Sélectionner par identifiant d'utilisateur effectif (EUID) ou nom. Cela sélectionne les
              processus dont le nom ou l'identifiant d'utilisateur effectif est dans
              liste_utilisateurs.

              L'EUID identifie l'utilisateur dont les droits d'accès au fichier sont utilisés par le
              processus, consultez geteuid(2). Identique à U et --user.

       --User liste_utilisateurs
              Sélectionner par identifiant d'utilisateur réel (RUID) ou nom. Identique à -U.

       --user liste_utilisateurs
              Sélectionner par identifiant d'utilisateur effectif (EUID) ou nom. Identique à -u et U.

CONTRÔLE DU FORMAT DE SORTIE
       Ces options sont utilisées pour choisir les renseignements affichés par ps. La sortie peut
       changer en fonction de la personnalité.

       -c     Montrer des renseignements d'ordonnanceur différents pour l'option -l.

       --context
              Afficher au format du contexte de sécurité (pour SELinux).

       -f     Faire une liste au format complet. Cette option peut être combinée aux nombreuses autres
              options « à la UNIX » pour ajouter des colonnes supplémentaires. Cela conduit également à
              afficher les paramètres de la commande. Lorsqu'elle est utilisée avec -L, les colonnes
              NLWP (nombre de processus légers) et LWP (identifiant de processus léger) seront
              ajoutées. Consultez l'option c et les mots-clés de format args et comm.

       -F     Format complet étendu. Consultez l'option -f, implicite avec -F.

       --format format
              Format défini par l'utilisateur. Identique à -o et o.

       j      Format BSD de contrôle des tâches.

       -j     Format des tâches.

       l      Afficher au format BSD long.

       -l     Format long. L'option -y est souvent utile en complément.

       -M     Afficher une colonne de données de sécurité. Identique à Z (pour SELinux).

       O format
              o préchargé (surchargé). L'option BSD O peut se comporter comme -O (format de sortie
              défini par l'utilisateur avec quelques champs communs prédéfinis) ou être utilisée pour
              indiquer un ordre de tri. Les paramètres sont utilisés pour déterminer le comportement de
              cette option. Pour s'assurer que le comportement voulu soit obtenu (tri ou formatage),
              indiquer cette option d'une autre façon (par exemple avec -O ou --sort). Identique à -O
              quand utilisée comme option de formatage, avec la personnalité BSD.

       -O format
              Comme -o, mais préchargé avec quelques colonnes par défaut. Identique à
              -o pid,format,state,tname,time,command ou -o pid,format,tname,time,cmd, consultez -o
              ci-dessous.

       o format
              Indiquer un format défini par l'utilisateur. Identique à -o et --format.

       -o format
              Format défini par l'utilisateur. format est un paramètre unique sous forme de liste
              séparée par des blancs ou des virgules, qui permet d'indiquer des colonnes de sorties
              individuelles. Les mots-clés reconnus sont décrits ci-dessous dans la section INDICATEURS
              DE FORMAT STANDARDS. Les en-têtes peuvent êtres renommés
              (ps -o pid,ruser=RealUser -o comm=Command) si besoin. Si tous les en-têtes de colonnes
              sont vides (ps -o pid= -o comm=), la ligne d'en-têtes ne sera pas affichée. La largeur de
              colonne augmentera si de larges en-têtes l'exigent ; ce peut être utilisé pour élargir
              des colonnes comme WCHAN (ps -o pid,wchan=WIDE-WCHAN-COLUMN -o comm). Un contrôle
              explicite de la largeur (ps opid,wchan:42,cmd) est également possible. Le comportement de
              ps -o pid=X,comm=Y change avec les personnalités ; la sortie peut être une colonne
              appelée « X,comm=Y » ou deux colonnes appelées « X » et « Y ». Utilisez plusieurs options
              -o pour dissiper les doutes. Utilisez la variable d'environnement PS_FORMAT pour indiquer
              une valeur par défaut ; DefSysV et DefBSD sont des macros qui peuvent être utilisées pour
              choisir les colonnes UNIX ou BSD par défaut.

       s      Afficher au format de signal.

       u      Afficher au format orienté utilisateur.

       v      Afficher au format de mémoire virtuelle.

       X      Format de registre.

       -y     Ne pas montrer d'indicateurs ; montrer rss au lieu de addr. Cette option ne peut être
              utilisée qu'avec -l.

       Z      Afficher une colonne de données de sécurité. Identique à -M (pour SELinux).

MODIFICATEURS DE SORTIE
       c      Montrer les vrais noms de commande. Cela vient du nom de fichier exécutable, plutôt que
              de la valeur argv. Les paramètres de la commande et leurs modifications éventuelles ne
              sont donc pas montrés. Cette option transforme en fait le mot-clé de format args en
              comm ; c'est pratique pour l'option de format -f et avec toutes les options de format « à
              la BSD », qui entraînent normalement toutes un affichage des paramètres de la commande.
              Consultez l'option -f et les mots-clés de format args et comm.

       --cols n
              Configurer la largeur de l'écran.

       --columns n
              Configurer la largeur de l'écran.

       --cumulative
              Inclure des données sur les processus enfants tués (comme une somme avec le parent).

       e      Montrer l'environnement après la commande.

       f      Hiérarchie des processus en ASCII art (arborescence).

       --forest
              Arborescence des processus en ASCII art.

       h      Sans en-tête (ou avec un en-tête par écran en personnalité BSD). L'option h est
              problématique. Le ps standard de BSD utilise cette option pour afficher un en-tête sur
              chaque page de sortie, mais l'ancien ps de Linux utilise cette option pour désactiver
              l'en-tête. Cette version de ps suit l'habitude de Linux de ne pas afficher l'en-tête sauf
              si la personnalité BSD a été choisie, auquel cas elle affiche un en-tête sur chaque page
              de sortie. Quelle que soit la personnalité utilisée, les options longues --headers et
              --no-headers permettent respectivement d'activer l'affichage des en-têtes sur chaque page
              ou de désactiver complètement les en-têtes.

       -H     Montrer la hiérarchie des processus (arborescence).

       --headers
              Répéter les lignes d'en-tête, une par page de sortie.

       k spec Indiquer l'ordre de tri. La syntaxe de tri est [+|-]clé.RB [,[ + | - ].clé IR [,...]]..
              Choisissez une clé multicaractère de la section INDICATEURS DE FORMAT STANDARDS. Le « + »
              est facultatif puisque l'ordre numérique ou lexicographique est croissant par défaut.
              Identique à --sort.

                      Exemples :
                      ps jaxkuid,-ppid,+pid
                      ps axk comm o comm,args
                      ps kstart_time -ef

       --lines n
              Configurer la hauteur de l'écran.

       n      Sortie numérique pour WCHAN et USER (incluant tous les types d'UID et GID).

       --no-headers
              Ne pas afficher d'en-tête du tout. --no-heading est un alias pour cette option.

       O order
              Ordre de tri (surchargé). L'option BSD O peut se comporter comme -O (format de sortie
              défini par l'utilisateur avec quelques champs communs prédéfinis) ou peut être utilisée
              pour indiquer un ordre de tri. Les paramètres sont utilisés pour déterminer le
              comportement de cette option. Pour s'assurer que le comportement voulu soit obtenu (tri
              ou formatage), indiquer cette option d'une autre façon (par exemple avec -O ou --sort).

              Pour trier, la syntaxe de l'option BSD obsolète est « O[+|-]k1[,[+|-]k2[,...]] ». L'ordre
              de la liste de processus est effectué en fonction de l'ordre multiniveau indiqué par la
              suite de clés courtes à une lettre k1, k2, etc., décrites ci-dessous dans la section CLÉS
              DE TRI OBSOLÈTES. Le « + » actuellement facultatif réitère simplement l'ordre par défaut
              d'une clé, mais permet également de distinguer un O de tri d'un O de formatage. Le « - »
              inverse uniquement l'ordre de la clé qu'il précède.

       --rows n
              Configurer la hauteur de l'écran.

       S      Résumer quelques renseignements, comme l'utilisation CPU, à partir des processus enfants
              tués dans leur parent. C'est pratique pour observer un système où les processus parents
              engendrent des processus enfants de courte durée de vie pour faire leur travail.

       --sort spec
              Indiquer l'ordre de tri. La syntaxe de tri est « [+|-]clé[,[+|-]clé[,...]] ». Choisir une
              clé multicaractère de la section INDICATEURS DE FORMAT STANDARDS. Le « + » est facultatif
              puisque l'ordre numérique ou lexicographique est croissant par défaut. Identique à k. Par
              exemple : ps jax --sort=uid,-ppid,+pid.

       w      Sortie large. Utilisez cette option deux fois pour une largeur illimitée.

       -w     Sortie large. Utilisez cette option deux fois pour une largeur illimitée.

       --width n
              Configurer la largeur de l'écran.

AFFICHAGE DE PROCESSUS LÉGERS (« THREAD »)
       H      Montrer les processus légers comme s'ils étaient des processus.

       -L     Montrer les processus légers, si possible avec les colonnes LWP et NLWP.

       m      Montrer les processus légers après les processus.

       -m     Montrer les processus légers après les processus.

       -T     Montrer les processus légers, si possible avec la colonne SPID.

AUTRES RENSEIGNEMENTS
       --help section
              Print a help message. The section argument can be one of simple, list, output, threads,
              misc, or all. The argument can be shortened to one of the underlined letters as in:
              s|l|o|t|m|a.

       --info Afficher des informations de débogage.

       L      Afficher la liste de tous les indicateurs de format.

       V      Afficher la version de procps-ng.

       -V     Afficher la version de procps-ng.

       --version
              Afficher la version de procps-ng.

NOTES
       Ce ps fonctionne en lisant les fichiers virtuels de /proc. Ce ps n'a pas besoin d'être Set-UID
       kmem et ne nécessite aucun privilège pour fonctionner. Ne pas donner de permissions
       particulières à ce ps.

       L'utilisation CPU est actuellement exprimée en pourcentage de temps passé à fonctionner pendant
       le temps de vie complet d'un processus. Ce n'est ni idéal, ni conforme aux normes par ailleurs
       respectées par ps. Il est peu probable que la somme d'utilisations CPU soit exactement égale à
       100 %.

       Les champs SIZE et RSS ne comptent pas certaines parties d'un processus comme les tables de
       pages, la pile du noyau, la structure thread_info, et la structure task_struct. Cela représente
       au moins 20 Kio de mémoire toujours résidente. SIZE est la taille virtuelle du processus
       (code + données + pile).

       Les processus marqués <defunct> sont les processus tués (appelés « zombies ») qui restent parce
       que leur parent ne les a pas détruits proprement. Ces processus seront détruits par init(8) si
       le processus parent se termine.

       If the length of the username is greater than the length of the display column, the username
       will be truncated. See the -o and -O formatting options to customize length.

       Commands options such as ps -aux are not recommended as it is a confusion of two different
       standards. According to the POSIX and UNIX standards, the above command asks to display all
       processes with a TTY (generally the commands users are running) plus all processes owned by a
       user named x. If that user doesn't exist, then ps will assume you really meant ps aux.

INDICATEURS DE PROCESSUS
       La somme de ces valeurs est affichée dans la colonne « F », fournie par l'indicateur de sortie
       flags :

               1    engendré mais pas exécuté ;
               4    a utilisé des privilèges de superutilisateur ;

CODES D'ÉTAT DE PROCESSUS
       Voici les différentes valeurs que les indicateurs de sortie s, stat et state (en-tête « STAT »
       ou « S ») afficheront pour décrire l'état d'un processus :

               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 ;
               t    arrêté par le débogueur lors du traçage ;
               W    pagination (non valable depuis le noyau 2.6.xx) ;
               X    tué (ne devrait jamais être vu) ;
               Z    processus zombie (<defunct>), terminé mais pas détruit par son parent.

       Pour les formats BSD et quand le mot-clé stat est utilisé, les caractères supplémentaires
       suivants peuvent être affichés :

               <    haute priorité (non poli pour les autres utilisateurs) ;
               N    basse priorité (poli pour les autres utilisateurs) ;
               L    avec ses pages verrouillées en mémoire (pour temps réel et entrées et sorties
                    personnalisées) ;
               s    meneur de session ;
               l    possède plusieurs processus légers (« multi-thread », utilisant CLONE_THREAD comme
                    NPTL pthreads le fait) ;
               +    dans le groupe de processus au premier plan.

CLÉS DE TRI OBSOLÈTES
       Ces clés sont utilisées par l'option BSD O (quand elle est utilisée pour trier). L'option GNU
       --sort n'utilise pas ces clés, mais celles décrites ci-dessous dans la section INDICATEURS DE
       FORMAT STANDARDS. Remarquez que les valeurs utilisées pour le tri sont les valeurs internes que
       ps utilise et non les valeurs « trafiquées » utilisées dans certains champs de format de sortie
       (par exemple trier sur tty ordonnera par numéro de périphérique, pas en fonction du nom de
       terminal affiché). Envoyer la sortie de ps dans un tube (« pipe ») vers la commande sort(1)
       permet d'obtenir un tri selon les valeurs trafiquées.

       CLÉ   LONGUE       DESCRIPTION
       c     cmd          juste le nom de l'exécutable
       C     pcpu         utilisation du CPU
       f     attributs    indicateurs comme le champ F du format long
       g     pgrp         GID du processus
       G     tpgid        GID du processus contrôlant le tty
       j     cutime       temps utilisateur cumulé
       J     cstime       temps système cumulé
       k     utime        temps utilisateur
       m     min_flt      nombre de défauts de page mineurs
       M     maj_flt      nombre de défauts de page majeurs
       n     cmin_flt     défauts de page mineurs cumulés
       N     cmaj_flt     défauts de page majeurs cumulés
       o     session      identifiant de session
       p     pid          identifiant de processus (PID)
       P     ppid         PID du processus parent
       r     rss          taille de mémoire résidente
       R     resident     pages résidentes
       s     size         taille mémoire en kilooctets
       S     share        nombre de pages partagées
       t     tty          numéro de périphérique du tty contrôlant
       T     start_time   heure de démarrage du processus
       U     uid          identifiant utilisateur (UID)
       u     user         nom d'utilisateur
       v     vsize        taille totale de mémoire virtuelle en kibioctets
       y     priority     priorité d'ordonnancement du noyau

DESCRIPTEURS DE FORMAT AIX
       Ce ps prend en charge les descripteurs de format AIX, qui fonctionnent un peu comme les codes de
       formatage de printf(1) et printf(3). Par exemple, la sortie normale par défaut peut être
       produite ainsi : ps -eo "%p %y %x %c". Les codes STANDARD sont décrits dans la section suivante.

       CODE   STANDARD   EN-TÊTE
       %C     pcpu       %CPU
       %G     group      GROUP
       %P     ppid       PPID
       %U     user       USER

       %a     args       COMMAND
       %c     comm       COMMAND
       %g     rgroup     RGROUP
       %n     nice       NI
       %p     pid        PID
       %r     pgid       PGID
       %t     etime      ELAPSED
       %u     ruser      RUSER
       %x     time       TIME
       %y     tty        TTY
       %z     vsz        VSZ

INDICATEURS DE FORMAT STANDARDS
       Voici les différents mots-clés pouvant être utilisés pour contrôler le format de sortie (par
       exemple avec l'option -o) ou pour trier les processus sélectionnés avec l'option « à la GNU »
       --sort.

       Par exemple : ps -eo pid,user,args --sort user

       Cette version de ps essaye de reconnaître la plupart des mots-clés utilisés avec les autres
       implémentations de ps.

       Les indicateurs suivants de format définis par l'utilisateur peuvent contenir des espaces :
       args, cmd, comm, command, fname, ucmd, ucomm, lstart, bsdstart, start.

       Certains mots-clés peuvent être indisponibles pour le tri.

       CODE        EN-TÊTE   DESCRIPTION

       %cpu        %CPU      Utilisation CPU du processus exprimée avec un chiffre après la virgule.
                             Actuellement, il s'agit du temps passé à fonctionner divisé par le temps
                             de vie du processus (rapport cputime/realtime), exprimé en pourcentage. La
                             somme ne dépassera pas 100 % sauf si vous êtes chanceux (alias pcpu).

       %mem        %MEM      Rapport entre la taille de mémoire résidente (« resident set size » ou
                             RSS) et la mémoire physique de la machine, exprimé en pourcentage (alias
                             pmem).

       args        COMMAND   Commande avec tous ses arguments sous forme de chaîne. Les modifications
                             aux arguments peuvent être montrées. Les éléments de cette colonne peuvent
                             contenir des espaces. Un processus marqué <defunct> est partiellement tué,
                             en attendant d'être entièrement détruit par son parent. La valeur args est
                             parfois indisponible pour le processus, dans ce cas, ps affichera à la
                             place le nom de l'exécutable entre crochets (alias cmd, command).
                             Consultez aussi le mot-clé de format comm et les options -f et c.
                             Lorsque indiquée en dernier, cette colonne sera élargie jusqu'aux bords de
                             l'affichage. Si ps ne peut pas déterminer la largeur de l'affichage, comme
                             quand la sortie est renvoyée (dans un tube, « pipe ») vers un fichier ou
                             une autre commande, la largeur de sortie n'est pas définie (elle peut être
                             de 80 caractères, illimitée, déterminée par la variable TERM, etc.) La
                             variable d'environnement COLUMNS ou l'option --cols permettent de
                             déterminer avec exactitude la largeur dans ce cas. Les options w ou -w
                             peuvent également être utilisées pour adapter la largeur.

       blocked     BLOCKED   Masque des signaux bloqués, consultez signal(7). Suivant la largeur du
                             champ, un masque de 32 ou 64 bits au format hexadécimal est affiché (alias
                             sig_block, sigmask).

       bsdstart    START     Heure de démarrage du processus. Si le processus a été démarré dans les
                             dernières 24 heures, le format de sortie est «  HH:MM », sinon il est
                             « Mmm JJ » (où « Mmm » représente les trois premières lettres du mois, en
                             anglais). Consultez aussi lstart, start, start_time et stime.

       bsdtime     TIME      Temps CPU cumulé, utilisateur plus système. Le format d'affichage est
                             normalement « MMM:SS », mais peut être déplacé vers la droite si des
                             processus ont cumulé plus de 999 minutes de temps CPU.

       c           C         Utilisation du processeur. C'est pour l'instant la partie entière du
                             pourcentage d'utilisation par rapport au temps de vie du processus
                             (consultez %cpu).

       caught      CAUGHT    Masque des signaux bloqués, consultez signal(7). Suivant la largeur du
                             champ, un masque de 32 ou 64 bits au format hexadécimal (alias sig_catch,
                             sigcatch).

       cgname      CGNAME    Afficher les groupes de contrôle auxquels appartient le processus.

       cgroup      CGROUP    Afficher les groupes auxquels appartient le processus.

       class       CLS       Classe d’ordonnancement du processus (alias policy,cls). Les valeurs
                             possibles du champ sont :

                                      -   non signalé
                                      TS  SCHED_OTHER
                                      FF  SCHED_FIFO
                                      RR  SCHED_RR
                                      B   SCHED_BATCH
                                      ISO SCHED_ISO
                                      IDL SCHED_IDLE
                                      DLN SCHED_DEADLINE
                                      ?   valeur inconnue

       cls         CLS       Classe d’ordonnancement du processus (alias policy,cls). Les valeurs
                             possibles du champ sont :

                                      -   non signalé
                                      TS  SCHED_OTHER
                                      FF  SCHED_FIFO
                                      RR  SCHED_RR
                                      B   SCHED_BATCH
                                      ISO SCHED_ISO
                                      IDL SCHED_IDLE
                                      DLN SCHED_DEADLINE
                                      ?   valeur inconnue

       cmd         CMD       Consultez args (alias args, command).

       comm        COMMAND   command name (only the executable name). Modifications to the command name
                             will not be shown. A process marked <defunct> is partly dead, waiting to
                             be fully destroyed by its parent. The output in this column may contain
                             spaces. (alias ucmd, ucomm). See also the args format keyword, the -f
                             option, and the c option.
                             Lorsque indiquée en dernier, cette colonne sera élargie jusqu'aux bords de
                             l'affichage. Si ps ne peut pas déterminer la largeur de l'affichage, comme
                             quand la sortie est renvoyée (dans un tube, « pipe ») vers un fichier ou
                             une autre commande, la largeur de sortie n'est pas définie (elle peut être
                             de 80 caractères, illimitée, déterminée par la variable TERM, etc.) La
                             variable d'environnement COLUMNS ou l'option --cols permettent de
                             déterminer avec exactitude la largeur dans ce cas. Les options w ou -w
                             peuvent également être utilisées pour adapter la largeur.

       command     COMMAND   Consultez args (alias args, command).

       cp          CP        Utilisation CPU en pour mille (dixième de pour cent) (consultez %cpu).

       cputime     TIME      Temps CPU cumulé, au format « [JJ-]HH:MM:SS » (alias time).

       cputimes    TIME      Temps CPU cumulé en secondes (alias times).

       drs         DRS       Taille des données en mémoire résidente, la quantité de mémoire physique
                             consacrée à autre chose que le code exécutable.

       egid        EGID      Identifiant de groupe effectif (EGID) du processus sous forme d'entier
                             décimal (alias gid).

       egroup      EGROUP    Identifiant de groupe effectif (EGID) du processus, au format texte s'il
                             peut être obtenu et que la largeur du champ le permet, sous forme d'entier
                             décimal sinon (alias group).

       eip         EIP       Pointeur d'instruction.

       esp         ESP       Pointeur de pile.

       etime       ELAPSED   Temps écoulé depuis que le processus a été démarré, au format
                             « [[JJ-]HH:]MM:SS ».

       etimes      ELAPSED   Temps écoulé depuis que le processus a été démarré, en seconde.

       euid        EUID      Identifiant utilisateur effectif (EUID) (alias uid).

       euser       EUSER     Nom d'utilisateur effectif, au format texte s'il peut être obtenu et que
                             la largeur du champ le permet, sous forme d'entier décimal sinon. L'option
                             n peut être utilisée pour forcer la représentation décimale (alias uname,
                             user).

       exe         EXE       path to the executable. Useful if path cannot be printed via cmd, comm or
                             args format options.

       f           F         Indicateur associé au processus, consultez la section INDICATEURS DE
                             PROCESSUS (alias flag, flags).

       fgid        FGID      GID d'accès au système de fichiers (alias fsgid).

       fgroup      FGROUP    GID d'accès au système de fichier, au format texte s'il peut être obtenu
                             et que la largeur du champ le permet, ou sous forme d'entier décimal sinon
                             (alias fsgroup).

       flag        F         Consultez f (alias f, flags).

       attributs   F         Consultez f (alias f, flag).

       fname       COMMAND   Huit premiers octets du nom de base du fichier exécutable du processus.
                             Les éléments de cette colonne peuvent contenir des espaces.

       fuid        FUID      UID d'accès au système de fichier (alias fsuid).

       fuser       FUSER     UID d'accès au système de fichier, au format texte s'il peut être obtenu
                             et que la largeur du champ le permet, sous forme d'entier décimal sinon.

       gid         GID       Consultez egid (alias egid).

       group       GROUP     Consultez egroup (alias egroup).

       ignored     IGNORED   Masque des signaux ignorés, consultez signal(7). Suivant la largeur du
                             champ, un masque de 32 ou 64 bits au format hexadécimal (alias sig_ignore,
                             sigignore).

       ipcns       IPCNS     Unique inode number describing the namespace the process belongs to. See
                             namespaces(7).

       label       LABEL     Étiquette de sécurité, surtout utilisée en contexte de données SELinux. À
                             destination du contrôle d'accès obligatoire (« Mandatory Access Control »
                             ou « MAC ») trouvé sur les systèmes de haute sécurité.

       lstart      STARTED   Heure de démarrage du processus. Consultez aussi bsdstart, start,
                             start_time et stime.

       lsession    SESSION   Afficher l'identifiant de session d'un processus, si la prise en charge de
                             systemd a été incluse.

       luid        LUID      Afficher l’identifiant de session d'un processus.

       lwp         LWP       Identifiant de processus léger (thread) de l'entité distribuable (alias
                             spid, tid). Consultez tid pour plus de renseignements.

       lxc         LXC       Le nom du conteneur lxc dans lequel une tâche est en cours. Si un
                             processus n'est pas en cours dans un conteneur, un tiret (« - ») sera
                             affiché.

       machine     MACHINE   Afficher le nom de machine pour les processus assignés à une machine
                             virtuelle ou un conteneur si la prise en charge de systemd a été incluse.

       maj_flt     MAJFLT    Nombre de défauts de page majeurs survenus avec ce processus.

       min_flt     MINFLT    Nombre de défauts de page mineurs survenus avec ce processus.

       mntns       MNTNS     Unique inode number describing the namespace the process belongs to. See
                             namespaces(7).

       netns       NETNS     Unique inode number describing the namespace the process belongs to. See
                             namespaces(7).

       ni          NI        Valeur de politesse, comprise entre 19 (la plus polie) à -20 (la moins
                             polie pour les autres), Consultez nice(1) (alias nice).

       nice        NI        Consultez ni (alias ni).

       nlwp        NLWP      Nombre de processus légers (threads) dans le processus (alias thcount).

       numa        NUMA      The node associated with the most recently used processor. A -1 means that
                             NUMA information is unavailable.

       nwchan      WCHAN     Adresse de la fonction du noyau où le processus est en sommeil (utilisez
                             wchan pour connaître le nom de la fonction du noyau). Un tiret (« - »)
                             sera affiché dans cette colonne pour les tâches en cours d'exécution.

       ouid        OWNER     Identifiant utilisateur UNIX du propriétaire de la session d'un processus
                             si la prise en charge de systemd a été incluse.

       pcpu        %CPU      Consultez %cpu (alias %cpu).

       pending     PENDING   Masque des signaux en attente, consultez signal(7). Les signaux en attente
                             du processus sont différents des signaux en attente de processus légers
                             individuels. Utilisez l'option m ou l'option -m pour voir les deux.
                             Suivant la largeur du champ, un masque de 32 ou 64 bits au format
                             hexadécimal est affiché (alias sig).

       pgid        PGID      Identifiant du processus (PID) ou, de manière équivalente, le PID du
                             meneur du groupe (alias pgrp).

       pgrp        PGRP      Consultez pgid (alias pgid).

       pid         PID       Un nombre représentant l'identifiant de processus (alias tgid).

       pidns       PIDNS     Unique inode number describing the namespace the process belongs to. See
                             namespaces(7).

       pmem        %MEM      Consultez %mem (alias %mem).

       policy      POL       Classe d’ordonnancement du processus (alias class, cls). Les valeurs
                             possibles sont :

                                      -   non signalé
                                      TS  SCHED_OTHER
                                      FF  SCHED_FIFO
                                      RR  SCHED_RR
                                      B   SCHED_BATCH
                                      ISO SCHED_ISO
                                      IDL SCHED_IDLE
                                      DLN SCHED_DEADLINE
                                      ?   valeur inconnue

       ppid        PPID      PID du processus parent.

       pri         PRI       Priorité du processus. Plus le nombre est grand, plus la priorité est
                             basse.

       psr         PSR       Processeur auquel ce processus est actuellement assigné.

       rgid        RGID      Identifiant de groupe réel (RGID).

       rgroup      RGROUP    Identifiant de groupe réel, au format texte s'il peut être obtenu et que
                             la largeur du champ le permet, sous forme d'entier décimal sinon.

       rss         RSS       Taille de mémoire résidente (« resident set size » ou RSS), la mémoire
                             physique non transférée vers l'espace d'échange (swap) qu'une tâche a
                             utilisée (en kilooctets) (alias rssize, rsz).

       rssize      RSS       Consultez rss (alias rss, rsz).

       rsz         RSZ       Consultez rss (alias rss, rssize).

       rtprio      RTPRIO    Priorité temps réel (« realtime »).

       ruid        RUID      Identifiant d'utilisateur réel (RUID).

       ruser       RUSER     Identifiant d'utilisateur réel (RUID),au format texte s'il peut être
                             obtenu et que la largeur du champ le permet, sous forme d'entier décimal
                             sinon.

       s           S         Affichage d'état minimal (un caractère). Consultez la section CODES D'ÉTAT
                             DE PROCESSUS pour la signification des différentes valeurs. Consultez
                             aussi stat pour l'affichage de renseignements supplémentaires (alias
                             state).

       sched       SCH       Ordonnancement de la politique du processus. Les politiques SCHED_OTHER
                             (SCHED_NORMAL), SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO et SCHED_IDLE
                             sont respectivement affichées comme 0, 1, 2, 3, 4 et 5.

       seat        SEAT      Afficher l'identifiant associé à tous les périphériques ayant un
                             emplacement de travail précis, si la prise en charge de systemd a été
                             incluse.

       sess        SESS      Identifiant de session ou, de manière équivalente, le PID du meneur de
                             session (alias session, sid).

       sgi_p       P         Processeur sur lequel le processus est actuellement exécuté. Afficher
                             « * » si le processus ne s'exécute pas ou ne peut pas s'exécuter.

       sgid        SGID      Identifiant de groupe (GID) sauvegardé (alias svgid).

       sgroup      SGROUP    Nom de groupe sauvegardé, au format texte s'il peut être obtenu et que la
                             largeur du champ le permet, sous forme d'entier décimal sinon.

       sid         SID       Consultez sess (alias sess, session).

       sig         PENDING   Consultez pending (alias pending, sig_pend).

       sigcatch    CAUGHT    Consultez caught (alias caught, sig_catch).

       sigignore   IGNORED   Consultez ignored (alias ignored, sig_ignore).

       sigmask     BLOCKED   Consultez blocked (alias blocked, sig_block).

       size        SIZE      Montant approximatif d'espace d'échange qui serait nécessaire si le
                             processus s'apprêtait à modifier (« dirty ») toutes les pages accessibles
                             en écriture puis se transférait sur l'espace d'échange (« swap »). Ce
                             nombre est très approximatif !

       slice       SLICE     Unité « slice » à laquelle appartient le processus si la prise en charge
                             de systemd a été incluse.

       spid        SPID      Consultez lwp (alias lwp, tid).

       stackp      STACKP    Adresse du bas (début) de la pile pour le processus.

       start       STARTED   Heure de démarrage du processus. Si le processus a été démarré dans les
                             dernières 24 heures, le format de sortie est « HH:MM:SS », sinon il est
                             «  Mmm JJ » (où « Mmm » sont les trois premières lettres du mois, en
                             anglais). Consultez aussi lstart, bsdstart, start_time et stime.

       start_time  START     Heure ou date de démarrage du processus. Seule l'année est affichée si le
                             processus n'a pas été démarré la même année que ps a été appelé, « MmmDD »
                             s'il n'a pas été démarré le même jour ou « HH:MM » sinon. Consultez aussi
                             bsdstart, start, lstart et stime.

       stat        STAT      État multicaractère du processus. Consultez la section CODES D'ÉTAT DE
                             PROCESSUS pour la signification des différentes valeurs. Consultez aussi s
                             et state pour l'affichage du premier caractère seulement.

       state       S         Consultez s. (alias s).

       stime       STIME     see start_time. (alias start_time).

       suid        SUID      Identifiant utilisateur (UID) sauvegardé (alias svuid).

       supgid      SUPGID    GID des groupes additionnels, s'il y en a. Consultez getgroups(2).

       supgrp      SUPGRP    Noms des groupes additionnels, s'il y en a. Consultez getgroups(2).

       suser       SUSER     Nom d'utilisateur sauvegardé, au format texte s'il peut être obtenu et que
                             la largeur du champ le permet, sous forme d'entier décimal sinon. (alias
                             svuser).

       svgid       SVGID     Consultez sgid (alias sgid).

       svuid       SVUID     Consultez suid (alias suid).

       sz          SZ        Taille en pages physiques de l'image du noyau du processus, incluant le
                             texte, les données et l'espace de la pile. Les correspondances
                             (« mappings ») de périphériques sont actuellement ignorées, mais cela
                             pourrait changer. Consultez vsz et rss.

       tgid        TGID      Un nombre représentant le groupe de processus légers auquel une tâche
                             appartient, (alias pid). C'est l'identifiant de processus du meneur de
                             groupe de processus légers.

       thcount     THCNT     Consultez nlwp (alias nlwp). Nombre de processus légers du noyau (thread)
                             appartenant au processus.

       tid         TID       Le nombre unique représentant l'identifiant d'une entité distribuable
                             (alias lwp, spid). Cette valeur peut aussi apparaître en tant
                             qu'identifiant de processus (pid), identifiant de groupe de processus
                             (pgrp), identifiant de session du meneur de session (sid), identifiant de
                             groupe de processus légers du meneur de processus légers (tgid) et
                             identifiant du groupe de processus du meneur de groupe de processus
                             (tpgid).

       time        TIME      Temps CPU cumulé, au format « [JJ-]HH:MM:SS » (alias cputime).

       times       TIME      Temps CPU cumulé, en seconde (alias cputime).

       tname       TTY       tty (terminal) de contrôle (alias tt, tty).n

       tpgid       TPGID     Identifiant du groupe de processus au premier plan sur le terminal (tty)
                             auquel le processus est connecté, ou -1 si le processus n'est pas connecté
                             à un tty.

       trs         TRS       Taille du texte en mémoire résidente, la quantité de mémoire physique
                             consacrée au code exécutable.

       tt          TT        tty (terminal) de contrôle (alias tname, tty).

       tty         TT        tty (terminal) de contrôle (alias tname, tt).

       ucmd        CMD       Consultez comm (alias comm, ucomm).

       ucomm       COMMAND   Consultez comm (alias comm, ucmd).

       uid         UID       Consultez euid (alias euid).

       uname       USER      Consultez euser (alias euser, user).

       unit        UNIT      Afficher l'unité « slice » à laquelle appartient le processus, si la prise
                             en charge de systemd est incluse.

       user        USER      Consultez euser (alias euser, uname).

       userns      USERNS    Unique inode number describing the namespace the process belongs to. See
                             namespaces(7).

       utsns       UTSNS     Unique inode number describing the namespace the process belongs to. See
                             namespaces(7).

       uunit       UUNIT     Afficher l'unité « slice » à laquelle appartient le processus, si la prise
                             en charge de systemd est incluse.

       vsize       VSZ       Consultez vsz (alias vsz).

       vsz         VSZ       Taille de la mémoire virtuelle du processus en Kio (unités de
                             1024 octets). Les correspondances (« mappings ») de périphériques sont
                             actuellement ignorées, mais cela pourrait changer (alias vsize).

       wchan       WCHAN     Nom de la fonction du noyau où le processus est en sommeil, affiche « - »
                             si le processus s'exécute, « * » si le processus possède plusieurs
                             processus légers (« multi-thread ») et ps n'affiche pas les processus
                             légers.

VARIABLES D'ENVIRONNEMENT
       Les variables d'environnement suivantes peuvent affecter ps :

       COLUMNS
          Remplacer la largeur par défaut de l'affichage.

       LINES
          Remplacer la hauteur par défaut de l'affichage.

       PS_PERSONALITY
          Configurer parmi posix, old, linux, bsd, sun, digital, etc. (consultez ci-dessous la section
          PERSONNALITÉ).

       CMD_ENV
          Configurer parmi posix, old, linux, bsd, sun, digital, etc. (consultez ci-dessous la section
          PERSONNALITÉ).

       I_WANT_A_BROKEN_PS
          Forcer l'interprétation obsolète de la ligne de commande.

       LC_TIME
          Format de date.

       PS_COLORS
          Non pris en charge pour le moment.

       PS_FORMAT
          Redéfinir le format de sortie par défaut, à configurer avec une chaîne de format du même type
          que celle utilisée pour l'option -o. Les valeurs DefSysV et DefBSD sont particulièrement
          utiles.

       POSIXLY_CORRECT
          Ne pas chercher d'excuse pour ignorer les mauvaises « fonctionnalités ».

       POSIX2
          Agir comme POSIXLY_CORRECT une fois configuré à « on ».

       UNIX95
          Ne pas chercher d'excuse pour ignorer les mauvaises « fonctionnalités ».

       _XPG
          Annuler le comportement non standard CMD_ENV=irix.

       Il est généralement déconseillé de configurer ces variables, à l'exception de CMD_ENV ou
       PS_PERSONALITY. Ces dernières peuvent être configurées à linux pour les systèmes normaux. Sans
       cette configuration, ps suit les aspects inutiles et mauvais de la norme Unix98.

PERSONNALITÉ
       390        comme le ps d'0S/390 Open Edition
       aix        comme le ps d'AIX
       bsd        comme le ps de FreeBSD (complètement non standard)
       compaq     comme le ps de Digital Unix B
       debian     comme l'ancien ps de Debian
       digital    comme le ps de Tru64 (ex. Digital Unix, ex. OSF/1)
       gnu        comme l'ancien ps de Debian
       hp         comme le ps de HP-UX
       hpux       comme le ps de HP-UX
       irix       comme le ps d'Irix
       linux      ***** recommandé *****
       old        comme le ps d'origine de Linux (entièrement non standard)
       os390      comme le ps d'OS/390 Open Edition
       posix      standard
       s390       comme le ps d'OS/390 Open Edition
       sco        comme le ps de SCO
       sgi        comme le ps d'Irix
       solaris2   comme le ps de Solaris 2+ (SunOS 5)
       sunos4     comme le ps de SunOS 4 (Solaris 1) (non standard)
       svr4       standard
       sysv       standard
       tru64      comme le ps de Tru64 (ex. Digital Unix, ex. OSF/1)
       unix       standard
       unix95     standard
       unix98     standard

VOIR AUSSI
       pgrep(1), pstree(1), top(1), proc(5)

STANDARDS
       Ce ps est conforme à :

       1   la Single UNIX Specification version 2 ;
       2   les Open Group Technical Standard Base Specifications, version 6 ;
       3   l'IEEE Std 1003.1, édition 2004 ;
       4   la X/Open System Interfaces Extension [UP XSI] ;
       5   l'ISO/IEC 9945:2003.

AUTEUR
       ps a été initialement écrit par Branko Lankester ⟨lankeste@fwi.uva.nl⟩. Michael K. Johnson
       ⟨johnsonm@redhat.com⟩ l'a réécrit profondeur pour utiliser le système de fichiers proc, modi‐
       fiant quelques détails au passage. Michael Shields ⟨mjshield@nyx.cs.du.edu⟩ a ajouté la fonc‐
       tionnalité de liste de PID. Charles Blake ⟨cblake@bbn.com⟩ a ajouté le tri multiniveau, la bi‐
       bliothèque « à la dirent », la base de données de correspondance entre numéro de périphérique et
       nom, la recherche approximative binaire directement dans System.map, et beaucoup d'autres net‐
       toyages de code et de documentation. David Mossberger-Tang a écrit la prise en charge BFD pour
       psupdate. Albert Cahalan ⟨albert@users.sf.net⟩ a réécrit ps pour prendre en charge complètement
       Unix98 et BSD, ainsi que certains bidouillages pour les syntaxes obsolètes et étrangères.

       Signalez les bogues à ⟨procps@freelists.org⟩.

procps-ng                                      2020-06-04                                         PS(1)
ps.txt

TP1: Solution


ps aux --sort=+%cpu #tri ascendant par temps CPU

ps aux --sort=%cpu #tri discedant par temps CPU
ps.txt
ps -p 1920 -o pid,ppid,uid,%cpu,%mem,stat,cmd
    PID    PPID   UID %CPU %MEM STAT CMD
   1920    1625  1000  0.0  0.4 Sl   /usr/bin/gjs /usr/share/gnome-shell/org.gnome.Shell.Notifications

       CODE EN-TÊTE  
DESCRIPTION
pid PID Un nombre représentant l'identifiant de processus (alias tgid).
ppid PPID PID du processus parent.
uid
euid
UID
EUID
Consultez euid (alias euid).
Identifiant utilisateur effectif (EUID) (alias uid).
%cpu %CPU Utilisation CPU du processus exprimée avec un chiffre après la virgule. Actuellement, il s'agit du temps passé à fonctionner divisé par le temps de vie du processus (rapport cputime/realtime), exprimé en pourcentage. la somme ne dépassera pas 100 % sauf si vous êtes chanceux (alias pcpu).
%mem %MEM   Rapport entre la taille de mémoire résidente (« resident set size » ou RSS) et la mémoire physique de la machine, exprimé en pourcentage (alias pmem).
stat STAT État multicaractère du processus. Consultez la section CODES D'ÉTAT DE PROCESSUS pour la signification des différentes valeurs. Consultez aussi s et state pour l'affichage du premier caractère seulement.
       CODE EN-TÊTE   DESCRIPTION
cmd CMD Consultez args (alias args, command).
COMMAND COMMAND command name (only the executable name). Modifications to the command name will not be shown. A process marked <defunct> is partly dead, waiting to be fully destroyed by its parent. The output in this column may contain spaces. (alias ucmd, ucomm). See also the args format keyword, the -f option, and the c option.
Lorsque indiquée en dernier, cette colonne sera élargie jusqu'aux bords de l'affichage. Si ps ne peut pas déterminer la largeur de l'affichage, comme quand la sortie est renvoyée (dans un tube, « pipe ») vers un fichier ou  une autre commande, la largeur de sortie n'est pas définie (elle peut être de 80 caractères, illimitée, déterminée par la variable TERM, etc.) La variable d'environnement COLUMNS ou l'option --cols permettent de déterminer avec exactitude la largeur dans ce cas. Les options w ou -w peuvent également être utilisées pour adapter la largeur.

TP1: EXO2

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

/* Variable globale*/
int a=20;

int main (){
pid_t x;
x=fork(); // création d’un processus fils

if (x < 0){/*la création a echouée*/
	printf("fork a échoué");
} else {
if (x == 0){ /* seul le processus fils exécute ce code*/
printf("ici processus fils, le PID %d \n ", getpid());
a+=10;
}
else { /* seul le processus père exécute ce code*/
printf("ici processus père, le PID %d \n ", getpid());
a+=100;
}
}
// Les deux processus exécutent ce code
printf("fin de processus %d %d \n ", getpid(), a);
return 0;
}

Threads

Threads

Un thread est l'unité de base que l'ordonnanceur du noyau utilise pour permettre aux applications d'exécuter le processeur. Un thread a les caractéristiques suivantes :

  • Chaque thread a sa propre pile et, avec les valeurs des registres, il détermine l'état d'exécution du thread.
  •  Un thread s'exécute dans le contexte d'un processus et tous les threads du même processus partagent les ressources de ce dernier

Threads

Identification

        Chacun des threads d'un processus possède un identifiant unique (stocké dans le type pthread_t).

Cet identifiant est renvoyé à l'appelant de pthread_create(3), et un thread peut obtenir son propre identifiant de thread en utilisant pthread_self(3).

Fonctions(Manipulation)

#include <pthread.h>
int pthread_create (pthread t *thread, const pthread_attr_t *attr, void *(*routine)(void*),
void *arg);
int pthread_join (pthread_t *thread, void **value_ptr) ;
pthread_t pthread_self(void);
void pthread_exit(void *retval);
  • La fonction pthread_create () démarre un nouveau thread dans le processus appelant.
  • La fonction pthread_join () attend que le thread spécifié par l'argument thread se termine.
  • La fonction pthread_self () renvoie l'ID du thread appelant, Il s'agit de la même valeur qui est renvoyée dans * thread dans l'appel pthread_create (3) qui a créé ce thread.
  • La fonction pthread_exit () termine le thread d'appel et renvoie une valeur via RETVAL qui (si le thread est joinable) est disponible sur un autre thread dans le même processus (celui-ci dois appelé  pthread_join (3)).
  • $ man pthreads (pour plus de fonctions)

Exemple

#include<stdio.h>
#include<unistd.h>

void myturn(){
    while(1)/*Boucle infinie simulant un travail répétitif infini*/
    {
        printf("My Turn\n");
        sleep(1);
    }
}
void yourturn(){
    for(;;)/*Boucle infinie simulant un travail répétitif infini*/
    {
        printf("Your Turn\n ");
        sleep(1);
    }
}
int main(){
    myturn();
    yourturn();
    return 0;
}

Problème: En programmation séquentielle seule la première opération (fonction myturn) qui est exécutée on n'aboutira jamais à la deuxième fonction!

Solution: Le paralilisme c'est à dire moduler le programme en utilisant les threads

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
void* myturn(void * arg){/* la routine appelée par le thread doit respecter ce format!*/
    for(;;)
    {
        printf("My Turn\n ");
        sleep(1);
    }
}
void yourturn(){
    while(1)
    {
        printf("Your Turn\n");
        sleep(1);
    }
}
int main(){
    pthread_t task1;
    pthread_create(&task1,NULL,myturn,NULL);
    yourturn();
    return 0;
}

En utilisant les threads

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
void* myturn(void * arg){/* la routine appelée par le thread dois respecter ce format!*/
    for(int i=0;i<10;i++)
    {
        printf("My Turn\n ");
        sleep(1);
    }
}
void yourturn(){
    for(int i=0;i<5;i++)
    {
        printf("Your Turn\n");
        sleep(1);
    }
}
int main(){
    pthread_t task1;
    pthread_create(&task1,NULL,myturn,NULL);
    yourturn();
    return 0;
}

Et si le main thread se termine avant le thread crée!

Problème: les deux threads affichent 5 fois le message et le programme termine son exécution.

Solution: il faut que le thread principal attends la terminaison du thread >>>pthread_join()

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
void* myturn(void * arg){/* la routine appelée par le thread dois respecter ce format!*/
    for(int i=0;i<10;i++)
    {
        printf("My Turn\n ");
        sleep(1);
    }
}
void yourturn(){
    for(int i=0;i<5;i++)
    {
        printf("Your Turn\n");
        sleep(1);
    }
}
int main(){
    pthread_t task1;
    pthread_create(&task1,NULL,myturn,NULL);
    yourturn();
    pthread_join(task1,NULL);
    return 0;
}

La fonction: Pthread_join()

Exercices:

  • Écrivez un programme en langage C dans le quel vous utiliser la fonction pthread_create pour transmettre un argument quelconque au thread crée (c'est à vous de choisir le type d'arguments)  ==>    man pthread_create
  • Thread coopératif: Soit la chaine de caractère str="aaaa", créez un programme en langage C qui utilise quatre threads(t0,t1,t2 &t3); chaque thread ti modifier le caractère du rang i de a jusque z puis re-debut depuis la lettre a ( à l'infinie)
  • Écrivez un programme en langage C dans le quel vous utiliser la fonction pthread_join pour recevoir une valeur de retour  quelconque depuis  thread crée  ==>    man pthread_join
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>


void* func1(void * arg){/* la routine appelée par le thread dois respecter ce format!*/
	//vous pouvez utiliser un pointeur :
	int * a = (int *) arg; // arg est un pointeur vers void donc on peut le caster en pointeur vers entier 
	printf("task1 méthode 1: argument reçu = %d\n",*a);
	//sinon utiliser une variable simple:
	int b = *(int *) arg; // arg est un pointeur vers void donc on peut le caster en pointeur vers entier 
	printf("task1 méthode 2: argument reçu = %d\n ",b);
	printf("==============================================================\n");	
	
}

void* func2(void * arg){
	char * s = (char *) arg;
	printf("task2: argument reçu = %s\n",s);
	printf("==============================================================\n");	
}
int main(){
    pthread_t task1,task2;
    int i = 7;
    char *str = "hello there";
    printf("==============================================================\n");    
    printf("main thread:\nargument1 =%d\nargument2 =%s\n",i,str);
    printf("==============================================================\n");
    
    pthread_create(&task1,NULL,func1,&i);
    pthread_join(task1,NULL);
    pthread_create(&task2,NULL,func2,str);
    pthread_join(task2,NULL);
    return 0;
}

Argument passé par pthread_create:

Thread coopératif

#define _GNU_SOURCE // pthread_setname_np
#include <pthread.h>
#include <assert.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

char str[] = "aaaa";

static void *
start_fnct(void *p)
{
int idx = (intptr_t) p;
while (1)
{
str[idx]++;
if (str[idx] > 'z') str[idx] = 'a';
printf("%s\r", str);//  \r     carriage return
fflush(stdout); //flush a stream //Pour les flux de sortie, fflush() force une écriture de toutes les données mises en mémoire tampon de l'espace utilisateur pour la sortie donnée ou met à jour le flux via la fonction d'écriture sous-jacente du flux.
}
}

int
main(void)
{
int thread_count = 4;
pthread_t threads[thread_count];
for (intptr_t i = 0; i < thread_count; i++)
{
int e = pthread_create(&threads[0], NULL, start_fnct, (void*)i);
assert(!e);//assert : interrompre le programme si l'assertion est fausse

//Donner des noms aux différents threads vous aide lors du débogage
char name[64];
snprintf(name, sizeof name, "worker%li", i);
pthread_setname_np(threads[0], name);
}
for (int i = 0; i < thread_count; i++)
{
int e = pthread_join(threads[0], NULL);
assert(!e);
}
}

Valeurs reçue par pthread join

#

Synchronisation

Problèmes !

  • Gestion de la Section Critique
  • Gestion de la Précédence
  • Allocation des ressources

Les Sémaphores

Les  sémaphores  POSIX permettent  aux processus et aux threads de se synchroniser.
Un sémaphore est un entier dont la valeur ne peut jamais être négative.
Deux  opérations  peuvent  être  effectuées :  incrémenter la valeur du sémaphore de 1 (sem_post(3)), ou décrémenter la valeur du sémaphore  de 1 (sem_wait(3)). Si la valeur courante est 0, une opération sem_wait(3)bloque jusqu’à ce que la valeur devienne strictement positive.
man sem_overview
#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_destroy(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

Fonctions

Section Critique

Reprenons l'exercice de l'incrémentation décrémentation de la variable globale

#include<stdio.h>
#include<pthread.h>
int cpt=1;

void* inc(void *arg){
    for(int i=0;i<100000;i++)
        cpt++;
}

void* dec(void *arg){
    for(int i=0;i<100000;i++)
        cpt--;
}

int main(){
    pthread_t t1,t2;
    pthread_create(&t1,NULL,inc,&cpt);
    pthread_create(&t2,NULL,dec,&cpt);
    pthread_join(t1,(void*)&cpt);
    pthread_join(t2,(void*)&cpt);
    printf("Valeur = %d \n",cpt);
}

Problème de la Section Critique

Après plusieurs exécution on remarque que les résultats sont aléatoires :

$ for i in {1..5}; do ./a.out; done
Valeur = 17003 
Valeur = 99896 
Valeur = 13504 
Valeur = -97062 
Valeur = -92188 

En réalité les deux threads  essaye d'accéder en concurrence à la variable globale cpt

cpt ++

cpt --

lire(cpt)

inc(cpt)

sauv(cpt)

lire(cpt)

dec(cpt)

sauv(cpt)

100

100

99

cpt ++

lire(cpt)

inc(cpt)

sauv(cpt)

99+1

100

La variable globale cpt est une ressource critique : L’accès à cpt dois se faire en section critique!

Debut section critique

cpt++

Fin section critique

Debut section critique

cpt--

Fin section critique

Solution

#include<stdio.h>
#include<pthread.h>
#include <semaphore.h>
 int cpt=1;
sem_t sema;
void* inc(void *arg){  
    for(int i=0;i<100000;i++)
    {
        sem_wait(&sema);/* P(sema) */
        cpt++;
        sem_post(&sema);/* V(sema) */
    }   
}
void* dec(void *arg){  
    for(int i=0;i<100000;i++)
    {
	 sem_wait(&sema);/* P(sema) */
    	cpt--;
    sem_post(&sema); /* V(sema) */
    }
}
int main(){
    pthread_t t1,t2;
    sem_init(&sema,0, 1);
    pthread_create(&t1,NULL,inc,&cpt);
    pthread_create(&t2,NULL,dec,&cpt);
    pthread_join(t1,(void*)&cpt);
    pthread_join(t2,(void*)&cpt);
    sem_destroy(&sema);
    printf("Valeur = %d \n",cpt);
    return 0;
}

Gérer la Précédence

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>sem_t s;
void *child(void *arg) {
printf("child\n");
sem_post(&s); // signal here: child is done
return NULL;
}
int main(int argc, char *argv[]) {
sem_init(&s, 0, X); // what should X be?
printf("parent: begin\n");
pthread_t c;
pthread_create(&c, NULL, child, NULL);
sem_wait(&s); // wait here for child
printf("parent: end\n");
return 0;
}

Gérer la Précédence

Modifiez la valeur X pour que le main thread attends le threads crée
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
void* first(void* data) { printf("First\n"); }
void* second(void* data) { printf("Second\n"); }
void* third(void* data) { printf("Third\n"); }
int main () {
  pthread_t t1, t2, t3;
  pthread_create(&t3, NULL, third, NULL);
  pthread_create(&t2, NULL, second, NULL);
  pthread_create(&t1, NULL, first, NULL);
  // wait for all threads
  pthread_join(t1, NULL); pthread_join(t2, NULL); pthread_join(t3, NULL);
}

order.c

Modifiez le programme pour assurer que le programme donne toujours la sortie suivant :
First
Second
Third

Allocation des ressources

problème

  • pool de K ressources commune
  • plusieurs processus, chacun utilise une ressource pendant t s sans interruption!
  • DOIT garantir qu'au plus K ressources sont utilisées à tout moment

Sol: Sémaphores

  • dans la mémoire partagée:

 

sem_t s;
  • Utilisation:

 

sem_wait(&s);// Alloué la ressource

	........... //Utilisez la ressource
             
sem_post(&s);// Libérer la ressource

Le problème des lecteurs/rédacteurs

Le problème des lecteurs et des rédacteurs est un problème classique en théorie informatique, qui permet de modéliser les accès à des bases de données.

Le problème

Supposons qu'une base de données ait des lecteurs et des rédacteurs, et qu'il faille programmer les lecteurs et les rédacteurs de cette base de données.

Les contraintes sont les suivantes :

  • plusieurs lecteurs doivent pouvoir lire la base de données en même temps ;
  • si un rédacteur est en train de modifier la base de données, aucun autre utilisateur (ni rédacteur, ni même lecteur) ne doit pouvoir y accéder.

lecteurs/rédacteurs

Ref: Programmation-Systeme-handout 

Thread Lecteur

// Fonction pour simuler la lecture
void *reader(void *arg) {
    int readerId = *((int *)arg);
    // Entrée de la section critique
    sem_wait(&mutex);
    readersCount++;
    // Si c'est le premier lecteur, bloquer l'écriture
    if (readersCount == 1) {
        sem_wait(&writeBlock);
    }
    // Sortie de la section critique
    sem_post(&mutex);
    // Lecture de la ressource
    printf("Lecteur %d lit la ressource:rss= %d \n", readerId,rss);
    // Entrée de la section critique
    sem_wait(&mutex);
    readersCount--;
    // Si c'est le dernier lecteur, débloquer l'écriture
    if (readersCount == 0) {
        sem_post(&writeBlock);
    }
    // Sortie de la section critique
    sem_post(&mutex);
    pthread_exit(NULL);
}

Thread Rédacteur

// Fonction pour simuler l'écriture
void *writer(void *arg) {
    int writerId = *((int *)arg);

    // Entrée de la section critique
    sem_wait(&writeBlock);

    // Écriture dans la ressource
        rss=(int) pthread_self();//getpid();//rand() % 10;
        printf("Rédacteur %d écrit dans la ressource rss= %d \n", writerId,rss);

    // Sortie de la section critique
    sem_post(&writeBlock);

    pthread_exit(NULL);
}

Le programme

#include <stdio.h>
#include<stdlib.h>
#include <pthread.h>
#include <semaphore.h>

// Déclaration des variables globales
sem_t mutex;           // Sémaphore pour la mutual exclusion pour accéder à readersCount
sem_t writeBlock;      // Sémaphore pour bloquer l'écriture
int readersCount = 0;   // Compteur de lecteurs actuels
int rss=0;		// La ressource critique

// Fonction pour simuler la lecture
void *reader(void *arg) {
    int readerId = *((int *)arg);

    // Entrée de la section critique
    sem_wait(&mutex);
    readersCount++;

    // Si c'est le premier lecteur, bloquer l'écriture
    if (readersCount == 1) {
        sem_wait(&writeBlock);
    }

    // Sortie de la section critique
    sem_post(&mutex);

    // Lecture de la ressource
    printf("Lecteur %d lit la ressource:rss= %d \n", readerId,rss);

    // Entrée de la section critique
    sem_wait(&mutex);
    readersCount--;

    // Si c'est le dernier lecteur, débloquer l'écriture
    if (readersCount == 0) {
        sem_post(&writeBlock);
    }

    // Sortie de la section critique
    sem_post(&mutex);

    pthread_exit(NULL);
}

// Fonction pour simuler l'écriture
void *writer(void *arg) {
    int writerId = *((int *)arg);

    // Entrée de la section critique
    sem_wait(&writeBlock);

    // Écriture dans la ressource
        rss=(int) pthread_self();//getpid();//rand() % 10;
        printf("Rédacteur %d écrit dans la ressource rss= %d \n", writerId,rss);

    // Sortie de la section critique
    sem_post(&writeBlock);

    pthread_exit(NULL);
}

int main() {
    // Initialisation des sémaphores
    sem_init(&mutex, 0, 1);
    sem_init(&writeBlock, 0, 1);

    // Déclaration des threads
    pthread_t readers[5], writers[5];
    int readerIds[5], writerIds[5];

    // Création des threads lecteurs
    for (int i = 0; i < 5; i++) {
        readerIds[i] = i + 1;
        pthread_create(&readers[i], NULL, reader, &readerIds[i]);
        writerIds[i] = i + 1;
        pthread_create(&writers[i], NULL, writer, &writerIds[i]);
    }

    // Attente de la fin des threads lecteurs
    for (int i = 0; i < 5; i++) {
        pthread_join(writers[i], NULL);
        pthread_join(readers[i], NULL);
    }

    // Destruction des sémaphores
    sem_destroy(&mutex);
    sem_destroy(&writeBlock);

    return 0;
}

Famine des rédacteurs

Mais cette solution présente de gros problèmes, si le flux de lecteurs est régulier : le rédacteur pourrait avoir à patienter un temps infini.

Il existe donc une deuxième solution, qui consiste à mettre en attente tous les lecteurs ayant adressé leur demande d'accès après celle d'un rédacteur.

Écrire le programme qui implémente cette solution

Ref: Programmation-Systeme-handout 

Le problème des Producteur/Consommateur

Il s'agit de partager entre deux tâches, le producteur et le consommateur, une zone de mémoire tampon utilisée comme une file. Le producteur génère un élément de données, l'enfile sur la file et recommence ; simultanément, le consommateur retire les données de file.

Ce problème peut être généralisé à plusieurs producteurs ou consommateurs

Implémentation

il faut  s'assurer que le producteur ne va pas ajouter des données sur une file pleine et que le consommateur ne va pas essayer de retirer des données d'une file vide

\forall i,j:c_{ij}= \sum_{k=1}^{n} a_{ik}b_{kj} = a_{i1}b_{1j}+a_{i2}b_{2j}+a_{i3}b_{3j}+.....+a_{in}b_{nj}

Si                     est une matrice de type  ( m , n )  et                   est une matrice de type  ( n , p ) , alors leur produit, noté

 

est une matrice de type  ( m , p )  donnée par :

EXERCICE:

A = ( a_{ij})
B = ( b_{ij})
A B = C(c_{ij})
  1. Écrire un programme C qui calcule le produit matriciel  C = A*B en programmation séquentielle 
  2. En utilisant n threads
  3. En utilisant n*p threads
Made with Slides.com