Devoir Surveillé en Système d'exploitation

Questions de cours (10 points) Question 1 - Activités liées à la gestion des processus Le système d'exploitation joue le rôle de chef d'orchestre pour les processus. Selon le corrigé de l'examen, ses trois activités principales dans ce domaine sont : L'allocation du microprocesseur (CPU) : Le système détermine quel processus a le droit d'utiliser le processeur à un instant donné (ordonnancement).

D'après le document Devoir Surveillé en Système d'exploitation

Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Devoir Surveillé en Système d'exploitation

Document source

Devoir Surveillé en Système d'exploitation

Informatique, Système d'exploitation · PDF · 4 pages · 2009

Afficher l'aperçu du document

Consulter le document original →

Questions de cours (10 points)

Question 1 - Activités liées à la gestion des processus

Le système d'exploitation joue le rôle de chef d'orchestre pour les processus. Selon le corrigé de l'examen, ses trois activités principales dans ce domaine sont :

  1. L'allocation du microprocesseur (CPU) : Le système détermine quel processus a le droit d'utiliser le processeur à un instant donné (ordonnancement).
  2. L'allocation de la mémoire : Il fournit l'espace mémoire dont un processus a besoin pour s'exécuter.
  3. La récupération des ressources : Il libère et récupère l'espace mémoire utilisé par un processus une fois que ce dernier est terminé.

Question 2 - Activités liées à la gestion de la mémoire

La gestion de la mémoire est primordiale pour la stabilité et la sécurité du système. Ses rôles clés sont :

  • La répartition et la sécurité : Distribuer la mémoire disponible entre les processus actifs tout en assurant une sécurité réciproque (un processus ne doit pas pouvoir lire ou modifier l'espace d'un autre).
  • La localisation : Garder la trace de l'emplacement des données de chaque processus.
  • Le maintien de l'intégrité : Protéger certains espaces critiques (comme les zones réservées aux opérations d'entrées/sorties ou au noyau).
  • La gestion de la mémoire virtuelle et de la pagination : Permettre l'exécution de processus nécessitant plus de mémoire que la RAM physique disponible, en utilisant l'espace disque.

Question 3 - Les directives d'assemblage

Contrairement aux instructions qui sont traduites en code machine (binaire), les pseudo-instructions (ou directives) s'adressent directement aux outils de la chaîne de compilation (assembleur, éditeur de liens, chargeur). Le corrigé attendait trois exemples précis :

  1. La directive Orig (ou ORG) :

    • Rôle : Définit l'adresse mémoire de départ pour le bloc de code qui suit.
    • Portée : Assemblage et chargement.
    • Transmission : Elle est transmise au chargeur sous la forme d'une métadonnée indiquant où implanter le bloc dans la mémoire physique.
  2. La directive segment (ou SEGMENT / DATA / CODE) :

    • Rôle : Découpe le programme en zones logiques distinctes (code, données, pile).
    • Portée : Édition de liens et chargement.
    • Transmission : Transmise à l'éditeur de liens pour lui permettre de regrouper les segments de même nature provenant de différents fichiers objets.
  3. Les directives IMPORT et EXPORT (ou EXTRN et PUBLIC) :

    • Rôle : Rendent des étiquettes (variables ou fonctions) accessibles depuis d'autres fichiers (EXPORT) ou signalent qu'une étiquette utilisée est définie dans un autre fichier (IMPORT).
    • Portée : Édition de liens.
    • Transmission : L'assembleur transmet ces directives sous forme de tables de symboles (résolus et non résolus) à l'éditeur de liens.

Question 4 - L'enchaînement de commandes (Bourne Shell)

Le shell permet de combiner plusieurs commandes sur une même ligne. Voici les opérateurs demandés :

  • ; : Exécution séquentielle. La commande de gauche s'exécute, puis celle de droite, quel que soit le résultat de la première.
  • & : Exécution asynchrone (en arrière-plan). La commande s'exécute en tâche de fond, le shell rend immédiatement la main à l'utilisateur.
  • && : Exécution conditionnelle (ET logique). La commande de droite ne s'exécute que si la commande de gauche a réussi (code de retour égal à 0). Il a une priorité plus forte que ; et &.
  • || : Exécution conditionnelle (OU logique). La commande de droite ne s'exécute que si la commande de gauche a échoué (code de retour différent de 0). Il a une priorité plus forte que &&.
  • | : Tube (Pipe). Transmet la sortie standard de la commande de gauche vers l'entrée standard de la commande de droite.

Question 5 - La redirection des entrées/sorties

