Processus

Notion de processus

Terminologie

  • Le terme « programme » est polysémique, et donc ambigu
    • « mon programme ne compile pas »
    • « je copie le programme sur ma clé USB »
    • « le compteur de programme »
    • « j’ai 3 programmes qui s’exécutent »
  • Nécessité de lever l’ambiguïté

Terminologie (2)

  • Programme : séquence d’instructions en langage machine stocké en RAM

    « le compteur de programme »

  • Image : fichier contenant l’image mémoire d’un programme

    « je copie l’image sur ma clé USB »

  • Source : fichier en langage évolué servant à produire une image

    « mon source ne compile pas »

Définition : Processus

  • Processus : exécution d’un programme

    « j’ai 3 processus qui s’exécutent … »

    « … un lecteur de musique, et 2 éditeurs de texte »

    → plusieurs processus peuvent exécuter le même programme

  • Métaphore :

    • programme ~ partition (avec des choix possibles…)
    • processus ~ musicien
    • processeur ~ instrument

Remarques

  • Source, image, programme : notions statiques

  • Processus : notion dynamique

    NB: les commandes UNIX ps et top, et le gestionnaire de tâches de Windows (onglet « Processus »), donnent des informations sur les processus en cours

Exemple : gestionnaire de tâches Windows

_images/ps_windows.png

Exemple : moniteur système Linux

_images/ps_gnome.png

Processus et SE

Plusieurs processus indépendants doivent pouvoir s’exécuter sans interférence :

  • partage des ressources (arbitrage)
  • isolation des processus (abstraction, autorisation)

À l’inverse, les processus doivent pouvoir communiquer si leur programme le demande

Gestion des processus par le noyau

Définition : PCB

Process Control Block (PCB)

  • Structure de données du SE contenant les informations sur un processus.

  • Ces informations sont dans une zone mémoire accessible uniquement par le noyau du SE.

  • Pour obtenir des informations sur les processus, il est donc nécessaire de passer par des appels systèmes :

    getpid, getppid, getuid, geteuid, setuid

Identité

  • Identificateur de processus (PID)

    → numéro unique (à un instant t, mais réutilisable)

  • Informations de généalogie

    → processus parent (PPID)

    → processus enfants

  • Information de droits

    → utilisateur propriétaire du processus

    → utilisateur effectif (augmentation ou diminution de droits)

Exécution

  • État du processus

    → cf. transparents suivants

  • Contexte processeur

    → état des registres du processeur pour ce processus

  • Autres informations d’ordonnancement

    → exemple : priorité:ref pour l”ordonnancement

Ressources

  • Informations sur la mémoire utilisée / utilisable

    → tables de pages (cf. séances sur la gestion de la mémoire)

  • Informations sur le temps passé

    → temps réel, temps utilisateur

  • Liste des fichiers ouverts

    → « fichiers » au sens large (cf. chapitre Entrées-sorties)

  • Autres ressources utilisées…

États d’un processus

Selon les systèmes, le nombre et le nom des états peut varier. Mais la base commune est :

Élu:
en train de s’exécuter sur un processeur
Éligible:
en attente d’un processeur pour s’exécuter
Bloqué:
en attente d’un événement (ex: interruption) ; ne peut donc pas s’exécuter pour l’instant

Diagramme d’états d’un processus

_images/ps_states.png

Remarques sur l’identité

Intérêt de séparer l’utilisateur propriétaire de l’utilisateur effectif :

  • Droits d’administration « locale » :

    certaines commandes, au comportement connu et circonscrit, s’exécutent avec des droits supérieurs à l’utilisateur qui les lancent.

    exemple : sudo, crontab -e

  • Services lancés par l’administrateur  :

    pour limiter les risques en cas d’exploitation de faille, ils s’éxécutent avec des droits limités.

    example : httpd, ftpd

Création de processus par programmation

Différentes approches

  • Sous Windows
  • Sous UNIX

Windows

Appel système CreateProcess : crée un processus dont les caractéristiques sont données en paramètres de l’appel système.

Exemple :

STARTUPINFO si; // à renseigner
PROCESS_INFORMATION pi; // utilisé en sortie
bool succes = CreateProcess( 0, "mon_prog.exe", 0,
                             0, FALSE, 0, 0, 0,
                             &si, &pi);

UNIX

Appel système fork : crée un processus dont les caractéristiques sont identiques à celles du processus courant (seuls le PID et le PPID changent).

→ retourne une valeur différente dans le processus père et le processur fils

Exemple :

int pid_fils = fork();
if (pid_fils == 0) return fonction_fils();
              else return fonction_père();

UNIX (2)

Si on souhaite que le fils exécute un autre programme que le père, on utilise une variante de exec (qui remplace le programme courant par un autre programme).

Exemple :

int pid_fils = fork();
if (pid_fils == 0) execlp("mon_prog", "mon_prog");
// seul le père exécute la suite

UNIX (3)

  • Chaque processus produit, lorsqu’il se termine, une valeur entière (valeur retournée par la fonction main)
  • Cette valeur doit être récupérée par le processus parent (appel système wait)
  • Tant que cela n’a pas été fait, les ressources du processus enfant ne peuvent pas être libérées ; le processus est dans un état particulier appelé « Zombie » (entre Élu et terminé).

Comparaison

  • Le modèle de Windows est plus simple à appréhender: création d’un nouveau processus « à partir de zéro ».
  • Le modèle d’UNIX est plus portable et évolutif : il reste valable quelles que soient les informations nécessaires à la création d’un processus.