Fiche de révision : Architecture des systèmes

Plan du Cours

  1. Processus concurrents et commandes shell
  2. Descripteurs et observation des processus
  3. Mémoire, états et ordonnancement
  4. Création et héritage des processus
  5. Attente et terminaison des processus fils
  6. Arguments et environnement du programme
  7. Recouvrement par les primitives exec

1. Processus concurrents et commandes shell

Notions clés & Définitions

  • Processus : Instance d’un programme en exécution, associée à un ensemble de données et d’informations conservées dans son bloc de contrôle de processus (BCP).

★ À maîtriser

  • Les processus concurrents permettent d’améliorer l’utilisation d’une machine monoprocesseur, de multiprogrammer des serveurs, de faire se dérouler en parallèle calcul et entrées-sorties, de lancer des sous-calculs sur une machine parallèle ou répartie et de répondre à des requêtes ou événements externes dans des systèmes temps réel, embarqués ou mobiles.

  • Le code de retour 0 indique une fin normale d’un processus, tandis qu’un code différent de 0 signale un comportement anormal en cours d’exécution ou à la terminaison.

📌 La séparation de commandes par des points-virgules les exécute en enchaînement sans qu’une erreur d’une commande affecte les suivantes, tandis que le tube | transmet la sortie d’une commande comme entrée de la suivante.

Compléments

📌 Un processus système appartient au super-utilisateur, tandis qu’un processus utilisateur est lancé par un utilisateur.

  • Un processus peut être interrompu à la réception d’un signal envoyé depuis un programme, notamment SIGINT ou SIGQUIT, ou depuis un shell avec la commande kill num_signal pid_processus.

2. Descripteurs et observation des processus

★ À maîtriser

  • La commande ps sans option affiche uniquement les processus associés au terminal depuis lequel elle est lancée.

  • Dans la sortie de ps, S indique l’état du processus : S signifie endormi, R actif, T stoppé et Z terminé en zombie.

Compléments

  • Un processus peut posséder au maximum OPEN_MAX descripteurs de fichier et peut en créer avec open, creat ou dup, en plus de ceux qu’il hérite de son père.

  • Dans ps, PID désigne l’identifiant du processus, PPID celui de son père, PGID celui de son groupe et SID celui de sa session.

  • Dans ps, UID identifie l’utilisateur propriétaire, PRI indique la priorité du processus, NI sa valeur nice, SZ sa taille en pages et WCHAN l’adresse de l’événement attendu par un processus endormi.

3. Mémoire, états et ordonnancement

★ À maîtriser

  • L’image mémoire d’un processus comprend :
    • la pile (stack)
    • le tas (heap)
    • le code (text)
    • les données (Data+BSS)

📌 La pile contient notamment les variables locales, les paramètres et les adresses de retour des fonctions, tandis que le tas sert à l’allocation dynamique de variables.

  • L’ordonnanceur Unix attribue à chaque processus une priorité dynamique recalculée périodiquement et applique le tourniquet (round robin) aux processus de même priorité.

📌 La fonction nice(incr) permet au processus d’augmenter incr dans l’intervalle [0-39], ce qui diminue sa priorité ; le super-utilisateur peut augmenter la priorité en donnant à incr une valeur inférieure à 0.

Compléments

  • Le code des fonctions est placé dans la zone code (text), qui est en lecture seule.

  • La zone Data+BSS contient les constantes et les variables initialisées ou non initialisées.

  • Le calcul de la priorité courante prend en compte une priorité de base liée au niveau d’interruption, le temps CPU récemment consommé et une priorité ajustable par le processus avec nice(incr).

  • Les états présentés pour un processus sont :

    • nouveau
    • prêt
    • actif utilisateur
    • actif noyau
    • bloqué
    • suspendu
    • zombie

4. Création et héritage des processus