Par défaut, un processus lit ses données depuis l'entrée standard (le clavier), affiche ses résultats sur la sortie standard (l'écran) et ses erreurs sur la sortie d'erreur (l'écran également). Les redirections modifient ce comportement :

  • ls > out.txt : L'opérateur > redirige la sortie standard. Au lieu de s'afficher à l'écran, le résultat de la commande ls (la liste des fichiers) est écrit dans le fichier out.txt.
  • commande 2> erreur.txt : L'opérateur 2> redirige le flux d'erreur (le flux numéro 2). Si la commande génère un message d'erreur, il sera stocké dans erreur.txt.
  • cat < input.txt > output.txt : Combine deux redirections. Le flux d'entrée est branché sur input.txt (<), et le résultat est déversé dans output.txt (>).

Question 6 - Les tubes (Pipes)

Un tube (|) connecte directement le flux de sortie d'une commande au flux d'entrée de la suivante, sans utiliser de fichier intermédiaire sur le disque dur.

  • Exemple avec tube : who | wc -l (La commande who liste les utilisateurs connectés. Au lieu d'afficher cette liste, le tube l'envoie à wc -l qui compte le nombre de lignes reçues, ce qui donne le nombre d'utilisateurs connectés).
  • Équivalent avec des redirections : who > temp ; wc -l < temp ; rm temp (On écrit dans un fichier temporaire, on demande à wc de lire ce fichier, puis on doit nettoyer le disque en supprimant ce fichier. Le tube évite toute cette lourdeur).

Question 7 - Multiprogrammation vs Multitâche

  • La multiprogrammation : C'est la capacité de garder plusieurs programmes en mémoire. Lorsqu'un programme s'interrompt (par exemple pour attendre une opération de lecture sur le disque), le système donne la main à un autre programme, un par un.
  • Le multitâche : C'est un concept plus avancé. Le système alterne si rapidement l'allocation du processeur entre les différents processus que l'utilisateur a l'illusion qu'ils s'exécutent simultanément (pseudo-parallélisme).

Motivation : La motivation principale de ces deux techniques est d'optimiser l'utilisation des ressources de l'ordinateur, en particulier pour éviter que le microprocesseur ne reste inactif.

Question 8 - Les variables d'environnement

L'environnement d'un processus shell est défini par des variables.

  • On l'enrichit en modifiant les variables prédéfinies du système (comme PATH pour les chemins de recherche des exécutables, HOME pour le répertoire utilisateur, ou PS1 pour le format de l'invite de commande).
  • On transmet ces variables aux processus enfants (les autres appels de shell ou scripts) à l'aide de la commande export. Sans export, une variable reste strictement locale au shell courant.

Exercice 1 - Analyse d'une session de travail (5 points)

Note : L'énoncé d'origine présente un texte partiellement corrompu par la numérisation lors de la commande cd ../public ; ls (qui affiche public et pubic au lieu des répertoires attendus doc et prog, et fileset.p vs fileext.p). Nous rétablissons la cohérence logique dans l'arborescence ci-dessous.

Question 1.1 - Arborescence du système

En analysant les retours de la commande ls -l et les déplacements (cd ../public), on déduit la structure suivante :

/ (racine) └── usr ├── bin │ ├── grep │ ├── wc │ └── who ├── oms └── public ├── doc └── prog ├── add.c ├── cmd ├── common ├── dodash.c ├── ex.c ├── fileset.p ├── getprnt ├── makset.c ├── prio.p ├── temp ├── temp1 ├── temp2 ├── temp3aa ├── temps ├── trans.c ├── xindex.c └── xlate.c

Question 1.2 - Droits d'accès

  • Créer un fichier sous /usr/bin : Non. L'affichage drwxr-xr-x root pour /usr/bin indique que le répertoire appartient à root. L'utilisateur public fait partie de la catégorie des "autres" (le dernier r-x), il a le droit de lire et traverser le répertoire, mais pas d'y écrire.
  • Modifier le fichier /usr/bin/grep : Non. Les droits du fichier sont -rwxr-xr-x root. Là encore, seuls le propriétaire (root) possède le droit de modification (w).

Question 1.3 - Exécution du script "cmd"

