X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=unix_prog_web%2Funix_prog_web_02.xhtml;fp=unix_prog_web%2Funix_prog_web_02.xhtml;h=0000000000000000000000000000000000000000;hb=8a2e36282654d761b5bee1b2832d25f27097094b;hp=829822618c520c37ff431433e1f673e340895eda;hpb=6e8bc5175a0d55e46d072fce27496d93beee3f83;p=hacks%2FsimpleWebSlides.git diff --git a/unix_prog_web/unix_prog_web_02.xhtml b/unix_prog_web/unix_prog_web_02.xhtml deleted file mode 100644 index 8298226..0000000 --- a/unix_prog_web/unix_prog_web_02.xhtml +++ /dev/null @@ -1,1276 +0,0 @@ - - - - - Systèmes d'exploitation (2/2) - - - - - - - - - - - - - - - - - - - - -
-

Unix et Programmation Web

-

Cours 2

-
kn@lri.fr
- http://www.lri.fr/~kn -
-

Gestion des processus

- -
-

Définitions

- - - - - - - - - - - - - - - -
Programme séquences d'instructions effectuant - une tâche sur un ordinateur
Exécutable fichier binaire contenant des - instructions machines interprétables par le - microprocesseur
Thread plus petite unité de traitement (≡ - séquence d'instructions) pouvant être ordonnancée par - l'OS -
Processus instance d'un programme (≡ « un - programme en cours d'exécution »). Un processus est constitué - de un ou plusieurs threads.
-
- -
-

Exemple: programme

-

