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. |
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;
}
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.
listen
Les threads partagent leur mémoire (variables communes)
(différence: les processus ne partagent pas leur espace mémoire)
counter.exe
pendant 50㎲
firefox.exe
pendant 50㎲ 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).
Le PCB contient:
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 |
L'OS détermine et modifie l'état d'un processus:
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
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) |
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 |
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).
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
Le terminal et le processus sont liés par trois fichiers spéciaux:
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
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
-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
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
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).
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
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
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
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
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
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. »
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 |
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!
Exemples: serveur de bases de données, serveur mail, serveur Web, terminal de carte bancaire, …