Systèmes d'exploitation - Le niveau utilisateur IUT de Villetaneuse Département Informatique - Free

La page est créée Yann Lucas
 
CONTINUER À LIRE
IUT de Villetaneuse Département Informatique

                             1ère année

       Systèmes d’exploitation
                    Le niveau utilisateur
(Volume horaire du cours + travaux dirigés + travaux pratiques : 40 heures)

                        Pascal Coupey, bureau T209

                 email : Pascal.Coupey@iutv.univ-paris13.fr
2. Préambule
Préambule

L'enseignement du système d'exploitation à l'IUT de Villetaneuse est constitué de 3 parties:

        Le niveau utilisateur (40 heures)
        Fondements et mise en oeuvre (40 heures)
        Administration de systèmes (20 heures)

Cet enseignement doit apporter une bonne connaissance des systèmes d'exploitation
multitâches, multi-utilisateurs tant au niveau de son utilisation qu'au niveau de sa structure interne
et de sa mise en oeuvre. Il doit partir du postulat qu'une machine n'est pratiquement plus jamais
isolée et montrer ainsi les liens avec l'enseignement du réseau.

                                     Le niveau utilisateur
Objectifs: Ce module est une introduction aux systèmes d'exploitation. La
compétence recherchée consiste à savoir utiliser un système d'exploitation
multitâches, multi-utilisateurs. Il doit aussi permettre de comprendre les étapes qui
amènent à obtenir un programme en exécution à partir d'un programme en langage
source.

Remarques: Ce module ne nécessite aucun pré-requis sauf des notions
d'algorithmique pour les scripts et de programmation en langage C.

Mise en oeuvre: L'enseignement inclut une part importante d'applications par une
programmation en langage shell et en C.
Plan du cours
Page de garde
Préambule
       L'enseignement du système
       Le niveau utilisateur
Présentation des systèmes d'exploitation
       Introduction
       Structure du SE
       Interface utilisateur
       Les systèmes d'exploitation à l'IUT
       Terminal
Présentation d'Unix
       Introduction
       Structure d'Unix
       Débuter sous Unix
       Système de fichiers sous UNIX
       Les commandes Unix
       Les caractères génériques
       Le caractère backquoting "`"
       Les caractères de neutralisation
       Quelques commandes UNIX
Fichiers
       Types et protections
       Modifications des protections
       Système de fichiers (file system)
       Les liens
       La redirection des entrées-sorties
       Les tubes de communication
Les interpréteurs de commandes
       Introduction
       Les variables de l'interpréteur
            • En Bourne shell
            • En C-shell
            • Liens avec le C
       Les fichiers d'initialisation
Cycle programme
Introduction
            Du source à l'exécutable
            Le portage
            Les erreurs
            Variables en mémoire
      Processus
            Introduction
            Le parallélisme
            Utilité
            Problèmes
            Partage de l'UC
            Création d'un processus (sous UNIX)
            Distinction père, fils
            Changer le code d'un processus
            Quelques commandes et fonctions utiles
      Programmer en shell
            Introduction
            Le langage C-shell

suivant
3. Présentation des systèmes d'exploitation
Introduction
Contexte: Multitâches, multi-utilisateurs
   Plusieurs programmes s'exécutent "en même temps" (multi-tâches)
   Plusieurs utilisateurs (multi-utilisateurs)

Objectifs: Libérer les utilisateurs
   Utilisation commode et efficace du matériel
   Gestion de toutes les ressources de la machine (mémoire, périphériques, ...)
   Partage équitable des ressources en toute sécurité
Structure du système d'exploitation
Interface utilisateur
      Dialoguer avec le système = transmettre des commandes
Interpréteur de commande
    peu convivial
    puissant
    langage de programmation

ex: command.com et fichiers .bat (MsDos)
  sh, csh, tcsh, bash, ... + scripts (UNIX)

Appels systèmes ((en langage C) ex: chdir, mkdir, open, ...)
Interface graphique: icônes, menus, fenêtres, ...
    convivial
    moins efficace
    moins puissant
ex: Windows (Microsoft)
  Xwindow, Openwin, CDE, ... (UNIX)