★ À maîtriser

  • La primitive fork() crée un processus fils par duplication du processus appelant.

  • Après fork(), la valeur de retour est -1 en cas d’échec, 0 dans le fils et le PID du fils dans le père.

  • Le fils partage les données du père lorsqu’il y accède en lecture, mais une donnée est recopiée dans son espace local lorsqu’il y accède en écriture.

Compléments

  • getpid() renvoie l’identifiant du processus appelant et getppid() renvoie celui de son père.

  • Le fils n’hérite pas de l’identification de son père, de ses temps d’exécution, de ses signaux pendants, de sa priorité ni de ses verrous sur les fichiers.

  • Le processus fils hérite de nombreux attributs du père, mais les verrous sur les fichiers détenus par le père ne sont pas hérités.

5. Attente et terminaison des processus fils

★ À maîtriser

  • wait() et waitpid() suspendent le processus appelant jusqu’à la terminaison d’un processus fils et récupèrent les informations relatives à cette terminaison.

📌 wait() attend la terminaison d’un fils, tandis que waitpid() permet de sélectionner un fils particulier à partir de son PID.

  • Après la terminaison d’un fils, ses informations utiles au père restent conservées dans l’état zombie jusqu’à ce que le père les récupère avec wait() ou waitpid(), ce qui supprime le fils zombie.

Compléments

  • Le code de retour transmis par exit(code) peut être retrouvé dans etat en décalant etat de 8 bits.

Astuce mémo

Sans wait, la fin du fils laisse un zombie ; wait récupère ses informations et le supprime.

6. Arguments et environnement du programme

★ À maîtriser

  • La fonction main peut recevoir argc, argv et envp : argc compte les paramètres de la ligne de commande, nom de l’exécutable compris, argv contient ces paramètres sous forme de chaînes et envp contient les variables d’environnement sous la forme variable=valeur.

Compléments

  • Les noms argc, argv et envp sont conventionnels et peuvent être remplacés par d’autres noms.

  • getenv("SHELL") permet de récupérer la valeur de la variable d’environnement SHELL.

7. Recouvrement par les primitives exec

★ À maîtriser

  • Les primitives exec chargent en mémoire, à la place du processus fils, un autre programme provenant d’un fichier binaire.

  • Les variantes execv, execvp et execve transmettent les paramètres sous forme de tableau, tandis que execl, execlp et execle les transmettent sous forme de liste terminée par NULL.

Compléments

  • Dans les primitives exec, la lettre finale p désigne path et la lettre finale e désigne l’environnement.

📌 system("commande…") lance une commande en créant un nouveau shell pour l’interpréter.

Astuce mémo

execv transmet un vecteur ; execl transmet une liste.

Tableaux de synthèse

Transmission des paramètres aux primitives exec

FormePrimitivesTransmission
Vecteurexecv, execvp, execveParamètres sous forme de tableau
Listeexecl, execlp, execleArguments successifs terminés par NULL

Teste tes connaissances

Teste tes connaissances sur Architecture des systèmes avec 11 questions à choix multiples et corrections détaillées.

1. Sur un serveur monoprocesseur qui doit traiter plusieurs requêtes pendant que des opérations d’entrée-sortie sont en cours, quel intérêt les processus concurrents apportent-ils ?

2. Dans une commande shell, quelle différence s’applique entre `rapport ; statistiques` et `rapport | statistiques` ?

Faire le QCM →

Révisez avec les flashcards

Mémorisez les concepts clés de Architecture des systèmes avec 10 flashcards interactives.

À quoi servent les processus concurrents sur une machine monoprocesseur ?

À améliorer l’utilisation de la machine.

Qu’est-ce qu’un processus ?

Une instance d’un programme en exécution, associée à des données et à un BCP.

Qu’affiche la commande ps sans option ?

Les processus associés au terminal depuis lequel elle est lancée.

Voir les flashcards →

Cours similaires

Crée tes propres fiches de révision

Importe ton cours et l'IA génère fiches, QCM et flashcards en 30 secondes.

Générateur de fiches