Dans un fichier « counter.c » - (attention c'est du pseudo - C)

-
- int count = 0; - int exit = 0; - void display() { - while (exit == 0) { - sleep (3); - printf("%i\n", count); - } - } - void listen() { - while (exit == 0) { - wait_connect(80); - count++; - } - } -
- void main () { - run_function(display); - run_function(listen); - while (getc () != '\n') { }; - exit = 1; - return; - } -
-
-
-

Exemple: programme

-

Compilation
- - gcc -o counter.exe counter.c -
- Le fichier « counter.exe » est un - exécutable (fichier binaire contenant du code machine)
- - ./counter.exe ← il faut la permission +x sur le fichier - -
- Le contenu de l'exécutable est copié en mémoire et le processeur - commence à exécuter la première instruction du programme. -

-
-
-

Exemple: threads

-
    -
  1. main
  2. -
  3. attente d'un évènement clavier - →←changement de thread -
  4. -
  5. listen
  6. -
  7. attente de connexion →←changement de thread -
  8. -
  9. display (affiche - 0 à l'écran)
  10. -
  11. attente pendant 3s → (les - 3 threads attendent un évènement externe)
    - nouvelle connexion sur le port 80 ← - réveil du thread listen -
  12. -
  13. listen - (incrémente count)
    - attente de connexion →
    - … fin des 3s
    - ← - réveil du thread display -
  14. -
  15. display (affiche - 1 à l'écran)
  16. -
-

Les threads partagent leur mémoire (variables communes)

-
-
-

Exemple: processus

-

(différence: les processus - ne partagent pas leur espace mémoire)

-
    -
  1. Exécution de counter.exe pendant 50㎲ -
  2. -
  3. Exécution - de firefox.exe - pendant 50㎲
  4. -
  5. Exécution du processus qui dessine le bureau pendant 50 - ㎲
    …
  6. - -
-

C'est le gestionnaire de processus qui décide quel - programme a la main et pour combien de temps (priorité aux - tâches critiques par exemple)
- Le système d'exploitation stocke pour chaque processus un - ensemble d'informations, le PCB (Process Control Block). -

-
-
-

Proccess Control Block

-

Le PCB contient:

- -
-
-

Opérations sur les processus

- -
-
-

États d'un processus

-

Un processus change d'état au cours de son exécution

- - - - - - -
Nouveau le processus est en cours de création
Exécution le processus s'exécute
En attente le processus attend un évènement - particulier (saisie au clavier, écriture sur le disque, - …)
Prêt le processus est prêt à reprendre son - exécution et attend que l'OS lui rende la main
terminé le processus a fini son exécution
-
-
-

États d'un processus

-

L'OS détermine et modifie l'état d'un processus:

- -
-
-

États d'un processus

- - - - - - - - - Nouveau - Prêt - En exécution - En attente - - - - - - - - - - Terminé - - - - - mise en routepar l'ordonnanceur - interruptionpar l'ordonnanceur - attente E/Sinterruption - fin E/Sint. traitée… - terminaisonnormale - terminaisonanormale - - - -
-
-

La commande ps

-

Permet d'avoir des informations sur les processus en cours - d'exécution (voir « man ps » pour les - options):
- $ ps -o user,pid,state,cmd x - USER PID S CMD - … - kim 27030 Z [chrome] <defunct> - kim 27072 S /opt/google/chrome/chrome --type=renderer - kim 29146 S bash - kim 29834 S evince - kim 29858 S emacs cours.xhtml - kim 29869 R ps -o user,pid,state,cmd x -
-

- -
-
-

États des processus (sous Linux)

- - - - - - -
R Running (en cours d'exécution)
S Interruptible sleep (en attente, - interruptible)
D Uninterruptible sleep (en attente, - non-interruptible)
T Stopped (interrompu)
Z Zombie (terminé mais toujours - listé par le système)
-
- -
-

Signaux

-

L'OS peut envoyer des signaux à un processus. Sur réception - d'un signal, un processus peut interrompre son comportement normal - et exécuter son gestionnaire de signal. Quelques signaux: -

- - - - - - - - - -
Nom Code Description
HUP 1 demande au processus de - s'interrompre
INT 2 demande au processus de se - terminer
ABRT 2 interrompt le processus et produit - un dump
KILL 9 interrompt le processus immédiatement -
SEGV 11 signale au processus une erreur mémoire -
STOP 24 suspend l'exécution du processus -
CONT 28 reprend l'exécution d'un processus suspendu -
-
-
-

Processus et terminal

-

Un processus est lié au terminal dans lequel il est - lancé. Si on exécute un programme dans un terminal et que le - processus ne rend pas la main, le terminal est bloqué - - - $ gedit - - - On peut envoyer au processus le signal STOP en - tapant ctrl-Z dans le terminal: - - - $ gedit - ^Z - [1]+ Stopped gedit - - - Le processus est suspendu, la fenêtre est gelée (ne répond plus). -

-
-
-

Processus et terminal

-

On peut reprendre l'exécution du programme de deux - manières:
- $ fg
- Reprend l'exécution du processus et le remet en avant plan (terminal - bloqué)

- $ bg
- Reprend l'exécution du processus et le remet en arrière plan (terminal -libre)

- On peut lancer un programme - directement en arrière plan en faisant:
- $ gedit &
- On peut envoyer un signal à un - processus avec la commande « kill [-signal] pid Â»
- $ kill -9 2345
-

-
-
-

Processus et entrées/sorties

-

Le terminal et le processus sont liés par trois fichiers - spéciaux:

-
    -
  1. L'entrée standard (stdin), reliée - au clavier
  2. -
  3. La sortie standard (stdout), reliée - à l'affichage
  4. -
  5. La sortie d'erreur (stderr), reliée - à l'affichage
  6. -
-

Dans le shell, on peut utiliser les - opérateurs <, > - et 2> pour récupérer le contenu - de stdin, stdout - et stderr:
- -$ sort < toto.txt -$ ls -l > liste_fichiers.txt -$ ls -l * 2> erreurs.txt - -

-
-
-

Processus et entrées/sorties

-

Dans le shell, l'opérateur | permet - d'enchaîner la sortie d'un programme avec l'entrée d'un - autre:
- $ ls -l *.txt | sort -n -r -k 5 | head -n 1 -

-
    -
  1. affiche la liste détaillée des - fichiers textes
  2. -
  3. trie (et affiche) l'entrée standard par ordre - numérique décroissant selon le 5ème champ
  4. -
  5. affiche la première ligne de - l'entrée standard
  6. -
-
- -rw-rw-r 1 kim kim 471 Sep 14 16:25 bd.txt - -rw-rw-r 1 kim kim 234 Sep 15 17:46 foo.txt - -rw-rw-r 1 kim kim 1048576 Sep 24 09:20 large.txt - -rw-rw-r 1 kim kim 1048576 Sep 24 09:20 large.txt - -rw-rw-r 1 kim kim 471 Sep 14 16:25 bd.txt - -rw-rw-r 1 kim kim 234 Sep 15 17:46 foo.txt - - -rw-rw-r 1 kim kim 1048576 Sep 24 09:20 large.txt - -
- -
- -

Écriture de script shell

-
-

Script shell

-

Mentalité Unix beaucoup de petits programmes spécifiques, - que l'on combine au moyen de scripts pour réaliser des actions - complexes. Exemple de fichier script: -

- - #!/bin/bash - - for i in img_*.jpg - do - base=$(echo "$i" | cut -f 2- -d '_') - nouveau=photo_"$base" - if test -f "$nouveau" - then - echo "Attention, le fichier $nouveau existe déjà" - continue - else - echo "Renommage de $i en $nouveau" - mv "$i" "$nouveau" - fi - done - -
-
-

Rendre un script exécutable

-

Si un fichier texte (quel que soit son extension), commence - par les caractères #!/chemin/vers/un/programme, on peut - rendre ce fichier exécutable (chmod +x). Si on l'exécute, - le contenu du fichier est passé comme argument à programme - (qui est généralement un interpréteur) -

-

#!/bin/bash signifie que le corps du fichier est passé au - programme bash qui est l'interprète de commande - (le shell). -

-
-
-

Que mettre dans un script

- -
-
-

Définitions de variables

-

On peut définir des variables au moyen de la notation -VARIABLE=contenu et on peut utiliser la variable -avec la notation $VARIABLE

- -

exemple de définition :

- i=123 - j="Ma super chaine" - TOTO=titi - echo $TOTO - -

exemple d'utilisation: echo $j $i $TOTO
-affiche « Ma super chaine 123 titi

-
-
-

Boucles for

-

Les boucles for ont la syntaxe: - - for VARIABLE in elem1 ... elemn - do - .... - done - -chaque elemi est expansé (comme une ligne de -commande) avant l'évaluation de la boucle: - - for i in *.txt - do - echo $i est un fichier texte - done - -On peut quitter une boucle prématurément en utilisant break -et passer directement au tour suivant avec continue -

-
-
-

Conditionnelle

-

La syntaxe est : - if commande - then - ... - else - ... - fi - -commande est évaluée. Si elle se termine avec succès, -la branche then est prise. Si elle se termine avec un code -d'erreur, la branche else est prise. On peut utiliser la -commande test qui permet de tester plusieurs conditions -(existance d'un fichier, égalités de deux nombres, ...) et se termine -par un succès si le teste est vrai et par un code d'erreur dans le -cas contraire

-
-
-

Conditionnelle (exemple)

-

On regarde tour à tour si fichier1.txt, fichier2.txt, ... existent : - - for i in 1 2 3 4 5 6 - do - if test -f "fichier$i".txt - then - echo le fichier "fichier$i".txt existe - fi - done - -

-
-
-

Sous-commandes et chaines

-

Il est pratique de pouvoir mettre l'affichage d'une commande - dans une variable. On utilise $( commande ... ): - - MESFICHIER=$(ls *.txt) - for i in $MESFICHIER - do - echo Fichier: $i - done - -Attention à la présence de guillemets autour des variables. S'il y a -f1.txt et f2.txt dans le répertoire courant:
- - MESFICHIER=$(ls *.txt) - for i in $MESFICHIER - do - echo Fichier: $i - done -affiche: - Fichier: f1.txt - Fichier: f2.txt - - - MESFICHIER=$(ls *.txt) - for i in "$MESFICHIER" - do - echo Fichier: $i - done -affiche: - Fichier: f1.txt f2.txt - -

-
-
-

Commandes utiles

- -
-

Programmes non interactifs

-
-

Processus de type daemon

-

- Un daemon (prononcé démon) est un processus - qui non-interactif qui tourne en tâche de fond (pas - d'entrée/sortie sur le terminal, pas d'interface graphique, …). On - communique avec ce processus via des signaux ou en lisant - ou écrivant dans des fichiers ou connexions réseau. Le plus souvent, - leur but est de fournir un service -

-

Exemple de scénario: « Les utilisateurs doivent interagir avec - le matériel. L'accès au matériel demande des droits - administrateur. » -

- -
-
-

Quelques daemons sous Linux

- - - - - - - - - - -
Nom Description
sshd shell distant sécurisé
crond exécution périodique de programmes
cupsd serveur d'impressions
pulseaudio serveur de son (mixe les sons des - différentes applications)
udevd détection de matériel hotplug
nfsd serveur de fichier réseau
smtpd livraison des e-mail
httpd serveur de pages Web
-
-
-

Architecture client-serveur

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Client - - - - - Serveur - - - - - - - - - Client - - - - - - - - - - - - - - Client - - - - - - Client - - - - - - - - - - Client - - - - - - Client - - - - - - - - - - - - - -

-

- Des processus clients communiquent - avec le serveur à travers le - réseau. Les clients sont indépendant et ne communiquent pas entre - eux. Attention plusieurs clients peuvent se trouver su la - même machine physique! -

-
-
-

Architecture client-serveur

- -

Exemples: serveur de bases de données, serveur mail, serveur Web, - terminal de carte bancaire, …

-
- -