Les systèmes d'exploitation à l'IUT
Terminal
Un terminal est un dispositif capable d'envoyer des caractères à l'ordinateur et d'afficher les
résultats à l'écran. Un terminal alphanumérique est en mode texte uniquement.

                         Il faut dissocier terminal et ordinateur
    Terminal relié à un ordinateur distant (ex à l'IUT: HPUNIX, VMS).
        Les commandes sont exécutées sur l'ordinateur distant.
    Terminal relié à un ordinateur local (ex à l'IUT: LINUX, MSDOS).
        Les commandes sont exécutées sur l'ordinateur local.
 Pour UNIX (LINUX) il est toujours possible d'ouvrir un terminal relié à un ordinateur distant relié
                                           au réseau.
4. Présentation d'UNIX
Introduction
              UNIX est un système multi-tâches, multiutilisateurs en temps partagé

Succès d'UNIX:
   Gratuité
   Adoption universitaire
   Standard
   Portabilité

Historique:
   1969: Bell Laboratories (AT&T) (K.Thomson,D.Ritchie)
   1973: 1ère version écrite en C (portabilité)
   1974: UNIX de Berkeley (BSD) et UNIX AT&T (System 5)
   1984: Norme Xwindow (indépendante d'UNIX)
   1987: Accord pour convergence de UNIX BSD et UNIX System 5 en Norme POSIX= intersection
   1988: Deux consortiums:
            OSF: Normalisation d'UNIX : OSF1
            UNIX international : UNIX System 5
                                à l'IUT: LINUX (compatible System 5)
Structure d'UNIX

Interface UNIX
     Bibliothèques de programmes exécutables: les commandes
     Des shells (interpréteurs de commandes)
     Langage de commandes (scripts)
Utilitaires
      Assembleurs, éditeurs de liens.
      Compilateurs (C, PASCAL, ADA, JAVA, ...)
      Traitements de texte (LATEX)
      Des outils de mise au point de programmes
      Des éditeurs de textes (ed, vi)
      Un système de messagerie
      Un analyseur syntaxique
      ...
Débuter sous UNIX
Connexion:
   Login: coupey
   Passwd: ******** (avec au moins un chiffre)
   $         (prompt UNIX)
Deconnexion:
   $logout
Début de session:
   Login (répertoire privé = répertoire de travail = /home/...)
   Puis
                    Boucle interpréteur

               sous LINUX (bash ou tcsh)
Système de fichiers sous UNIX
Sous UNIX: Une arborescence : LA racine (/)
Sous DOS: Plusieurs arborescences: A: B: C: ...

/etc : fichiers de configuration système
/home : répertoires utilisateurs
/dev : fichiers spéciaux
/var : fichiers temporaires pour les files d'attente et les fichiers de mail.
/usr : l'ensemble des commandes et des programmes
/sbin : exécutables pour l'administration système
Les commandes Unix

                      nom-de-commande            options      paramètres

                               ls                   -l             *.c

 Plusieurs commandes sur une ligne séparées par des ";":
ex: ls; date; who
 Une commande sur plusieurs lignes en tapant "\" avant le le return:
ex: grep "blablablablablablablablablablablablablablabla" \
    essai.txt
 Valeur de retour d'une commande: 0 si OK != 0 sinon

 ex: rm texte.doc renverra 0 si le fichier texte.doc existe, un code !=0 sinon
 Regroupement de commandes (.....):
     ex: (date; ls; who) > essai redirige le résultat des commandes date, ls et who dans le
                                                    fichier essai
                 date; ls; who > essai seul le résultat de who est redirigé vers essai
Les caractères génériques

*               : 0 ou plusieurs caractères quelconques
ex: ls *.c   liste tous les fichiers qui se terminent par .c

?               : 1 caractère quelconque
ex: ls tp?.pas liste tous les fichiers de trois caractères commençant par tp et
          d'extension .pas
[a,b] ou [ab] : 1 caractère a ou un caractère b
ex: ls [c,l]* liste tous les fichiers et répertoires qui commencent par c ou l
{ab,cd}         : la chaîne ab ou la chaîne cd
ex: ls {ab,cd}* liste tous les fichiers et répertoires qui commencent par ab ou cd
[a-zA-Z]       : 1 caractère alphabétique minuscule ou majuscule
[1-9A-Z]          : 1 caractère numérique ou alphabétique majuscule
ex: ls [a-z][0-9] liste tous les fichiers et répertoires de deux caractères commençant par
          une minuscule suivi d'un caractère numérique
Le caractère backquoting "`"
` `     : ce caractère permet d'utiliser le résultat d'une commande comme argument d'une
          autre commande
 ex:
   echo pwd
   pwd
      echo 'pwd'
      pwd
      echo `pwd`
      /home/pc
      echo "pwd"
      pwd
      echo "ma machine est `hostname` je suis l'utilisateur `whoami`"
      grep `whoami` *
Les caractères de neutralisation

  \   : neutralise le caractère spécial qui suit
  ex: ls pas\*.c   liste uniquement le fichier pas*.c s'il existe

  ' ' : neutralise une chaîne de caractères
  ex: ls 'pas*?1.c' liste uniquement le fichier pas*?1.c s'il existe

  " " : idem mais certains métacaractères sont interprétés comme l'évaluation d'une
  commande

ex: echo 'nous sommes le : `date`'
  nous sommes le : `date`
  echo "nous sommes le : `date`"
  nous sommes le : lun 19 nov
Quelques commandes UNIX
man: afficher le manuel (ex: man ls)
cd: changer de répertoire (ex: cd .., cd /home/users/coupey, cd ~coupey, cd)
pwd: afficher le répertoire courant
mkdir: créer un répertoire
rmdir: supprimer un répertoire
ls: lister les répertoires et fichiers (ex: ls -l)
more: afficher le contenu d'un fichier page par page
cp: copier un fichier (ex: cp essai /home/users/coupey, cp ../essai .)
mv: changer le nom d'un fichier ou d'un répertoire (ou déplacer un fichier ou un répertoire)
rm: supprime un ou plusieurs fichiers
touch: créer un fichier vide (ex: touch essai)
grep: recherche d'une chaîne dans un fichier (ex: grep init lisezmoi.txt)
5. Les fichiers
Types et protections
                                               Types de fichier

        ordinaire                                                                         (-)
        répertoire                                                                        (d)
        spécial: mode caractère                                                           (c)
        spécial: mode bloc                                                                (b)
        tube nommé                                                                        (p)
        lien symbolique                                                                   (l)
        socket                                                                            (s)
                                              Protections (droits)

              3 types d'utilisateurs                             3 modes principaux (fichiers et répertoires)
le propriétaire                         (u)            écriture                                 (w)
membres du groupe                       (g)            lecture                                  (r)
les autres utilisateurs du système (o)                 exécution                                (x)
Exemple
  $ ls -l /etc/passwd
  -rw-r--r-- 1 root bin 2055 Jul 28                 18:03     /etc/passwd
Précisions sur les droits des répertoires

R   autorisation de lister les fichiers du répertoire (ls)

X   autorise l'accès au répertoire (cd)

    autorise la modification du répertoire c'est à dire création, suppression, changement de nom
W
    des fichiers et des répertoires du répertoire
Modifications des protections
Modifications des droits

exemple: chmod ug+rx titi

exemple: chmod 660 toto (660 = rw-rw----)
Le masque (protection par défaut à la création d'un fichier ou répertoire)

masque = l'inverse des permissions
 exemple: par défaut rw- r-- ---
              110 100 000
       masque 001 011 111
              1 3 7

     Mais le système tient compte du bit X uniquement pour les répertoires.
       masque       0 2 7

        Pour un nouveau fichier les droits seront: rw- r-- ---
        Pour un nouveau répertoire les droits seront: rwx r-x ---

Changer le masque: commande umask (ex: umask 027)
Modifications du propriétaire et du groupe

   chown nouveau-propriétaire fichier
   chgrp nouveau-groupe fichier

exemples:
   chgrp bin toto change le groupe de toto en bin
   chown root titi change le propriétaire de titi en root (attention opération à sens unique)
Système de fichiers (File System sous Unix)

                                 1 file system = 1 table d'inodes
                    à 1 fichier est associé 1 inode (unique par file system)
exemple: ls -i toto
    6330 toto (6330 est le numéro d'inode)
                   La commande df permet de visualiser tous les file system
Les liens
                             Un lien = deux noms sur un même fichier

  Lien physique (même file system)              Lien symbolique (file system différents)
   ln fichier-existant   nouveau-nom      ln -s fichier-existant nouveau-nom
Lien physique donc même inode donc Lien symbolique donc inode différents. Le lien contient le
même file system                   texte du chemin vers le fichier
exemple:                               exemple:
 $ ls -i                                $ ls -i /tmp/essai
  6630 toto                              5540 essai
 $ ln toto titi                         $ ln -s /tmp/essai essai1
 $ ls -i                                $ ls -i
  6630 toto                              6323 essai1
  6630 titi
 $ cp titi tutu
 $ ls -i
  6630 titi
  6630 toto
  6631 tutu
La redirection des entrées-sorties

entrée standard               n°0 par défaut le clavier
sortie standard               n°1 par défaut le terminal actif (l'écran ou fenêtre active)
sortie des erreurs            n°2 par défaut le terminal actif (l'écran ou fenêtre active)
>              Redirection de la sortie standard
>>             Redirection de la sortie standard avec concaténation
<              Redirection de l'entrée standard
2> ou >&       Redirection des messages d'erreurs en shell (2>) et en c-shell (>&)
    ls > toto met le résultat de ls dans le fichier toto
     users >> toto concatène en fin du fichier toto le résultat de la commande users
     cat < f1 > f2 copie f1 dans f2
     ls > tutu
     more < tutu affiche le contenu des fichiers dont les noms sont dans tutu
     mail Dupond < lettre.txt un mail est envoyé à Dupond à partir du contenu du fichiers lettre.txt
     ls -l > temp1; grep "rwxr-xr-x" < temp1 > temp2; more temp2 ; rm temp1 temp2 liste, page par page, tous les fichiers du
     répertoire courant qui ont comme droits rwxr-xr-x
     echo "bonjour" > /dev/pts/2 affiche "bonjour" dans la fenêtre 2 (dans le cas où deux fenêtres de commandes sont
     ouvertes)
     rm lettre.txt 2> erreur.txt redirige le message d'erreur vers erreur.txt (le fichier lettre.txt n'existe pas)
     cat erreur.txt
     aucun fichier ou répertoire de ce type
Les tubes de communication
Un tube de communication est un flot de données qui permet de relier la sortie standard d'une
commande à l'entrée standard d'une autre commande sans passer par un fichier temporaire
exemples
    ls -l | more affiche page par page le résultat de la commande ls
    last | grep coupey | head affiche les dix dernières connexions sur la machine de l'utilisateur
    coupey
    ls -l | grep "rwxr-xr-x" | more affiche page par page la liste des fichiers qui ont les droits rwxr-
    xr-x. Cette commande donne le même résultat que
    ls -l > temp1; grep "rwxr-xr-x" < temp1 > temp2; more temp2; rm temp1 temp2

Avantages des tubes
    Toutes les commandes liées par le tube s'exécutent en parallèle. Par exemple, dans la
    commande ls -l | more la commande more récupère, au fur et à mesure, les lignes produites
    par la commande ls alors que dans la commande ls -l > toto; more toto , la commande more
    n'affichera toto que lorsque le ls sera terminé.
    Il n'y a pas de limite de taille pour le flot de données qui transite dans le tube (car il n'y a pas
    de fichier temporaire)
6. Les interpréteurs de commandes
Introduction
Un interpréteur de commande (shell) est un programme qui prend en charge l'utilisateur après le
                                            login.
Lors de la connexion d'un utilisateur, il y a exécution d'un programme ( bash ou sh ou csh ou tcsh
             ou ksh ou ... en fonction de ce qui est défini dans le fichier /etc/passwd)

Objectif:
    Traduire les commandes saisies par l'utilisateur afin que le système puisse les exécuter
Catégories de commandes:

   Commandes définies par un alias (pas d'exécution de programme associé à la commande)

     alias ls='ls -F'   en bash
     alias rmi rm -i    en c-shell

   Commandes internes au shell (pas d'exécution de programme associé à la commande)

     set, cd, echo, pwd, alias, ...

   Commandes externes indépendantes du shell (elles sont dans /usr/bin, /bin , ...) , il y a
   exécution d'un programme associé à la commande

     cp, rm, ls, ...
Les variables de l'interpréteur

Variables globales de l'interpréteur

   Variables internes: connues uniquement de l'interpréteur
   Variables d'environnement: connues de l'interpréteur et des
   commandes lancées à partir de l'interpréteur
exemples:
    PATH
    PROMPT
    HOME
    PRINTER
    LOGNAME
    SHELL
    DISPLAY
En Bourne-shell (Bash)
Affectation d'une variable interne
 nom-variable=valeur
    HOME=/home/xstra
    PATH=/bin:/usr/bin:/usr/contrib/bin
    x=3
    RDV=monagenda

La déclarer comme variable d'environnement
 export nom-variable
    IMPRIMANTE=laser
    export IMPRIMANTE

Lecture
 set             affiche toutes les variables et leur valeur
 env et printenv affichent uniquement les variables d'environnement
Utilisation
 $nom-variable
   echo $IMPRIMANTE
   laser

Suppression
 unset nom-variable
   unset IMPRIMANTE
En C-shell
Affectation d'une variable interne
 set nom-variable = valeur
   set home=/home/xstra
   set path=/bin:/usr/bin:/usr/contrib/bin
Affectation d'une variable d'environnement (par convention en majuscules)
 setenv nom-variable valeur ex: setenv IMPRIMANTE laser
Lecture
 set                   affiche toutes les variables internes et leur valeur
 setenv et printenv    affichent uniquement les variables d'environnement
Utilisation
 $nom-variable
Suppression
 unset nom-variable    ex: unset path
 unsetenv nom-variable
 unsetenv *    supprime toutes les variables d'environnement
Liens avec le C
Par le main:
 Le paramètre arge est un tableau de chaînes "nom-variable=valeur"
int main (int argc, char *argv[], char *arge[]);
argc : nombre d'arguments
argv : les arguments
arge : variables d'environnement
Exemple:
 essai 1 2 trois
 à l'entrée du programme essai
  argc = 4
  argv = ""essai" "1" "2" "trois""
  arge = ""PATH=/bin:/usr/bin:/usr/contrib/bin" "IMPRIMANTE=laser" ..."
Les fichiers d'initialisation
En bourne-shell:
  /etc/profile                fichier commun à tous les utilisateurs exécuté à la connexion
  .bash_profile               fichier de l'utilisateur (dans son répertoire d'accueil) exécuté à la connexion
 .bashrc                      fichier de l'utilisateur (dans son répertoire d'accueil) exécuté à chaque bash
.bash_logout                  exécuté à la sortie de la session
 PS1="`hostname`:`whoami`>"
 PATH=/bin:/usr/bin:/etc:/usr/contrib/bin:.
 LOGNAME=`whoami`
 ...

En C-shell:
 .login           exécuté à la connexion (définition des variables d'environnement,
                  initialisation de la variable TERM)
 .cshrc           exécuté à chaque exécution d'un c-shell (csh) (définition et initialisation des
                  variables internes au c-shell, définition des alias)
 .logout          exécuté à la sortie de la session
exemple d'un .cshrc:                                     exemple d'un .logout
  set path=(/bin /usr/bin /etc/usr/local/bin)              echo "********** fin de session **********"
  set mail=(10 /usr/mail/`whoami`)                         find $HOME -name core -exec rm{}\;
  set prompt='LinuxIUT>'
  ...
  alias del 'rm -i'
  alias dir 'ls -l'
7. Le cycle programme
Introduction
                                du code source à l'exécutable
Hiérarchie des langages
    langage machine
    langage d'assemblage
    langages évolués
Traducteurs
 code source ====> code cible
Programme-fichiers

                                  avec un fichier principal
                                      (Notion de projet)
Du source à l'exécutable
1. Compilation ==> Résultat = programme objet
 Pré-compilation (fichier par fichier) (Le résultat est encore en langage source)
    Traitement des macros (#define, #include, ...)

 Traduction du code source en langage d'assemblage (fichier par fichier)
    Références externes (ex: appels de fonctions externes)
    Références relogeables
     références absolue (ex: mov ax, data (reférence absolue))
     références à du code dont la position dans le programme complet est non connu (par exemple un
           branchement)

 Assemblage (fichier par fichier)
    langage d'assemblage ==> langage machine
      création des en-têtes

2. Edition des liens (tous les fichiers ensemble) ==> Résultat = Prog. exécutable
    Résolution des références externes
    Ajout des bibliothèques
    Les références absolues non encore résolues

3. Chargement
   Déterminer une adresse de chargement en mémoire centrale pour le programme exécutable
   Résolution des références absolues
   Saut au point d'entrée
Le portage
Les erreurs

Compilation:
 erreurs de syntaxe (ex: oubli d'une } ou d'un ;)

Edition des liens:
 problèmes de références externes (ex: oubli d'une bibliothèque)

Exécution:
 problèmes de conception (ex: boucle infinie)
Variables en mémoire
                             Portée + Durée de vie = classe de variable
En langage C:
    Portée
        variable dans un bloc: Variable locale au bloc
        variable hors de tout bloc: Variable globale à un fichier (static) ou à plusieurs fichiers
        (extern ou rien)
    Durée de vie
        automatique: allouée sur la pile, espace libéré si plus accessible
        statique: espace réservé jusqu'à la fin de l'exécution alloué en zone des données
Variable locale: automatique ou statique (si static)
Variable globale: nécessairement statique
Fonctions: statiques et globales
Cas particulier: Allocation dynamique en zone des données (ex: malloc)
Exemples
_________________________________________________________________________________________________________________________

/* fichier mymain.c */

extern int tab[ ];     globale à tout le programme, statique, pas d'espace réservé

int i,j=0; variables globales à tout le programme et statiques. Pour i, espace réservé en zone des données non
initialisées et zone des données initialisées pour j.

int code(int c); fonction globale à tout le programme, définie dans un autre fichier

....
_________________________________________________________________________________________________________________________

/* fichier util.c */

int tab[50]; variable globale à tout le programme et statique. 50 entiers en zone des donnés non initialisées

static int aux[29]={11,32,53,...}; variable globale au fichier util.c et statique. 29 entiers en zone des données initialisées

int code (int c) fonction globale à tout le programme et statique
{
  static int num; variable locale à code et statique, espace réservé en zone des données jusqu'à la fin de l'exécution.

    int temp; variable locale à code et automatique alloué sur la pile

    ...
}
8. Les processus
Introduction
Un processus est une abstraction d'un programme en exécution ou encore
Un processus est un objet indépendant associé à un programme en exécution
 exemples:
    more toto création d'un processus en avant plan associé à la commande more
    emacs titi & création d'un processus en arrière plan associé à l'éditeur emacs
    essaitd1 & création d'un processus en arrière plan associé à l'exécutable essaitd1

à un même programme peut être associé plusieurs processus: par exemple le compilateur ou un
programme de réservation de billets SNCF
Chaque processus a son propre compteur ordinal, ses propres registres, ses variables, son
pointeur de pile, ses fichiers ouverts, ...
On trouve les processus sur les systèmes multitâches.
 Multitâches = plusieurs tâches (processus) peuvent s'exécuter en "même temps"
 exemples: UNIX, OS2, Windows NT, Windows 2000, VMS
Sur un système multitâches toute unité d'exécution est un processus (tout est processus)
 exemple: les DAEMONS sont des processus système en attente de requête à traiter (IMP,
MAIL, ...)
  Donc les programmes système + programmes utilisateurs en exécution sont un ensemble de
              processus qui naissent, vivent leur vie, communiquent et meurent...
Le parallélisme
      "Indépendance", en "même temps" indiquent un certain parallélisme d'exécution

Deux types de parallélisme:
   Le "vrai" parallélisme: deux activités au même instant
      Plusieurs UC
      Entrées-sorties // UC

   Le "pseudo" parallélisme: partage de l'UC entre les processus
      Récupérer le temps des entrées-sorties
      Temps partagé: allouer l'UC par tranche de temps

    Les processus sont des spécialistes indépendants qui coopèrent
               éventuellement avec d'autres processus.
   Toute la difficulté réside dans la communication des processus, leur
  synchronisation et le partage des ressources (UC, disques, mémoire,
                                     etc.)
Utilité
Au niveau système
    simplification de la conception: ensemble de spécialistes qui interagissent
    maintenance: si problème, cf. le spécialiste associé
    clarté et visibilité: chaque service (ensemble de processus) est clairement défini avec des
    noms clairs et parlants
    adaptation: ne pas utiliser une partie du système => ne pas exécuter les spécialistes
    associés
    performances: grâce au parallélisme. Un processus met à jour des données sur un disque
    pendant qu'un autre affiche des données à l'écran et qu'un autre enfin envoie un mail
exemple: 2 programmes
 P1 = lecture disque (50) + exécution (100) + impression (100)
 P2 = exécution (50) + impression (50) + lecture disque (50) + exécution (100)
            tps total = P1 + P2 = 500 si aucun parallélisme
            tps total = P1 || P2 = 250 si parallélisme
Au niveau utilisateur
    Aspects génie logiciel (1 processus = un spécialiste)
        maintenance
        réutilisabilité
        clarté du code
    Performances: grâce au parallélisme
    Transparence / réseaux: exemple du client-serveur Xwindow

exemple:
    trier le fichier f1 sur le disque 1 = 100
    trier le fichier f2 sur disque 2 = 100
    fusionner f1 et f2 en f3 = 50

            Un seul processus                           plusieurs processus

                  trier(f1)                            créerprocessus(trier f1)
                  trier(f2)                            créerprocessus(trier f2)
              fusionner(f1,f2)                           attendre fin des tris
                                                           fusionner(f1,f2)
                temps = 250                                 temps = 150
Problèmes
Communiquer: Des processus qui coopèrent doivent pouvoir communiquer, se synchroniser
Partager les ressources: Des processus partagent l'UC, la mémoire, des fichiers, des variables, ...
exemple:

==> deux primitives de synchronisation de processus: P (pour réserver une ressource) et V (pour
                                           la libérer)
exemple:
    P(place); se-garer; pour occuper la place si elle est libre, en attente si place occupée
    V(place);           pour libérer la place, débloque le premier processus bloqué
Partage de l'UC

   activer: Donner l'UC. C'est l'ordonnanceur qui s'occupe de choisir un processus prêt.
   désactiver: Le processus a utilisé son crédit d'UC
   mise en attente: le processus attend un évènement (ex: fin d'entrée-sortie)
   fin d'attente: l'évènement attendu par le processus est arrivé.

==> 3 états
   en attente (ou bloqué)
   prêt (à recevoir l'UC)
   actif (élu): en exécution
Création d'un processus (sous UNIX)
exécution d'une commande
      L'exécution de pratiquement toutes les commandes donne lieu à la création d'un
      processus
  exemple: cat chapitre1 chapitre2 chapitre3 | grep arbre
               ==> deux processus qui communiquent à travers un "tube" (pipe).
                       Dans l'exemple la sortie du cat est l'entrée de grep

        grep peut être "en attente" si cat n'a pas produit de lignes ...
l'éxécution de tout programme donne lieu à la création d'(au moins) un processus.
   le chargement du système donne lieu à la création de plusieurs processus (INIT, MAIL,
   IMP ...)
   la primitive C fork() permet la création d'un processus clone du père (c'est à dire le processus
   associé au programme qui exécute le fork()).

                                           /*programme essai */
                                           main()
                                           {
                                           printf("coucou avant création");
                                           fork();
                                           printf("coucou après creation");
                                           }
                                           $essai
                                           "coucou avant création"
                                           "coucou après création"
                                           "coucou après création"

main ()                                          main ()
{fork(); ==> combien de processus?               {fork(); ==> combien de processus?
fork();}                                         fork();
                                                 fork();}

              Chaque processus créé est identifié par un numéro unique: son PID
Distinction père, fils
                                    Grâce à la valeur de retour du fork
Si la valeur de retour est 0 alors c'est le fils
Si la valeur de retour est >0 alors c'est le père (la valeur est le pid du fils)
Si la valeur de retour est  0) {/* c'est le père */}
    else {/* c'est le fils (pid ==0) */}
    }
La fonction getpid() permet à un fils de connaître son propre PID
La fonction getppid() permet de connaître le PID de son père.
Tous les processus sont organisés sous forme d'un arbre dont INIT est la racine. Chaque
                           processus a un et un seul père.
Changer le code d'un processus
            int execlp(const char *path, const char *arg0, ..., const char *argn, char*);
==> Permet de faire exécuter un autre programme à un processus
Attention: Les instructions qui suivent execl ne seront jamais exécutées.
exemple:
 main()
 {
 int pid;
 pid = fork();
 if (pid < 0) {/* problème */}
 else if (pid == 0) { execlp("~/bin/chess","chess",NULL);
              printf("coucou");}
 printf("coucou je suis le père");
 }
==> Le processus fils exécutera le programme exécutable " chess" après l'éxecution de
l'instruction execlp au lieu du programme associé à son père.
==> Le printf("coucou") ne sera pas exécuté.
Quelques commandes et fonctions utiles
ps: visualiser les processus
kill: détruire un processus. exemple: kill 17142
&: lance un processus en arrière plan. exemple:essaitd &
ctrl c: détruit le processus qui tourne en avant plan (=kill -9)
ctrl z: suspend le processus qui tourne en avant plan
jobs: visualiser les travaux (programmes en exécution) qui dépendent d'un shell.
fg: fait passer un travail d'arrière plan en avant plan.
bg: fait passer un travail d'avant plan en arrière plan.
wait: (fonction C) permet à un père d'attendre la terminaison de l'un de ses fils.
sleep(T): (fonction C) suspend un processus pendant un temps T.
9. Programmer en shell
Introduction
       Le shell est à la fois un interpréteur de commande et un langage de programmation
                 Un fichier en langage shell est un script (fichier de commandes)
Le langage shell:
    instructions
    variables
Instructions
    Toutes les commandes UNIX
    L'invocation de programmes exécutables (ou de scripts) avec passage de paramètres
    Assignation de variables
    Instructions conditionnelles et itératives
    Instructions d'entrée-sortie
Remarques
    Le shell est un langage interprété
    Il est possible d'invoquer un script dans un shell (ex: csh) à partir d'un autre type de shell (ex:
    bash)
    La première ligne d'un script doit être le nom du shell qui doit être invoqué (ex: #!/bin/bash)
Le langage bash
Avantages du bash
    Syntaxe riche
    Compatible avec le Bourne shell
    Définitions de fonctions
    Gestion de l'historique
    Utilisation des alias
    Utilisation des tableaux
    Plus fiable que le csh
    Évaluation d'expressions arithmétiques facile
Inconvénient: Une certaine lenteur d'exécution, comme tous les shells
Syntaxe (complémentaire) du bash
    Lecture d'une variable
    read variable
    >read a
    bonjour
    >echo $a
    bonjour
    Création d'un alias
    salias nom=valeur
    >alias rm='rm -i'
    >alias cx='chmod u+x'
    >cx toto
Tableaux de variables (listes)
      liste=(... ... ... ...)
       >arbres=(acacia sapin meloze aulne hêtre chêne)
       >echo ${arbres[*]}
       acacia sapin meloze aulne hêtre chêne
       >echo $arbres[3]
       aulne
       >echo ${#arbres[*]}
       6

     Structures de contrôle (1=vrai 0=faux): une expression booléenne de contrôle est sous la
     forme [[ exp ]] ou (( exp )) pour les expressions arithmétiques
If expression                                            case valeur in
then                                                     label) commandes ;;
   commande                                              ...
   ...                                                   [*) commandes ]
[elif expression ; then                                  esac
   commande
   ...]                                                  while expression
[else                                                    do
   commande                                                 commande
   ...]                                                     ...
fi                                                       done
for nom in liste                                         for expression
do                                                       do
   commande                                                 commande
   ...                                                      ...
done                                                     done
Les tests sur les fichiers
-x nom     l'utilisateur a-t-il le droit en exécution?
-r nom     l'utilisateur a-t-il le droit en lecture?
-w nom     l'utilisateur a-t-il le droit en écriture?
-e nom     existe-il?
-O nom      l'utilisateur est-il propriétaire?
-s nom     est-il non vide?
-f nom     est-il standard?
-d nom     est ce un répertoire?
Passage de paramètre
$1 ... $n      paramètres
$0         le nom du script
$*        la liste des paramètres ($1 ... $n)
$#        le nombre de paramètres
Opérations arithmétiques (( … ))
+ - * / ...
 x=32
 y=8
(( z=$x + $y ))
 echo $x $y $z
 32 8 40
echo $(( $x + $y + $z ))
80
Exemples de scripts
script essaipar                               Script essaifor

#!/bin/bash                                    #!/bin/bash
echo $0 a été appelé avec $# paramètres        for x in $*
echo qui sont : $*                             do
                                                echo $x
                                               done
essaipar a b 1 2
essaipar a été appelé avec 4 paramètres
qui sont : a b 1 2

script essaific                                script essaiarith

#!/bin/bash                                    #!/bin/bash
 if [[ $1 == "" ]]                             for (( x=0 ; x
FIN
Vous pouvez aussi lire