(L'utilisateur "public" est dans le répertoire prog) L'enchaînement est le suivant : chmod +x cmd donne les droits d'exécution au fichier cmd. Ensuite, bash cmd & lance le script en arrière-plan, et immédiatement après, ./cmd le lance en premier plan. Le script s'exécute donc deux fois, en parallèle.

Voici ce que fait chaque exécution ligne par ligne :

  1. ls *.c : Affiche tous les fichiers se terminant par .c (add.c, dodash.c, ex.c, makset.c, trans.c, xindex.c, xlate.c).
  2. rm temp? : Le métacaractère ? remplace exactement un caractère. Cela supprime les fichiers temp1 et temp2.
  3. ls tem* : Affiche tous les fichiers commençant par "tem" encore existants. Cela listera temp, temp3aa et temps.
  4. cat x* | wc -l : Le shell va concaténer le contenu de tous les fichiers commençant par "x" (xindex.c et xlate.c), l'envoyer dans le tube, et wc -l affichera le nombre total de lignes cumulées de ces fichiers.

Question 1.4 - Amélioration du script "getprnt"

(Attention, l'énoncé source numérote cette question "3" par erreur). Le script getprnt utilise un fichier temporaire lourd : ls /usr/bin > temp0 pr temp0 > /dev/lp rm temp0

On peut accomplir la même chose en une seule ligne grâce à l'utilisation d'un tube (pipe), ce qui est beaucoup plus performant d'un point de vue sémantique et ne nécessite pas de créer un fichier sur le disque : ls /usr/bin | pr > /dev/lp

Question 1.5 - Fichier .profile de l'utilisateur "oms"

Le fichier .profile est lu automatiquement à la connexion. Voici les commandes pour répondre au cahier des charges :

# 1. Définition de l'émulation du terminal
TERM=xterm
export TERM

# 2. Ajout du chemin des exécutables au PATH (en conservant les anciens)
PATH=$PATH:/usr/bin:/usr/public/prog
export PATH

# 3. Affichage de la date du jour
date

# 4. Liste des utilisateurs connectés
who

Exercice 2 - Programmation Shell (5 points)

Script de traitement de fichiers

Note pédagogique : Le corrigé source présente une solution fonctionnelle pour un vieux système UNIX (utilisant expr et cut), mais qui est très vulnérable (problèmes si le nom de fichier contient des espaces, ou si la sortie de wc possède des espaces initiaux). Nous avons réparé le script en utilisant une syntaxe POSIX moderne et sécurisée, tout en respectant scrupuleusement la logique demandée.

#!/bin/sh

# Vérifier qu'il y a au moins un argument (le nombre d'arguments $# doit être supérieur à 0)
if [ $# -eq 0 ]; then
    echo "Il faut donner au moins un fichier comme paramètre."
else
    totalligne=0
    
    # Itérer sur tous les arguments passés au script
    for file in "$@"; do
        
        # Vérifier si l'argument est un fichier ordinaire (-f)
        if [ -f "$file" ]; then
            # Compter les lignes. 
            # La syntaxe < "$file" évite que wc n'affiche le nom du fichier.
            nrligne=$(wc -l < "$file")
            
            # Additionner au total
            totalligne=$((totalligne + nrligne))
            
            echo "Le fichier $file contient $nrligne ligne(s)."
        else
            echo "Le paramètre $file n'est pas un fichier ordinaire."
        fi
        
    done
    
    echo "Le total du nombre de lignes est $totalligne."
fi

Améliorations apportées au code source :

  • Utilisation de "$@" au lieu de $* : Cela permet de préserver les espaces éventuels dans les noms de fichiers.
  • Utilisation de $(wc -l < "$file") au lieu de wc -l $file | cut -d' ' -f1 : En redirigeant le fichier dans wc, ce dernier renvoie uniquement le nombre, rendant la commande cut inutile et le code beaucoup plus robuste.
  • L'opération mathématique utilise $(( ... )), qui est le standard natif du shell moderne, plus efficace que l'appel à la commande externe expr.

Méthode

Pour aborder ce type d'épreuve de système d'exploitation, voici la méthode à adopter :

  1. Rigueur sur les définitions : Ne confondez pas les outils (le système d'exploitation gère les processus, pas les utilisateurs ; l'éditeur de liens lie des fichiers objets, pas des programmes sources). La précision du vocabulaire rapporte toujours les points de cours.
  2. Lecture des permissions : Face à un ls -l, lisez toujours de gauche à droite : Propriétaire (u), Groupe (g), Autres (o). Demandez-vous toujours "Qui suis-je ?" (ici, l'utilisateur public face à un répertoire de root) avant de répondre à une question d'accès.
  3. Méfiance envers l'expansion du shell (Globbing) : Lorsque vous voyez des jokers comme * ou ?, vérifiez l'état exact du répertoire à l'instant de l'exécution. Dans l'exercice 1, temp? a détruit temp1 et temp2 avant que tem* ne soit exécuté. L'ordre des lignes dans un script est absolu.
  4. Programmation Shell défensive : Quand on vous demande un script, commencez toujours par traiter les exceptions (le if [ $# -eq 0 ]). N'oubliez jamais les guillemets autour de vos variables ("$file") : un professeur pénalisera toujours un script qui plante dès qu'un nom de fichier contient un espace.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions