Vous êtes sur la page 1sur 154

Systme d'exploitation - chapitre 14

1
Chapitre 14 LES FILES DE MESSAGES




1. GENERALITES

Il s'agit d'une implmentation du concept de boite lettres. Le but est d'changer ,de faon
asynchrone, des donnes stockes dans le noyau du systme, sous forme de paquets d'octets
identifiables. C'est un mode de communication oppos celui des tubes parce qu'une opration de
lecture ne peut extraire que le produit d'une opration d'criture.

Avec une seule file de message, on peut envoyer des paquets plusieurs processus (notion de
multiplexage).

La structure d'un message est donne dans /usr/include/sys/msg.h par :

struct msg_buf
{
long mtype; /* type du message */
char mtext [1]; /* contenu du message */
};

Elle est inutilisable en l'tat (taille 1 !!!). La taille maximale d'un texte de message est dfinie la
configuration du systme.

Les messages sont rangs dans une file de messages, zone de mmoire centrale gre par le
systme. Le processus qui a cr une file de messages en est le propritaire.

Une file de messages est associe une cl (l'quivalent numrique d'un nom) utilise pour obtenir
l'identificateur de la file de messages msgid, fourni par UNIX au processus qui donne la cl.

Tout processus qui a connaissance de l'existence de la file de messages et qui possde des droits
d'accs peut raliser des oprations sur la file :

- cration d'une file,
- consultation des caractristiques d'une file :
* nombre de messages dans la file,
* taille de la file,
* pid du dernier processus ayant crit dans la file,
* pid du dernier processus ayant lu (extrait) dans la file,
- envoi d'un message dans la file,
- lecture (extraction) d'un message, en liaison avec son type.

Le fichier /usr/include/sys/msg.h contient la dfinition de la structure msqid_ds consultable par la
fonction systme ipcs, et de diverses constantes.



2. CREATION D'UNE FILE DE MESSAGES

La fonction prototype par :



Systme d'exploitation - chapitre 14

2
int msgget (key_t cle, int option)

retourne l'indicateur de la file (ou -1 en cas d'erreur).

key_t : type dfini dans /usr/include/sys/ipc.h, quivalent long

option : combinaison, avec l'oprateur | de droits d'accs et de constantes dfinies dans
/usr/include/sys/msg.h et /usr/include/sys/ipc.h :

MSG_R (0400), MSG_W (0200): permission en lecture, en criture
IPC_CREAT (0001000) : cration d'une file de messages
IPC_EXCL (0002000) : chec si la file existe dj

cle: si cle =IPC_PRIVATE, une nouvelle file est cre

sinon si cle ne correspond pas une file existante
si IPC_CREAT n'est pas positionn : erreur, retour de -1
sinon, une nouvelle file est cre associe cette cl avec les droits
d'accs spcifis. Le propritaire effectif est le propritaire effectif
du processus. Le groupe propritaire et crateur est le groupe
propritaire effectif du processus.

sinon si IPC_CREAT et IPC_EXCL sont positionns :erreur,retour de -1
sinon, la fonction retourne l'identificateur de la file

La fonction prototype par :

key_t ftok (char *nom, int id)

dans /usr/include/sys/types.h calcule une cl unique dans tout le systme partir du fichier de
chemin nom et de id.

Exemple : rcupration de l'identificateur d'une file de messages
num =msgget (ftok (CHEMIN, cle), 0)

Exemple : cration dune file de messages

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
main ()
{
key_t cle;
int flag, num, i;
printf ("donnez la cle entire associe la file crer : ");
scanf ("%ld", &cle);
flag =MSG_W | MSG_R | IPC_CREAT;
/* autre solution : flag =IPC_CREAT | IPC_EXCL | 0666 ; */
if ((num =msgget (cle, flag)) ==-1)
/* autre solution : if (((num =msgget (ftok (CHEMIN, cle), flag)) ==-1) */
{
fprintf (stderr, "cration impossible\n");
exit (1);
}
printf ("file cre avec l'identificateur %d\n", num);
}


Systme d'exploitation - chapitre 14

3


3. CONSULTATION, MODIFICATION DES CARACTERISTIQUES
D'UNE FILE DE MESSAGES.

On utilise cet effet la fonction prototype par :

int msgctl (int msgid, int cmd, struct msqid_ds *buf)

retourne 0 (ou -1 en cas d'chec)

msgid : identificateur de la file

cmd : dfinit les oprations effectuer, selon sa valeur :

IPC_RMID : la file est supprime
IPC_SET : mise jour de quelques valeurs de permission (champs de la
structure msg_perm associe msgid : msg_perm.uid, msg_perm.gid et msg_perm.mode)
IPC_STAT : recopie dans buf les informations relatives la file contenues dans
l'objet de type struct msqid_ds, associ la file.

Exemple :

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

main ()
{
int num;
struct msqid_ds buf;
printf ("numro de la file tudier ? ");
scanf ("%d", &num);
if (msgctl (num, IPC_STAT, &buf) ==-1)
{ fprintf (stderr, "consultation impossible\n");
exit (1);
}
printf ("caractristiques de la file : %d\n", num);
printf ("nombre de messages : %d\n", buf.msg_qnum);
printf ("droits d'accs : %o\n", buf.msg_perm.mode);
if (msgctl (num, IPC_RMID, &buf) ==-1)
/* ou bien : if (msgctl (num, IPC_RMID, NULL ) ==-1) */
{ fprintf (stderr, "suppression impossible\n");
exit (2);
}
printf ("suppression de la file %d russie\n", num);
}



Un exemple intressant est donn dans A.B. FONTAINE et Ph. HAMMES, p. 359 361.




Systme d'exploitation - chapitre 14

4
4. ENVOI DE MESSAGE A UNE FILE

La fonction prototype par :

int msgsnd (int msgid, struct msgtxt *msgp, int msgz, int msgflg)

retourne 0 (ou -1 en cas d'erreur), avec :

msgid : identificateur de la file

La structure msgbuf (inutilisable, cf. p. 1) est remplace par exemple par :
struct msgtxt
{
long mtype; /* type du message */
char mtext [256]; /* contenu du message */
};

msgz : taille relle du message

msgflg peut prendre les valeurs :
0 : blocage de la fonction si la file est pleine
IPC_NOWAIT : si la file est pleine, l'appel la fonction n'est pas bloquant

Exemple :

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define TAILLE 100 /* taille maximale d'un message */
struct msgtxt
{
long mtype; /* type du message */
char mtext [256]; /* contenu du message */
};

main ()
{
int i, num;
long t;
char ch [TAILLE];
struct msqid_ds buf;
struct msgtxt message;
printf ("numro de la file tudier ? ");
scanf ("%d", &num);
if (msgctl (num, IPC_STAT, &buf) ==-1)
{ fprintf (stderr, "erreur\n");
exit (1);
}
printf ("caractristiques de la file : %d\n", num);
printf ("nombre de messages avant criture : %d\n", buf.msg_qnum);
printf ("pid du dernier processus crivain : %d\n",buf.msg_lspid);
printf ("type du message : ");
scanf ("%ld", &t);
message.mtype =t;
printf ("texte du message (%d car. maxi) : ", TAILLE-1);
gets (ch);
strcpy (message.mtext, ch);


Systme d'exploitation - chapitre 14

5
i =msgsnd (num, &message, strlen (ch), ~IPC_NOWAIT);
if (i !=0) fprintf (stderr,"message non envoy\n");
else { printf ("numro du processus %d\n", getpid ());
msgctl (num, IPC_STAT, &buf);
printf ("nombre de messages aprs criture : %d\n", buf.msg_qnum);
printf ("pid du dernier processus crivain : %d\n", buf.msg_lspid);
}
}



5 . EXTRACTION D'UN MESSAGE D'UNE FILE.

La fonction prototype par :

int msgrcv (int msgid, struct msgtxt *buf, int msgz, long msgtyp, int msgflg)

retourne la longieur du message extrait (-1 en cas d'erreur), avec :

msgid : identificateur de la file

la structure msgbuf (inutilisable, cf. p.1) est remplace par :
struct msgtxt
{
long mtype; /* type du message */
char mtext [256]; /* contenu du message */
};

msgz : taille maximale d'un message recevable

msgtyp : code du type du message extraire :
0 : le premier message dans la file, quelque soit son type
>0 : le premier message de type msgtyp dans la file
<0 : le premier message de type 0 ... |msgtyp|

msgflg prcise l'action raliser si aucun message du type attendu n'est prsent dans la
file :
si IPC_NOWAIT est positionn, on retourne -1 et l'appel est non bloquant
sinon, la fonction se bloque jusqu' l'arrive d'un message satisfaisant ou
jusqu' rception d'un signal par le processus appelant ou jusqu' disparition de la file.

Exemple :

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define TAILLE 100 /* taille maximale d'un message */
struct msgtxt
{
long mtype; /* type du message */
char mtext [256]; /* contenu du message */
};

main ()
{
int i, num;
long type;


Systme d'exploitation - chapitre 14

6
struct msqid_ds buf;
struct msgtxt message;
printf ("numro de la file tudier ? ");
scanf ("%d", &num);
if (msgctl (num, IPC_STAT, &buf) ==-1)
{ fprintf (stderr, "erreur\n");
exit (1);
}
printf ("caractristiques de la file : %d\n", num);
printf ("nombre de messages avant lecture : %d\n", buf.msg_qnum);
printf ("pid du dernier processus lecteur : %d\n", buf.msg_lrpid);
printf ("type du message : ");
scanf ("%ld", &type);
i =msgrcv (num, &message, TAILLE, type, ~IPC_NOWAIT);
if (i ==-1) fprintf (stderr, "pas de message\n");
else { printf ("pid du processus courant %d\n", getpid ());
msgctl (num, IPC_STAT, &buf);
printf ("nombre de messages aprs lecture : %d\n", buf.msg_qnum);
printf ("pid du dernier processus lecteur : %d\n",buf.msg_lrpid);
}
}


Systme d'exploitation - chapitre 15

1
Chapitre 15

LES SEGMENTS DE MEMOIRE PARTAGEE



Un segment de mmoire partage est une zone d'octets dsigne par un pointeur (adresse de base ).
La communication entre processus par fichiers, tubes ou files de messages suppose d'abord la
recopie des donnes de l'espace d'adressage de l'metteur vers le noyau, puis la recopie des
donnes du noyau vers l'espace d'adressage du processus destinataire. Pour ces oprations, le
processus bascule ncessairement du mode utilisateur en mode noyau.

Au contraire, un segment de mmoire partage est utilisable par plusieurs processus sans avoir le
recopier dans leurs environnements respectifs.

Un segment de mmoire partage est identifi par le systme grce une cl entire et accessible
par d'autres processus grce cette cl. L'adresse de base de la mmoire partage, vue de deux
processus, n'a aucune obligation d'tre identique : les processus ne sont pas obligs d'utiliser la
zone d'octets partir de son "dbut".

A tout segment de mmoire partage, est associe une structure d'informations de type struct
shmid_ds, dfinie dans /usr/include/sys/shm.h, et consultable par la fonction systme ipcs. Ce
fichier dfinit galement un certain nombre de constantes.

Une action exit sur un processus ayant cr des segments libre ceux-ci.



1. CREATION D'UN SEGMENT DE MEMOIRE PARTAGEE

La fonction prototype par :

int shmget (key_t cle, int taille, int option)

retourne l'identificateur d'un segment de mmoire partage associe une cl donne (-1 en cas
d'erreur), avec :

taille : la taille du segment en octets (comprise entre un minimum et un maximum
dfinis lors de la configuration du systme)

option : combinaison, avec l'oprateur | , de droits d'accs et de constantes prdfinies:
SHM_R : permission en lecture (ou 0400)
SHM_W : permission en criture (ou 0200)
IPC_CREAT, IPC_EXCL

cle : cl de type key_t (dfini dans /usr/include/sys/ipc.h, quivalent long)

si cle =IPC_PRIVATE, un nouveau segment est cr

si non si cle ne correspond pas un segment existant,
si IPC_CREAT n'est pas positionn : erreur et retour de -1
sinon, un nouveau segment est cr et associ cette cl avec les
droits d'accs mentionns. Le propritaire et le crateur sont le


Systme d'exploitation - chapitre 15

2
propritaire effectif du processus. Le groupe propritaire et le
groupe crateur sont le groupe propritaire effectif du processus


sinon si IPC_CREAT et IPC_EXCL sont positionns : erreur,retour de -1
sinon, la fonction retourne l'identificateur du segment


Exemple : rcupration de l'identificateur d'un segment
num =shmget (ftok (CHEMIN, cle) , taille, 0)
/* ou bien : num =shmget (ftok(CHEMIN, cle) , 0 , 0) */

Exemple de cration d'un segment :

#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>

main ()
{
int num;
if ((num =shmget (IPC_PRIVATE, 1024, IPC_CREAT | IPC_EXCL | 0666)) ==-1)
fprintf (stderr, "erreur\n");
else printf ("segment d'identificateur %d cr\n", num);
}



2. OPERATIONS DE CONTROLE

La fonction prototype par :

int shmctl (int id, int cmd, struct shmid_ds *buf)

retourne 0 (- 1 en cas d'erreur), avec :

id : identificateur du segment (le retour de shmget)

buf : pointeur sur la structure shmid_ds, contenant une copie des informations sur le
segment

cmd : IPC_STAT : la structure shmid_ds associe au segment est copie dans la
structure pointe par buf
IPC_SET : la structure shmid_ds associe au segment est modifie par les
valeurs des champs de la structure pointe par buf
IPC_RMID : suppression du segment de la mmoire. La suppression sera
diffre si le segment est encore attach un processus.





Systme d'exploitation - chapitre 15

3

3. ATTACHEMENT D'UN SEGMENT A UN PROCESSUS

La fonction prototype par :

void * shmat (int id, const void *adr, int flag)

retourne adr ou NULL en cas d'erreur, avec :

id : identificateur du segment (le retour de shmget)
adr : si adr =NULL, le systme choisit la premire adresse disponible et la fonction
la retourne.
Alors, adr pointe sur le 1er octet du segment.
Avantage : l'adresse sera correctement construite

si adr !=NULL, et si SHM_RND est positionn dans flag, le segment est
attach l'adresse adr - (adr modulo SHMLBA, segment low boundary address, adresse de base
de la mmoire partage)

si adr !=NULL, et si SHM_RND n'est pas positionn dans flag, le segment est
attach l'adresse adr

si SHM_RDONLY (010000) est positionn dans flag, le segment n'est attach
qu'en lecture. Toute tentative d'criture gnre le signal SIGSEGV

Attention, les segments commencent des limites de pages.


4. DETACHEMENT D'UN SEGMENT

La fonction prototype par :

int shmdt (const void *ptr)

retourne 0 (- 1 en cas d'chec)

ptr : adresse retourne par shmat.

Cette fonction dtache le segment du processus qui l'utilise.

Attention, ptr garde sa valeur et on vitera de l'utiliser aprs un appel shmdt. La fonction shmdt
ne dtruit pas le segment. Seul un appel shmctl peut le faire.

La terminaison d'un processus entrane le dtachement de tous les segments qu'il a pralablement
crs.


Systme d'exploitation - chapitre 16

1
Chapitre 16 PROTECTION - SECURITE


Le cot des dficiences et des dfectuosits en informatique est lev :

- erreurs propages par un programme utilisateur,
- erreurs dans le SE,
- pannes matrielles,
- malveillances, etc...

Le cot de toute protection est galement lev. D'o la recherche d'un compromis privilgiant des
objectifs stratgiques.

Le degr de protection dpend de la protection des informations manipules, du degr de confiance
que l'on peut accorder aux logiciels, dont le SE.

Un logiciel fiable :
- satisfait ses spcifications,
- rsiste un environnement imprvu :
- soit en le signalant,
- soit en le corrigeant
en vitant la propagation des erreurs.



1. CONTROLE D'ACCES AUX RESSOURCES PAR UN PROCESSUS

Il s'effectue deux niveaux :

- niveau 1 (logique) : en dveloppant un modle de protection : des rgles spcifiant quels
accs sont autoriss et quels accs sont interdits

- niveau 2 (physique) : en mettant en oeuvre des mcanismes de protection pour appliquer
le modle




2. MODELE DE PROTECTION PAR MATRICE D'ACCES

Le SE comporte :

- des entits actives ou sujets : les processus
- des entits accessibles ou objets, reprsentants de types abstraits. Ce sont :

- les ressources matrielles : UC, mmoire centrale, entres/sorties, etc...
- les ressources logicielles : fichiers, programmes, smaphores, etc...

Un modle de protection doit rpondre la question : Quels sujets ont accs quels objets ? De
quelle faon (modalits d'accs) ? Etant entendu qu'il convient de prvoir une modalit d'accs par
type abstrait.



Systme d'exploitation - chapitre 16

2
Dfinition : On appelle droit d'accs tout couple (nom d'objet, modalits d'accs cet objet). Par
exemple (fichier f1 , lire) ou (processus P0 , appeler)

Le modle de protection fixe le droit d'accs de chaque processus chaque instant. L'ensemble de ces
droits pour un processus est appel domaine de protection du processus.

Exemple : D ={ (fichier f1 , ouvrir) , (fichier f1 , fermer) , (fichier f1 , lire) , (fichier f1 , crire) ,
(diteur , appeler) , (console 5 , lire) , (imprimante , afficher) }

Un domaine de protection peut se reprsenter par une matrice d'accs.

Exemple :
objets

L
exec L/E
entrer
L/E
entrer
L/E , exec
entrer
entrer
fichier 1 segment 1
segment 2
processus
1
diteur
processus 1
processus 2
processus 3
sujets
domaine de protection du processus 1



2.1 Domaine de protection restreint

Un processus peut tre dcompos en tches, avec des droits d'accs diffrents selon les tches. Donc,
la matrice doit pouvoir voluer dynamiquement :

- pour ajouter un droit d'accs la case (i , j)
- pour retrancher un droit d'accs la case (i , j)

Par exemple, si on ajoute (domaine j , entrer) en ligne i, le processus qui s'excute dans le domaine
de protection i passe au domaine de protection j.

Exemple :





Systme d'exploitation - chapitre 16

3
Le degr de protection d'un SE est celui de son maillon le plus faible ("principe de la porte drobe").
Un procd de contrle simple, mais permanent est prfrable un procd complexe, mais pas
systmatiquement utilis. De plus, il faut moduler les contrles en fonction des utilisateurs. Pour ces
raisons, tout type abstrait de domaine de protection doit tre modulaire.


2. 2 Problme du cheval de Troie

Un programme peut profiter du domaine de protection de l'utilisateur pour consulter ou copier ou
modifier des donnes auxquelles il ne devrait pas avoir accs. Il est donc important d'excuter tout
programme dans le domaine de protection le plus rduit.



2.3 Problme du confinement

Un programme, excut par un utilisateur qui n'est pas son propritaire, peut retenir une information
confidentielle : il faut donc confiner l'information.

Les mcanismes de contrle rassembls dans la matrice d'accs peuvent tre classs en
trois catgories :

- accs hirarchiques
- listes d'accs
- capacits



3. ACCES HIERARCHIQUES

On peut hirarchiser les accs en deux modes :

- le mode systme ou matre : par exemple tout ce qui concerne la cration ou la
destruction des processus, l'accs aux tables du SE, les instructions d'entre-sortie. Le domaine de
protection est vaste : tous les droits du SE (processus systme, super utilisateur(s))

- le mode utilisateur ou esclave : le domaine de protection est celui d'un sous-ensemble
d'instructions autorises et utilises

Souvent, un bit du mot d'tat de la machine indique quel est le mode de protection pour la
mise en uvre des contrles.

Toutefois, il n'est pas facile de mettre en uvre le principe du moindre privilge nonc ci-dessus.
Une solution peut tre d'organiser des domaines de protection en anneaux concentriques. L'anneau
central n 0 correspond au maximum de privilges. La mmoire centrale est segmente avec une
partition par anneau (par domaine de protection).

Le cas de 2 anneaux correspond la situation simple matre/esclave.

Lorsqu'un processus s'excute dans le domaine D
i
(i =0, 1, 2 , ...), il peut accder tout segment de
mmoire centrale de niveau n k (k #i, mais jamais k <i). C'est en contradiction avec le principe de
moindre privilge.




Systme d'exploitation - chapitre 16

4





















Une solution lgante ce problme a t propose pour la 1re fois pour la gamme des
microprocesseurs INTEL 80286 en 1984 : il s'agit de la technique des guichets (gates). Un processus
n'accde un module de niveau infrieur que par un guichet facilement contrlable.

Dfinition : un guichet est un descripteur, associ un numro d'anneau, qui pointe vers un segment
de mmoire de n d'anneau infrieur.

Rgles : - tout processus qui peut accder un guichet accde au segment point par le guichet
- il y a 2 solutions, selon les systmes, pour rpondre la question : "dans quel domaine de
protection travaille-t-on dans l'anneau appel ? "


solution 1 ou principe de conformit : un processus de niveau k ( k <i) qui accde un guichet
pointant sur le niveau i s'excute dans l'anneau i. Il n'a pas accs la mmoire de niveau k, son propre
niveau !

solution 2 ou restriction de privilges : on associe temporairement au segment de mmoire de
niveau k le numro d'anneau i pour qu'un processus de niveau k puisse accder cet anneau quand il
est excut au niveau i








Systme d'exploitation - chapitre 16

5
4. LISTES D'ACCES (authorized list)

Chaque colonne de la matrice d'accs est structure en une liste chane de protections associe un
objet. C'est le propritaire de l'objet qui dfinit la liste.

Lorsqu'un processus veut accder un objet, le SE vrifie dans la liste que l'accs est permis.

La technique UNIX des bits de protection rwx .... s'apparente cette solution.

Toutefois, un problme se pose : il n'est pas immdiat de modifier un domaine de protection, puisqu'il
faut pour cela explorer toutes les listes. Cette solution n'est donc pas bien adapte la mise en uvre
du principe de moindre privilge.




5. CAPACITES (capability)

Une capacit est une structure 3 champs :

- nom d'un objet
- modalits d'accs cet objet
- pointeur sur l'objet

Nom
Modalits d'accs Pointeur Objet



Rgles : - une capacit est cre par un processus particulier du SE

- les modalits d'accs sont le seul des 3 champs d'une capacit dont la modification est
autorise

- un sujet peut transmettre la copie d'une capacit un autre sujet, ventuellement avec des
modalits d'accs rduites

- lorsqu'un sujet cre un objet, le SE lui alloue une capacit associe l'objet

Une capacit correspond un dcoupage en lignes de la matrice d'accs. Le domaine de protection
d'un processus est form de la liste des capacits (C-liste ) qu'il possde un instant donn.

Exemple :













Systme d'exploitation - chapitre 16

6






Pour un processus, changer de domaine de protection peut consister changer de C-liste.



5.1 Domaines de protection restreints

Une solution lgante consiste faire de chaque C-liste utilise un objet n'admettant que la seule
modalit d'accs entrer . Pour accder cet objet, donc pour entrer dans le domaine de protection
dcrit par la C-liste, un sujet doit possder une capacit d'entre pour cet objet.

Cette mthode permet de bien raliser le principe du moindre privilge. Ainsi, dans la figure ci-
dessous, lorsqu'un processus appelle une procdure, il doit possder une capacit lui permettant
d'accder la C-liste de la procdure.

Rgles : - aprs l'appel une procdure, le domaine de protection du processus devient celui de la C-
liste de la procdure

- une fois que le processus est sorti de la procdure, son ancien domaine de protection est
restaur




















5.2 Protection des capacits

Elle est normalement effectue au niveau de l'objet, c'est dire du matriel. Deux solutions
sont envisageables :

- solution 1 : tiquetage
Dans chaque mot mmoire, un bit indique si le mot est une capacit. Ainsi, il n'y aura
pas de manipulation illicite des droits d'accs d'une capacit.

- solution 2 :partition de la mmoire


Systme d'exploitation - chapitre 16

7
Chaque segment de mmoire contient soit des capacits, soit des donnes. Il existe
des registres spcifiques pour la manipulation des capacits, d'autres pour les
donnes.

Rgles : les processus systme accdent aux registres capacit et aux segments capacit. Les donnes
ne peuvent tre copies que dans des segments ou des registres de donnes.


Un problme se pose : la rvocation d'une capacit.


Systme d'exploitation - chapitre 16

8
Les capacits transmises d'autres sujets sont dissmines. C'est extrmement incommode pour
supprimer une capacit.

La solution gnralement adopte est la suivante : le crateur d'un objet de nom O ne transmet pas
un autre sujet une copie de la capacit de O, mais il transmet une capacit pour l'objet O' qui pointe
sur O. Comme la capacit de O n'est pas duplique, son ventuelle suppression est simple : pour
rvoquer, on supprime le pointeur de O' sur O.



















Bibliographie


J . BEAUQUIER, B. BERARD, Systmes d'exploitation, Edisciences
(plusieurs figures du chapitre sont issues de cet ouvrage).



Systme d'exploitation - Chapitre 1

1
Chapitre 1 GENERALITES


Les logiciels peuvent tre classs en deux catgories :
- les programmes d'application des utilisateurs
- les programmes systme qui permettent le fonctionnement de l'ordinateur. Parmi
ceux-ci, le systme d'exploitation (SE dans la suite).

Le SE soustrait le matriel au regard du programmeur et offre une prsentation agrable
des fichiers. Un SE a ainsi deux objectifs principaux :

- prsentation : Il propose l'utilisateur une abstraction plus simple et plus
agrable que le matriel : une machine virtuelle

- gestion : il ordonne et contrle l'allocation des processeurs, des mmoires, des
icnes et fentres, des priphriques, des rseaux entre les programmes qui les utilisent. Il
assiste les programmes utilisateurs. Il protge les utilisateurs dans le cas d'usage partag.


1. HISTORIQUE

Les premiers ordinateurs taient mis la disposition d'un programmeur selon un
calendrier de rservation : un usager avec un travail unique utilisait seul la machine un
moment donn. Puis vint l'poque du traitement par lots (batch) : enchanement, sous le
contrle d'un moniteur, d'une suite de travaux avec leurs donnes, confis l'quipe
d'exploitation de la machine (inconvnient : temps d'attente des rsultats pour chaque
utilisateur).

Cette pratique a ncessit trois innovations :
- le contrle des E/S et leur protection pour viter le blocage d'un lot
- un mcanisme de comptage de temps et de droutement autoritaire des
programmes pour viter le blocage d'un lot cause d'une squence trop longue. Ce furent
les premire interruptions
- les premiers langages de commande (J CL) sous forme de cartes contenu
particulier introduites dans le paquet ($J OB, $LOAD, $RUN, etc...)

Historiquement, on peut dire que les SE sont vraiment ns avec les ordinateurs de la
3me gnration (ordinateurs circuits intgrs apparus aprs 1965). Le premier SE digne
de ce nom est l'OS/360, celui des IBM 360, famille unique de machines compatibles entre
elles, de puissances et de configurations diffrentes. Bien que son extrme complexit (due
l'erreur de couvrir toute la gamme 360) n'ait jamais permis d'en rduire le nombre de
bogues, il apportait deux concepts nouveaux :

- la multiprogrammation : partitionnement de la mmoire permettant au
processeur d'accueillir une tche dans chaque partie et donc d'tre utilis plus efficacement
par rapport aux temps d'attente introduits par les priphriques (le processeur est r-allou)

- les E/S tamponnes : adjonction l'UC d'un processeur autonome capable de
grer en parallle les E/S ou canal ou unit d'change. Cela ncessite une politique de
partage du bus ou d'autres mcanismes (vol de cycle, DMA).

Au MIT, F.J . CORBATO et son quipe ont ralis ds 1962, sur un IBM 7094 modifi, le
premier SE exprimental temps partag (mode interactif entre plusieurs utilisateurs



Systme d'exploitation - Chapitre 1

2
simultans), baptis CTSS. Une version commerciale, nomme MULTICS (MULTiplexed
Information and Computing Service), a t ensuite tudie par cette quipe, les Bell
Laboratories et General Electric. Les difficults ont fait que MULTICS n'a jamais dpass le
stade exprimental sur une douzaine de sites entre 1965 et 1974. Mais il a permis de dfinir
des concepts thoriques importants pour la suite.

La technologie base de circuits intgrs de la 3me gnration d'ordinateurs a permis
l'apparition des mini-ordinateurs et leur diffusion massive (prcdant celle des micro-
ordinateurs). En 1968, l'un des auteurs de MULTICS, Ken Thompson a effectu une
adaptation de MULTICS mono-utilisateur sur un mini-ordinateur PDP-11 de DEC inutilis
dans son Laboratoire des Bell Laboratories. Son collgue Brian Kernighan Ia nomma UNICS
(Uniplexed - l'oppos de Multiplexed - Information and Computer Service), qui devint
ensuite UNIX . En 1972, son collgue Dennis Ritchie traduisit UNIX en C, langage qu'il
venait de mettre au point avec Kernighan...... L're des grands SE avait commenc.

Avec la grande diffusion des micro-ordinateurs, l'volution des performances des
rseaux de tlcommunications, deux nouvelles catgories de SE sont apparus :

- les SE en rseaux : ils permettent partir d'une machine de se connecter sur une
machine distante, de transfrer des donnes. Mais chaque machine dispose de son propre
SE

- les SE distribus ou rpartis : l'utilisateur ne sait pas o sont physiquement ses
donnes, ni o s'excute son programme. Le SE gre l'ensemble des machines
connectes. Le systme informatique apparat comme un mono-processeur.



2. ELEMENTS DE BASE D'UN SYSTEME D'EXPLOITATION

Les principales fonctions assures par un SE sont les suivantes :

- gestion de la mmoire principale et des mmoires secondaires,
- excution des E/S faible dbit (terminaux, imprimantes) ou haut dbit (disques,
bandes),
- multiprogrammation, temps partag, paralllisme : interruption, ordonnancement,
rpartition en mmoire, partage des donnes
- lancement des outils du systme (compilateurs, environnement utilisateur,...) et
des outils pour l'administrateur du systme (cration de points d'entre, modification de
privilges,...),
- lancement des travaux,
- protection, scurit ; facturation des services,
- rseaux

L'interface entre un SE et les programmes utilisateurs est constitue d'un ensemble
d'instructions tendues, spcifiques d'un SE, ou appels systme. Gnralement, les appels
systme concernent soit les processus, soit le systme de gestion de fichiers (SGF).





2.1 Les processus




Systme d'exploitation - Chapitre 1

3
Un processus est un programme qui s'excute, ainsi que ses donnes, sa pile, son
compteur ordinal, son pointeur de pile et les autres contenus de registres ncessaires son
excution.

Attention : ne pas confondre un processus (aspect dynamique, excution qui peut
tre suspendue, puis reprise), avec le texte d'un programme excutable (aspect statique).

Les appels systme relatifs aux processus permettent gnralement d'effectuer au
moins les actions suivantes :

- cration d'un processus (fils) par un processus actif (d'o la structure d'arbre de
processus gre par un SE)
- destruction d'un processus
- mise en attente, rveil d'un processus
- suspension et reprise d'un processus, grce l'ordonnanceur de processus
(scheduler)
- demande de mmoire supplmentaire ou restitution de mmoire inutilise
- attendre la fin d'un processus fils
- remplacer son propre code par celui d'un programme diffrent
- changes de messages avec d'autres processus
- spcification d'actions entreprendre en fonction d'vnements extrieurs
asynchrones
- modifier la priorit d'un processus

Dans une entit logique unique, gnralement un mot, le SE regroupe des
informations-cls sur le fonctionnement du processeur : c'est le mot d'tat du processeur
(Processor Status Word, PSW). Il comporte gnralement :

- la valeur du compteur ordinal
- des informations sur les interruptions (masques ou non)
- le privilge du processeur (mode matre ou esclave)
- etc.... (format spcifique un processeur)

A chaque instant, un processus est caractris par son tat courant : c'est
l'ensemble des informations ncessaires la poursuite de son excution (valeur du
compteur ordinal, contenu des diffrents registres,
informations sur l'utilisation des ressources). A cet effet, tout processus, on associe un
bloc de contrle de processus (BCP). Il comprend gnralement :

- une copie du PSW au moment de la dernire interruption du processus
- l'tat du processus : prt tre excut, en attente, suspendu, ...
- des informations sur les ressources utilises
- mmoire principale
- temps d'excution
- priphriques d'E/S en attente
- files d'attente dans lesquelles le processus est inclus, etc...
- et toutes les informations ncessaires pour assurer la reprise du processus en
cas d'interruption

Les BCP sont rangs dans une table en mmoire centrale cause de leur
manipulation frquente.


2.2 Les interruptions




Systme d'exploitation - Chapitre 1

4
Une interruption est une commutation du mot d'tat provoque par un signal
gnr par le matriel. Ce signal est la consquence d'un vnement interne au processus,
rsultant de son excution, ou bien extrieur et indpendant de son excution. Le signal va
modifier la valeur d'un indicateur qui est consult par le SE. Celui-ci est ainsi inform de
l'arrive de l'interruption et de son origine. A chaque cause d'interruption est associ un
niveau d'interruption. On distingue au moins 3 niveaux d'interruption :

- les interruptions externes : panne, intervention de l'oprateur, ....
- les droutements qui proviennent d'une situation exceptionnelle ou d'une erreur
lie l'instruction en cours d'excution (division par 0, dbordement, ...)
- les appels systme

UNIX admet 6 niveaux d'interruption : interruption horloge, interruption disque,
interruption console, interruption d'un autre priphrique, appel systme, autre interruption.

Le chargement d'un nouveau mot d'tat provoque l'excution d'un autre processus,
appel le traitant de l'interruption. Le traitant ralise la sauvegarde du contexte du
processus interrompu (compteur ordinal, registres, indicateurs,....). Puis le traitant accomplit
les oprations lies l'interruption concerne et restaure le contexte et donne un nouveau
contenu au mot d'tat : c'est l'acquittement de l'interruption.

Gnralement un numro de priorit est affect un niveau d'interruption pour
dterminer l'ordre de traitement lorsque plusieurs interruptions sont positionnes. Il est
important de pouvoir retarder, voire annuler la prise en compte d'un signal d'interruption. Les
techniques que l'on utilise sont le masquage et le dsarmement des niveaux d'interruption
:
- le masquage d'un niveau retarde la prise en compte des interruptions de ce
niveau. Pour cela, on positionne un indicateur spcifique dans le mot d'tat du processeur.
Puisqu'une interruption modifie le mot d'tat, on peut masquer les interruptions d'autres
niveaux pendant l'excution du traitant d'un niveau. Lorsque le traitant se termine par un
acquittement, on peut alors dmasquer des niveaux qui avaient t prcdemment
masqus. Les interruptions intervenues pendant l'excution du traitant peuvent alors tre
prises en compte

- le dsarmement d'un niveau permet de supprimer la prise en compte de ce
niveau par action sur le mot d'tat. Pour ractiver la prise en compte, on rarme le niveau. Il
est vident qu'un droutement ne peut tre masqu; il peut toutefois tre dsarm.


2.3 Les ressources

On appelle ressource tout ce qui est ncessaire l'avancement d'un processus
(continuation ou progression de l'excution) : processeur, mmoire, priphrique, bus,
rseau, compilateur, fichier, message d'un autre processus, etc... Un dfaut de ressource
peut provoquer la mise en attente d'un processus.

Un processus demande au SE l'accs une ressource. Certaines demandes sont
implicites ou permanentes (la ressource processeur). Le SE alloue une ressource un
processus. Une fois une ressource alloue, le processus a le droit de l'utiliser jusqu' ce
qu'il libre la ressource ou jusqu' ce que le SE reprenne la ressource (on parle en ce cas
de ressource premptible, de premption).

On dit qu'une ressource est en mode d'accs exclusif si elle ne peut tre alloue
plus d'un processus la fois. Sinon, on parle de mode d'accs partag. Un processus
possdant une ressource peut dans certains cas en modifier le mode d'accs.



Systme d'exploitation - Chapitre 1

5
Exemple : un disque est une ressource accs exclusif (un seul accs simultan), une
zne mmoire peut tre accs partag.

Le mode d'accs une ressource dpend largement de ses caractristiques
technologiques. Deux ressources sont dites quivalentes si elles assurent les mmes
fonctions vis vis du processus demandeur. Les ressources quivalentes sont groupes en
classes afin d'en faciliter la gestion par l'ordonnanceur.



2.4 L'ordonnancement

On appelle ordonnancement la stratgie d'attribution des ressources aux
processus qui en font la demande. Diffrents critres peuvent tre pris en compte :

- temps moyen d'excution minimal
- temps de rponse born pour les systmes interactifs
- taux d'utilisation lev de l'UC
- respect de la date d'excution au plus tard, pour le temps rel, etc...



2.5 Le systme de gestion de fichiers

Une des fonctions d'un SE est de masquer les spcificits des disques et des
autres priphriques d'E/S et d'offrir au programmeur un modle de manipulation des
fichiers agrable et indpendant du matriel utilis.

Les appels systme permettent de crer des fichiers, de les supprimer, de lire et
d'crire dans un fichier. Il faut galement ouvrir un fichier avant de l'utiliser, le fermer
ultrieurement. Les fichiers sont regroups en rpertoires arborescents; ils sont accessibles
en nonant leur chemin d'accs (chemin d'accs absolu partir de la racine ou bien
chemin d'accs relatif dans le cadre du rpertoire de travail courant).

Le SE gre galement la protection des fichiers.



3. STRUCTURE D'UN SYSTEME D'EXPLOITATION

On peut distinguer quatre grandes catgories de SE.


3.1 Les systmes monolithiques

Le SE est un ensemble de procdures, chacune pouvant appeler toute autre tout
instant. Pour effectuer un appel systme, on dpose dans un registre les paramtres de
l'appel et on excute une instruction spciale appele appel superviseur ou appel noyau.
Son excution commute la machine du mode utilisateur au mode superviseur ou noyau et
transfre le contrle au SE. Le SE analyse les paramtres dposs dans le registre
mentionn plus haut et en dduit la procdure activer pour satisfaire la requte. A la fin de
l'excution de la procdure systme, le SE rend le contrle au programme appelant.

Gnralement, un tel SE est organis en 3 couches :




Systme d'exploitation - Chapitre 1

6
- une procdure principale dans la couche suprieure, qui identifie la procdure de
service requise
- des procdures de service dans la couche infrieure la prcdente qui
excutent les appels systme
- des procdures utilitaires dans la couche basse qui assistent les procdures
systme. Une procdure utilitaire peut tre appele par plusieurs procdures systmes.


3.2 Les systmes en couches

On peut gnraliser la conception prcdente et concevoir un SE compos de
plusieurs couches spcialises, chaque couche ne pouvant tre appele que par des
procdures qui lui sont immdiatement infrieures. Citons par exemple le premier SE de
cette nature propos par Dijkstra en 1968 :

- couche 0 : allocation du processeur par commutation de temps entre les
processus, soit la suite d'expiration de dlais, soit la suite d'interruption
(multiprogrammation de base du processeur)

- couche 1 : gestion de la mmoire, allocation d'espace mmoire pour les
processus (pagination)

- couche 2 : communication entre les processus et les terminaux

- couche 3 : gestion des E/S ( changes d'information avec des mmoires
tampons, c'est dire avec des priphriques abstraits, dgags des spcificits matrielles)

- couche 4 : programmes utilisateurs


3.3 Les machines virtuelles

Une des premiers SE grer le concept de machine virtuelle a t l'adaptation
temps partag de l'OS/360 d'IBM, propos vers 1968 sous le nom de CP/CMS, puis sous le
nom de VM/370 en 1979.

Le cur du SE, appel moniteur de machine virtuelle ou VM/370, s'excute
mme le matriel et fournit la couche suprieure plusieurs machines virtuelles. Ces
machines virtuelles sont des copies conformes de la machine relle avec ses interruptions,
ses modes noyau/utilisateur, etc...

Chaque machine virtuelle peut excuter son propre SE. Lorsqu'une machine
virtuelle excute en mode interactif un appel systme, l'appel est analys par le moniteur
temps partag de cette machine, CMS. Toute instruction d'E/S, toute instruction d'accs
mmoire est convertie par VM/370 qui les excute dans sa simulation du matriel. La
sparation complte de la multiprogrammation et de la machine tendue rend les lments
du SE plus simples et plus souples. VM/370 a gagn en simplicit en dplaant une grande
partie du code d'un SE dans le moniteur CMS.



3.4 L'architecture client/serveur




Systme d'exploitation - Chapitre 1

7
Cette tendance s'est accentue dans les SE contemporains en tentant de rduire
le SE un noyau minimal. Une des formes les plus accentues de cette volution est
l'architecture client/serveur.

La plupart des fonctionnalits d'un SE sont reportes dans des processus
utilisateurs. Pour demander un service comme la lecture d'un bloc de fichier, le processus
utilisateur ou processus client envoie une requte un processus serveur qui effectue le
travail et envoie une rponse. Le noyau ne gre que la communication entre les clients et
les serveurs. Cependant, le noyau est souvent oblig de grer certains processus serveurs
critiques comme les pilotes de priphriques qui adressent directement le matriel.

La dcomposition du SE en modules trs spcialiss le rend facile modifier. Les
serveurs s'excutent comme des processus en mode utilisateur et non pas en mode noyau.
Comme ils n'accdent donc pas directement au matriel, une erreur n'affecte que le serveur
et pas l'ensemble de la machine.

En outre, ce modle est bien adapt aux systmes distribus. Un client n'a pas
besoin de savoir si le SE fait excuter sa requte par un serveur de sa propre machine ou
celui d'une machine distante.

Systme d'exploitation - chapitre 2

1

Chapitre 2 NOTIONS SUR UNIX


Avertissement : UNIX est une marque dpose de Bell Laboratories.

1. GENERALITES

1.1 Historique

Vers 1965, Bell Laboratories, General Electric et le M.I.T. lancent le projet
MULTICS qui vise crer un systme dexploitation multitches et multi-utilisateurs
en temps partag, implantable sur tout ordinateur, assurant une portabilit des
applications. Les chefs de projets taient Ken THOMPSON et Dennis RITCHIE de Bell
Laboratories. Une premire version crite en PL/1 est propose en 1970, avec deux
originalits : un systme de gestion de fichiers arborescent et un shell conu comme
processus utilisateur. Mais cest lchec, PL/1 ntant pas adapt aux objectifs.

Aprs le retrait de Bell Laboratories, lass davoir investi 7 millions de $ sans retour, Ken
THOMPSON et Dennis RITCHIE continuent seuls et rcrivent MULTICS en
Assembleur. Sur la machine hbergeant le premier MULTICS, Ken THOMPSON cre le
langage B en 1971 et en 1973, Dennis RITCHIE et Brian KERNIGHAN crent le
langage C issu damliorations de B, en vue dune rcriture dUNIX, nom qui a succd
MULTICS (Uniplexed Information and Computer Service). Ce fut la premire version
(V6) commercialise en 1974. Depuis, plus dune vingtaine de versions dUNIX ont vu
le jour, sans compter les systmes trs proches. Les quatre versions principales sont BSD,
SYSTEM V, POSIX (tentative de fdrer les deux familles prcdentes) et LINUX
propos par Linus TORVALDS en 1991. Le code source, crit pour lessentiel en C, est
largement accessible.

Le label UNIX 98 de lOpen Group prescrit les threads (tches) standardiss (cf. chapitre
11), le temps rel, les 64 bits et les systmes de fichiers tendus (cf. chapitre 7).

Quelles que soient les versions :
UNIX = le noyau + l'interprteur de commandes + des utilitaires

UNIX est construit autour de deux notions essentielles :
- fichiers organiss en structure arborescente
- processus : un processus correspond lexcution dun programme (systme ou
utilisateur) et son environnement (descripteurs de fichiers, registres, compteur
ordinal, ). La gestion de la mmoire centrale constitue un aspect important du
contrle des processus.



1.2 Les entres-sorties

Dans UNIX, toute unit dE/S est dsigne par un fichier spcial (cf. ce que vous
connaissez en C sur stdin, stdout, stderr). Il existe deux modes dchange pour lE/S :

- bloc : les mmoires de masse (disque, disquettes) changent des blocs dinformation
avec la mmoire centrale en utilisant des tampons

- caractre : les terminaux, les imprimantes et les rseaux changent des caractres
avec la mmoire centrale, sans tampon.

Systme d'exploitation - chapitre 2

2


On peut rediriger les E/S standard :
< pour redfinir stdin
> pour redfinir stdout
>> idem, mais les donnes sont ajoutes en fin de fichier

La redirection sapplique la dernire commande (parenthser pour une redirection
portant sur un groupe de commandes. La redirection de stderr ncessite dutiliser son
descripteur de valeur 2 :

commande 2 > fichier

echo bonjour > &2 redirige le message sur la sortie standard derreurs

commande > test 2 > &1 redirige la sortie vers le fichier test et la sortie standard des
erreurs vers la sortie standard

Pour rediriger stdin pendant toute la session dexcution de exec, on utilisera :
exec < fichier. De mme exec > fichier.

Il est possible de transmettre des arguments main () dun excutable C lors du lancement
de son excution grce aux deux arguments : main (int argc, char **argv) dans cet ordre
o :
argc (arguments count) est le compteur darguments, nom du programme excutable
inclus
argv (arguments vector) est un vecteur de pointeurs sur chanes de caractres qui
contiennent les arguments de la ligne de commande, raison de un par chane ; argv [0]
pointe sur le nom de lexcutable et argv [argc] vaut NULL.
Exemple : tp1.e toto titi
argc vaut 3, argv[0] pointe sur tp1.e ; argv[1] pointe sur toto ; argv[2]
pointe sur titi



1.3 Utilitaires standards

UNIX dispose dutilitaires standards nombreux parmi lesquels (voir annexe pour
certains) :

- compilateurs (notamment C) avec son vrificateur lint, ses dbogueurs adb, sdb et
dbx et son archiveur de bibliothques ar
- gestionnaire dapplications make et sccs
- outils de gnration de compilateurs lex et yacc
diteurs de texte / manipulateurs de documents ed, sed, vi, emacs, nroff, troff


Systme d'exploitation - chapitre 2

3

2. LE SYSTEME DE GESTION DE FICHIERS (SGF)



Le S.G.F. gre une structure d'arbre :
- la racine est dsigne par /
- les nuds sont les rpertoires non vides
- les feuilles sont les rpertoires "vides" et les fichiers.

Les chemins sont dcrits avec le sparateur /

Exemple : /users/eleves/m-dupont96 est une rfrence absolue (commence par /)
source/tp1.c est une rfrence relative (par rapport au rpertoire courant), car ne
commence pas par /

Un fichier est une suite d'octets, gnralement non structure.
Les noms de fichiers et rpertoires sont limits 14 caractres (/ est interdit et - ne peut tre le
premier caractre).

A chaque instant, l'utilisateur accde un rpertoire courant dans cette arborescence. Il se dplace
avec la commande cd.



2.1 Les i-nodes

A tout fichier est attach un nud d'index, ou i-node contenant des informations sur ce fichier. C'est
une structure de quelques dizaines doctets dcrite dans /usr/include/sys/inode.h qui contient
gnralement les champs suivants :

- le type (fichier ordinaire, spcial, catalogue ,...),
- les protections,
- les dates de cration, accs et mise jour (en s. coules depuis le 1/1/1970),
- la taille du fichier en octets,
- le nombre de liens (un lien d'un fichier est un autre nom de ce fichier),
- les lments d'identification du propritaire et de son groupe,
- l'adresse physique d'implantation sur disque (cf. chapitre 7) sous forme de 13
adresses de blocs disques

Bon exemple : Braquelaire p. 370-378.

L'i-node ne contient pas de "nom de fichier". La dsignation d'un fichier se fait par l'intermdiaire du
rpertoire dans lequel est stock le numro d'i-node (entier naturel sur 2 octets) et le "nom relatif"

Systme d'exploitation - chapitre 2

4

sur 14 octets. Ainsi, tout fichier est rfrenc de manire unique par son numro d'i-node , mme si
son "nom relatif" peut tre non unique dans l'arborescence.

L'i-node de n 0 n'est jamais utilise. L'i-node de n 1 permet la gestion des blocs dfectueux. La
racine de larborescence possde li-node de n 2.

Dans chaque rpertoire,'' est un lien au rpertoire lui-mme (dans le rpertoire, en regard de ce
"nom", figure le n d'i-node du rpertoire).De mme, '' est un lien au rpertoire pre (dans le
rpertoire, en regard de ce nom, figure le n d'i-node du rpertoire pre). Un rpertoire UNIX n'est
donc jamais totalement vide.

Les i-nodes des fichiers d'un disque sont implants par numro croissant au dbut du disque (voir
2.4), ce qui en facilite beaucoup l'accs. Les i-nodes des fichiers ouverts sont copis en mmoire
centrale dans la table des i-nodes.


2.2 Les diffrents types de fichiers

On distingue :
- les fichiers ordinaires : donnes, programmes, textes

- les fichiers spciaux : ils correspondent des ressources. Ils n'ont pas de taille. Les oprations de
lecture/criture sur ces fichiers activent les dispositifs physiques associs. On distingue :

- character devices : fichiers spciaux en mode caractre (par exemple : terminaux)
- block devices : fichiers spciaux en mode bloc (par exemple : disques)
un bloc comprend 512 octets, 1024 ou davantage.

- les fichiers rpertoires contiennent des informations sur d'autres fichiers et permettent la
structuration arborescente

- les fichiers de liens symboliques : les fichiers qui sont des tubes nomms, les fichiers qui sont des
prises rseaux.


2.3 Les protections des fichiers

A la cration d'un compte d'utilisateur, l'administrateur affecte celui-ci un groupe. Chaque groupe
possde un nom. Un utilisateur peut changer de groupe par la commande newgrp. On peut donner
des droits d'accs particuliers certains fichiers pour les membres d'un mme groupe.

Au total, il existe 3 types d'accs : propritaire (u = user), groupe (g = group), autres (o = other).
L'ensemble est dsign par a (all).

L'expression des droits ncessite 12 bits :


Systme d'exploitation - chapitre 2

5

user
group other
r
w x r w x r w
x
set-gid
set uid
1 1 0 1 1
1
1
0
1 1
0
0
6 7
5
4
en octal
attribut spcifique



Pour un fichier, r = droit de lecture, w = droit d'criture, x = droit d'excuter (1 = oui, 0 = non)

Pour un rpertoire,
r :on peut consulter la liste des fichiers qui y sont contenus
w : on peut crer ou effacer des fichiers l'intrieur
x : on peut utiliser ce rpertoire en argument d'une commande et s'y positionner

Ces 9 bits sont prcds par 3 autres bits pour complter la description des protections :

- le bit "set-uid" : quand il vaut 1 pour un fichier excutable, le processus d'excution a
les droits du propritaire du fichier et non de l'utilisateur qui le lance

- le bit "set-gid" : mme rle, mais relativement au groupe

- l'attribut spcifique : outre la valeur "-" pour les fichiers ordinaires, il peut prendre la
valeur :
d fichier rpertoire
c fichier spcial en mode caractre (cas des terminaux)
b fichier spcial en mode bloc (cas de lecteurs de disques ou de bandes)
s bit de collage ou "sticky-bit" : il maintient le fichier en zone de recouvrement
(swap) partir de laquelle le chargement est plus rapide


La commande ls avec l'option l permet d'afficher les protections de fichiers. La commande
chmod permet de modifier les protections d'un fichier.

Exemple : d rwx rwx - - - 139 pagnotte profess 352 Nov 25 1999 tp
tp est un rpertoire (d)
Son propritaire est pagnotte, du groupe profess
les protections rwx rwx - - - sont interprter selon les indications ci-dessus

La commande ls - ias permet l'affichage succinct des numros d'i-nodes du rpertoire.



2.4 SGF mono- ou multi-volumes

Un SGF UNIX peut tre subdivis en plusieurs disques logiques appels "filesystem" ou "volume"
(cas d'un seul disque partitionn, cas de plusieurs disques sur la mme machine ou cas d'un systme
de fichiers rparti sur plusieurs machines). Chaque filesystem comporte une arborescence de fichiers

Systme d'exploitation - chapitre 2

6

partir de sa propre racine. L'un d'eux est appel "root filesystem" ; il fdre les autres arbres. Cet
"accrochage" est ralis par l'administrateur du systme grce la commande /etc/mount : on dit
qu'une arborescence est monte sur le SGF.Un n d'i-node peut alors ne plus tre unique : il doit tre
obligatoirement associ au n du volume.

Le systme gre une table des volumes "monts" avec deux copies : l'une en mmoire centrale,
l'autre sur disque (fichier /etc/mttab sur UNIX System V).

L'ensemble des informations sur disque associes un arbre est divise en 4 zones :

- zone 0 : pas utilise par le SGF, mais par UNIX lui-mme. C'est le bootstrap, contenant la
procdure d'initialisation du systme, de montage/dmontage des volumes.

- zone 1 : elle est appele superbloc. Elle contient des informations sur le S.G.F. :
- caractristiques du SGF (nom du volume, nom et type du SGF, tat du SGF pour savoir si le
systme a bien t arrt normalement, date de mise jour, taille en blocs du SGF, etc...)
- caractristiques des blocs libres (nombre, liste partielle, index vers le tableau des blocs
libres, verrou d'accs aux blocs libres, etc...). Le superbloc est dfini dans
/usr/include/sys/fs/s5param.h
- zone 2 : appele i-list (liste d'index). Elle contient les i-nodes du volume.
Pour augmenter la performance, le superbloc et la i-list sont copis en mmoire et sauvs
priodiquement sur disque.

- zone 3 : contient les fichiers proprement dits.


Le root filesytem contient un certain nombre de rpertoires standards :

/bin,/usr/bin utilitaires standards
/dev fichiers spciaux pour priphriques (cf. ci-dessous)
/etc commandes, fichiers de maintenance/administration du systme
/lib et /usr/lib bibliothques standards
/unix le noyau du systme
/usr/adm les fichiers de comptabilit
/tmp, /usr/tmp fichiers temporaires.
/usr/include fichiers en-ttes, d'extension .h
/usr/src les sources du systme

L'adresse de sa racine figure "en dur" dans le noyau du systme. Cette rfrence servira construire
la totalit de l'arbre des i-nodes, contrler les appels systme de recherche, de cration et de
modification des i-nodes.

La variable d'environnement HOME mmorise le chemin du rpertoire courant de l'utilisateur.



3. LES COMMANDES

Il existe de nombreuses commandes de base dcrites dans la section 1 du Manuel de rfrence ou
accessibles par la commande
man nom_de_commande

On trouvera ci-aprs les principales . Leur syntaxe n'est pas homogne. Elle est souvent de la forme :
nom [-options] [arguments]


Systme d'exploitation - chapitre 2

7

Toute commande donne une valeur de retour nulle si le rsultat est sans erreur ou vrai, non nulle
sinon.

Un tube | permet de relier la sortie standard d'une commande l'entre standard de la suivante. Un
tube retourne la valeur de retour de sa dernire commande
exemple :
ls | wc
ls | grep pa | wc - l
# on recherche les lignes du rpertoire contenant pa et on affiche leur nombre)
who | tee /tmp/g
# les informations transmises la sortie standard le sont aussi au fichier cit, ici /tmp/g

Une liste est une squence de commandes ou de tubes spars par des ; ou && ou || ou & et
termine par ; ou & Ainsi :

liste1 ; liste2 produit une excution squentielle des listes.

liste1&& liste2 : liste2 est excute si la valeur de retour de liste1 est VRAI (0)

liste1 || liste2 : liste2 est excute si la valeur de retour de liste1 nest pas VRAI (1)

Une liste entre des ( ) est excute dans un nouvel environnement, c'est dire un processus shell fils
cr cet effet

Substitution de commande : $(commande)
$ echo la date est $(date)
la date est Mon Oct 14 21:32 MET 1999


Les alias : un alias est un surnom de commande
alias [-x] [nom[=valeur]]
-x : l'alias est export (rutilisable)
aucun nom : la liste des alias est visualise
pas de valeur : la valeur de l'alias dsign est visualise
Exemple : $ alias la="ls -ia"
Pour supprimer un alias, unalias nom
alias permet d'abrger des noms de commandes longs ou frquemment utiliss




at at 18 mar 15 fic1 lance l'excution de fic1 le 15 mars 18 heures pour les utilisateurs rpertoris
dans /usr/lib/cron/at.allow et non rpertoris dans /usr/lib/cron/at.deny

basename chane [suffixe]
basename /usr/include/sys/sgtty.h affiche sgtty.h
basename /usr/include/sys/sgtty.h .h affiche sgtty

cal [mois] anne affiche le calendrier de l'anne, ou seulement du mois.

cancel ident_req annule la requte d'impression ident_req obtenue par la commande lp

cat cat fic1 fic2 > fic3 concatne fic1 fic2 dans fic3 (cat = catenate and print )
cat fic1 concatne fic1 rien et redirige par dfaut sur la sortie standard, donc affiche le
contenu de fic1

Systme d'exploitation - chapitre 2

8

cat > fic2 concatne l'entre standard rien et la redirige sur fic3, donc saisit dans fic3
[r]initialis ce qui est frapp au clavier, jusqu' la frappe de <EOF> (CTRL-D par
dfaut).

cd dir (change directory) change le rpertoire courant pour dir. En l'absence d'argument spcifi,
dir = HOME

chgrp group filenames change le groupe des fichiers filenames pour group.
L'option -R effectue un changement rcursif sur toute une arborescence de racine donne

chmod mode filename affecte la protection mode filename (cf. ci-dessus).
chmod 544 fic1 affecte la protection r-xr--r-- fic1
chmod g+x fic1 transforme cette protection en r-xr-xr--
chmod a+w fic1 donne tout le monde le droit d'criture dans fic1
chmod u-w fic1 retire ce droit au propritaire.

chown owner filenames change le propritaire des fichiers filenames pour owner.
L'option -R effectue un changement rcursif sur toute une arborescence de racine donne

cmp filename1 filename2 donne le n de l'octet et de la ligne o se produit la premire diffrence
entre filename1 et filename2.

cp cp filename1 filename 2 copie filename1 sur filename2
cp -r directory1 directory2 copie rcursivement directory1 avec son sous-arbre dans
directory2, en le crant s'il n'existe pas.
cp filenames directory copie les filenames dans directory.
-i demande confirmation
-s produit simplement un code de retour (0 : identiques, 2 : diffrents,
3 : erreur)

crontab Le processus systme cron, cr la gnration du systme, gre toutes les tches
priodiques, y compris de l'arrive du courrier dans les botes aux lettres. La commande
crontab permet un utilisateur de rajouter, de lister ou de retirer un fichier de tches
priodiques (batch) :
crontab filename ajoute le filename de tches priodiques
crontab -l liste le fichier de tches priodiques de l'utilisateur
crontab -r retire le fichier de tches priodiques de l'utilisateur

Un fichier de tches priodiques comprend une ligne par tche. Chaque ligne comprend 6
champs spars par des blancs ou des TAB , * spcifiant n'importe quelle valeur :
les minutes (0-59) de l'heure de lancement,
l'heure (0-23) de la date de lancement,
le jour de lancement (ou les jours de lancement) dans le mois (0-31),
le mois de lancement
le jour de lancement dans la semaine (0-6, 0=dimanche),
le texte de la commande lancer
0 14 * * 1-5 fic1 excutera fic1 chaque semaine du lundi au samedi 14 h.
0 0 1,15 * 1 fic2 excutera fic2 chaque lundi, et chaque 1er et 15 de chaque mois 0 h.

crypt chane crypte l'entre standard avec la cl chane ou la dcrypte

cut permet d'extraire des caractres ou des champs de chaque ligne d'un fichier.
ls|cut -c1,4,7 extrait les caractres 1, 4 et 7 de la sortie de ls
ls|cut -c1-3,8 extrait les caractres 1 3, et 8 de la sortie de ls
l'option -f permet de spcifier des champs au lieu de caractres
l'option -dc permet de respcifier le dlimiteur de champ

Systme d'exploitation - chapitre 2

9

(TAB par dfaut, nouvelle valeur c)

date affiche la date

du du affiche le nombre de blocs (512 ou 1024 octets) occups par chaque sous-arbre du
rpertoire courant
du -a affiche cette information pour tout fichier, tout rpertoire du rpertoire courant.
du -s affiche seulement le total

echo chane_de_caractres affiche chane_de _caractres sur l'cran.
echo "Votre nom \c" le curseur ne va pas la ligne

expr interprte les arguments pour des calculs numriques. Voir exemple plus loin

file filename affiche la nature prsume du contenu de filename

find pathname_list expression parcourt rcursivement le sous-arbre dont le chemin d'accs est
pathname_list en recherchant les fichiers satisfaisant expression.
find / -name fic1 -print recherche fic1 dans toute l'arborescence.
find / -user gr1605 -print affiche la liste des fichiers appartenant gr1605
find source -perm 777 -type f -exec rm {}\; recherche les fichiers ordinaires (-type f; b
dsignerait un fichier de type bloc, c un fichier de type caractre et d un rpertoire) dans le
sous-rpertoire source, les efface (aprs -exec, on peut utiliser n'importe quelle commande
en la faisant suivre de "\;"). Les accolades {} remplacent le nom du fichier trouv

grep [-civw] pattern filenames
"globally find regular expressions and print". Les pattern sont des expressions rgulires
de ed ou sed. Les lignes satisfaisant ces critres sont affiches. Voir exemple ci-dessus.
Les options :
-c (count) compte les lignes sans les afficher
-i considre les majuscules et minuscules de faon identique
-v (reverse) cherche les lignes ne correspondant pas au critre
-w (word) cherche pattern comme un mot isol

head [-n] filename affiche les n premiers caractres de filename (10 par dfaut)

id affiche le nom et le n (UID) de l'utilisateur, son nom et son n de groupe (GID)

ln filename1 filename2 cre un nouveau lien de nom filename2 pour le fichier filename1
Il n'y a ni copie du fichier, ni cration d'un nouvel i-node, mais simplement augmentation
du compteur de rfrence du fichier dans un rpertoire, c'est dire ajout d'un couple (n,
rfrence)

logname affiche l'identification de l'utilisateur (valeur de la variable d'environnement LOGNAME)

lp filename ajoute la requte d'impression de filename la queue du spoule

lpstat affiche des informations sur l'imprimante et son spoule

ls [-alR] filename affiche le contenu du rpertoire filename.
Sans argument, le rpertoire courant est trait. Les principales options :
-a permet l'affichage des noms de fichiers commenant par .
-l format long. Sont affichs : nombre de liens, propritaire, taille en octets, date de
dernire modification, mode (d = rpertoire, b = fichier bloc, c = fichier caractre, l = lien
symbolique, p = tube nomm, - = fichier ordinaire)

Systme d'exploitation - chapitre 2

10

-i affiche les numros d'i-nodes
-R rcursif, gnre la liste du sous-arbre tout entier

mkdir dir cre un nouveau rpertoire.
L'option - m droits cre un nouveau rpertoire avec les droits spcifis

more filename affiche le contenu du fichier texte filename, un cran complet la fois. Si l'on
frappe :
ESPACE une ligne supplmentaire est affiche
RETURN un nouvel cran est affich
b l'cran prcdent est affich
h affiche l'aide (liste complte des options)
q on quitte more

mv mv filename1 filename2 change le nom (lien) filename1 en filename2.
mv directory1 directory2 change le nom directory1 en directory2 si directory2 n'existe
pas dj et si directory1 et directory2 ont le mme pre.
mv filenames directory cre un lien entre les filenames et le directory

paste filename1 filename2 concatne les lignes de mme numro de filename1 et de filename2

pwd (print working directory) affiche la rfrence absolue du rpertoire courant

rm [-ri] filenames efface les liens des filenames dans le rpertoire courant, si le droit d'criture dans
le rpertoire existe.
Le contenu d'un fichier qui n'a plus de lien est perdu. Options :
-i interactif. Demande une confirmation pour chaque fichier.
-r rcursif pour tout le sous-arbre, si l'argument est un rpertoire

rmdir dir supprime le rpertoire dir s'il est vide
-i avec confirmation

rpl chaine 1 chaine 2 < fic1 > fic2
remplace toutes les occurences de chaine1 par chaine2 dans fic1 et met dans fic2
ex.: rpl " IT " "Italie" < films.cine > films.tele

sort [options] [+n1 -n2] filename1 [-o filename2]
trie, selon l'ordre lexicographique du code, les lignes de filename1, affiche le rsultat ou le
redirige sur filename2. Options :
-b on ignore les espaces de tte
-d seuls les chiffres, lettres et espaces sont significatifs dans les comparaisons,
-f majuscules et minuscules sont confondues,
-i les caractres dont le code ASCII est extrieur l'intervalle [32,126] sont
ignors dans les comparaisons,
-n les dbuts de lignes numriques sont tris numriquement,
-tc dfinit comme c le sparateur de champs au lieu de TAB

Les options +n1 -n2 dlimitent la cl : du champ n n1 inclus au champ n n2 exclu. La
numrotation des champs commence 0.
sort permet aussi le tri sur des portions de champs, sur plusieurs cls, ou des fusions de
fichiers (voir Nebut p. 135-137)

split -number infile outfile fragmente le fichier infile en fichiers de number lignes (1000 par
dfaut), de noms outfileaa, outfileab, etc... (outfile = x s'il n'est pas spcifi)

stty [-a] options

Systme d'exploitation - chapitre 2

11

L'utilisation des terminaux fait appel 10 caractres particuliers, dsigns par un nom
symbolique :
<NEWLINE> : dans l'utilisation normale bufferise, le processeur d'E/S reoit un
caractre du clavier, envoie un cho l'cran. Mais il n'envoie les caractres au processeur
central qu'aprs rception de <NEWLINE>. Par dfaut le caractre NL du code.
<ERASE> : effacement du caractre prcdent. Par dfaut :# ou le caractre BS du code
ou CTRL-H
<KILL> : effacement de la ligne courante. Par dfaut @ ou CTRL-U
<EOL> : marqueur de fin de ligne. Par dfaut \0 ou CTRL-@
<EOF> : marqueur de fin de fichier s'il est en dbut de ligne. Par dfaut le caractre EOT
du code ou CTRL-D.
<STOP> : interrompt le flux de caractres vers la sortie. Par dfaut le caractre DC3 du
code ou CTRL-S.
<START> : relance le flux de caractres vers la sortie. Par dfaut le caractre DC1 du
code ou CTRL-Q.
<INTR> : mission du signal SIGINT. Par dfaut le caractre DEL du code ou CTRL-C.
<QUIT> : mission du signal SIGQUIT. Par dfaut CTRL-\ ou CTRL-Z

stty caractre_de_contrle c donne la nouvelle valeur c au caractre_de_contrle
avec la syntaxe '^D' pour CTRL-D et '^?' pour DEL

stty -a affiche les options actuelles de la sortie standard.
stty sane rtablit les valeurs par dfaut

tail [options] filename affiche la fin de filename.
tail -14c fic1 affiche fic1 partir du 14me caractre avant la fin
Au lieu de c, on peut utiliser l (ligne) ou b (bloc)
tail +25l fic2 affiche la fin de fic2 partir de la 25me ligne

tee [-a] filename l'affichage de la sortie standard est en mme temps dirig sur filename
L'option -a signifie >>

test exp ou [ exp ] retourne 0 si la valeur de exp est vrai, 1 sinon. exp peut tre :
-a<filename> : vrai si filename existe
-r<filename> : vrai si filename existe et peut tre lu,
-w<filename> : vrai si filename existe et peut tre crit,
-x<filename> : vrai si filename existe et peut tre excut,
-f<filename> : vrai si filename existe et est un fichier ordinaire,
-d<filename> : vrai si filename existe et est un catalogue,
-b<filename> : vrai si filename existe et est de type bloc,
-c<filename> : vrai si filename existe et est de type caractre,
-s<filename> : vrai si filename existe et est de taille non nulle,
-z<chane> : vrai si la chane est de longueur nulle,
-n<chane> : vrai si la chane est de longueur non nulle,
<chane1> = <chane2> : vrai si les deux chanes sont gales,
<chane1> != <chane2> : vrai si les deux chanes sont diffrentes,
<valeur1> -eq <valeur2> : vrai si les deux valeurs sont gales,

autres prdicats possibles : -ne (),-gt (>),-lt (<),-ge (), -le ()
On peut composer les conditions avec les oprateurs boolens -a ou && (ET), -o ou || (OU), !
(NON)

tr string1 string2 l'entre standard est copie sur la sortie standard, mais un caractre ayant une
occurence dans string1 est remplac par le caractre de mme rang dans string2. Avec
l'option -d, les caractres en entre, prsents dans string1, sont supprims en sortie.
tr [a-z][A-Z] < fic1 affiche fic1 en remplaant les minuscules par des majuscules.

Systme d'exploitation - chapitre 2

12

tr -d '\012' < fic1 affiche fic1 en supprimant (option -d) les caractres de code ASCII 12
en octal, donc 10 en dcimal, donc en supprimant les sauts de ligne
tr -s "a-z" "A-Z" < fic1 rduit toute chane de caractres identiques en un seul
tr abc xyz < fic1 traduit a en x, b en y, c en z

tty affiche le nom du terminal associ la sortie standard

wc [-lwc] filename
wc fic1 affiche le nombre de lignes, mots, et caractres de fic1
wc -lc fic1 affichera le nombre de lignes et de caractres de fic1
L'option -w correspond aux mots, -l aux lignes, -c aux caractres

whereis filename affiche le chemin d'accs filename.

who affiche la liste des utilisateurs connects

xd filename affiche filename en hexadcimal et "en clair".
ls|xd affichera les noms complets des fichiers du rpertoire courant, y compris les
caractres non affichables qui pourraient tre prsents dans les noms de fichiers




4. LE SHELL

Le shell (littralement coquille autour du noyau d'UNIX) est l'interprteur de commandes d'UNIX.
Tout la fois :
- il excute en mode interactif les commandes mises par l'utilisateur,
- il propose un langage de programmation interprt permettant de gnrer de nouvelles
commandes ou procdures catalogues ("scripts shell"), C tant le langage le plus adapt pour
construire les nouvelles commandes que le shell ne peut traduire.

Le shell ne fait pas partie du noyau d'UNIX et n'est pas rsident en mmoire principale. Ainsi, on
peut disposer facilement de plusieurs interprteurs de commandes : Bourne-shell, C-shell, Korn-
shell, ...

Dans tout shell d'UNIX, un blanc est un espace ou un caractre de tabulation. Un sparateur est un
blanc ou un caractre NL. Un mot est une chane de caractres entre deux sparateurs. Tout ce qui
est entre deux ' est considr comme un seul mot.

4.1 Les variables shell

leur nom : une suite de caractres lettres, chiffres et _ commenant par une lettre ou _
ex.: a=paul chemin=/users/eleves/m-durand99

leur valeur : $a ou ${a} dsigne la valeur de la variable a et ${a}c dsigne la valeur de a suivie de c.
ex.: a=paul
b=chou
echo $a $b

On utilise trois caractres gnriques :
* toute sous-chane, mme vide,
? tout caractre,
[...] tous les caractres d'un intervalle.
Toute fin de ligne commenant par # est un commentaire

Systme d'exploitation - chapitre 2

13


ex.: ls - l *.c # dite les noms de fichiers d'extension .c

ls -l [a-e]* # dite les noms de fichiers commenant par a e.

mtacaractres : < * ? | & , \ ont un sens spcial.
ex.: a="bijou * caillou "
b=chou ; c=caillou ; r="$a $b";echo $r

Prcds de \, les mtacaractres perdent leur signification particulire
ex.: echo \* ; echo \\ echo abc\*\*\*d

les dlimiteurs de chanes :
dans une chane dlimite par des " , les caractres $, \, ', ` sont des caractres spciaux.
dans une telle chane, un caractre " doit tre prcd de \
dans une chane dlimite par des ' , tous les caractres perdent leur aspect spcial

types de variables : la commande typeset [-filrux ] [variable [= valeur]] permet de typer une
variable
et/ou de lui affecter une valeur:
-f : variable est une fonction
-i : variable est de type entier
-l : majuscules transformes en minuscules
-r : variable accessible seulement en lecture
-u : minuscules transformes en majuscules
-x : variable exporte

Exemples :
$ typeset -r v=abc
$ echo $v
abc
$ typeset v=hier
/bin/ksh v is read only
$ w=3+5
$ echo $w
3+5
$ typeset -i w
$ echo $w
8
$ typeset +r v (dprotection de v)
$ v=123
$ echo $v
123

rgles de substitution : elles utilisent les { }

${#variable} : longueur de la variable
$ X=abc
$ print ${#X}
3

${variable :- mot} : valeur de variable si elle est dfinie et non nulle, sinon valeur de mot
$ X=abc
$ print ${X-:cde}
abc

Systme d'exploitation - chapitre 2

14

$ unset X
$ print ${X:-cde}
cde

${variable := mot} : valeur de variable si elle est dfinie et non nulle, sinon variable
prend la de mot
${variable :? mot} : valeur de variable si elle est dfinie et non nulle, sinon valeur de mot
et sortie
${variable :+ mot} : valeur de mot si variable est dfinie et non nulle, sinon pas de
substitution
$ Y=abc
$ print ${Y=+def}
def
$ unset Y
$ print ${Y:+def}
$ ........

${variable#pattern} ou ${variable##pattern} : valeur de variable laquelle on extrait
en partant de la gauche la plus petite partie (ou la plus grande) correspondant au
pattern
$ X=abcabcabc
$ print ${X#abc*}
abcabc
$ print ${X##abc*}
$ (rien)

${variable % pattern} ou ${variable %% pattern} : idem ci-dessus, mais en partant
de la droite


les tableaux de variables : en assignant X [1] une valeur, la variable X est transforme en tableau
$ X=A
$ X[1]=B (alors, X [0] vaut A )

On peut affecter ainsi :
variable[0]=valeur0 ; variable[1]=valeur1 ; .... ; variable[n]=valeurn
ou encore : set -A variable valeur0 valeur1 ..... valeurn
ou encore :
typeset variable[0]=valeur0 variable[1]=valeur1...variable[n]=valeurn

On peut raffecter ainsi : set -A variable valeur0 valeur1 ..... valeurn
ou encore en ne donnant que certaines valeurs :
$ set -A X one two three d e f
$ print ${X[*]}
one two three d e f
$ set -A X a b c
$ print ${X[*]}
a b c d e f
$ print ${X[1]}
b
$ print ${#X[*]}
6 (nombre d'lments du tableau)

variables prdfinies gres automatiquement par le shell :

$# nombre de paramtres d'une commande, ceux-ci tant dsigns par $1 $9

Systme d'exploitation - chapitre 2

15

($0 le nom de la commande elle-mme).

$* la liste des paramtres $1 $2 ...

$$ le numro du processus en cours (trs utile dans la suite)

$! le n du dernier processus lanc en arrire plan

$? le code de retour de la dernire commande excute

variables d'environnement prdfinies :

HOME l'argument par dfaut pour la commande cd, c'est dire le chemin correspondant
au sous-rpertoire l'ouverture de la session
LOGNAME le nom de l'utilisateur (sous SYSTEM V) ou USER (sous systme BSD)
PATH la liste des rpertoires chercher pour excuter une commande
PS1 le prompt principal
PS2 le prompt secondaire
IFS la liste des sparateurs de mots pour le shell (inter fields separators)
SHELL le shell courant
TERM le type de terminal
TZ le fuseau horaire (time zone)

Le fichier .profile permet de donner des valeurs non standards aux variables d'environnement et
d'excuter des commandes comme :
uname -a (nom de la machine)
umask (masque des autorisations d'accs au fichier par dfaut)
ulimit (taille maximale des fichiers)
banner (affichage d'une bannire en grandes lettres).

La commande set permet d'afficher la valeur des variables d'environnement

Exemple d'un fichier .profile :
HOME=/home/$LOGNAME
PATH=$PATH:$HOME/mes_tp
PS1="OK ?"
banner HELLO WORLD
export HOME PATH PS1



4.2 Les shell scripts

L'interprteur de commandes est un fichier excutable se trouvant dans /bin. Le shell est donc lui-
mme une commande.

Ainsi, pour disposer d'une nouvelle procdure catalogue ( "script shell"), on saisit dans un fichier
(par exemple ici fic) une liste de commandes avec un diteur

Pour excuter ce fichier, on a deux solutions:

sh fic [arg] ou mieux chmod u+x fic
fic [arg]


Le langage de commandes du shell dispose des structures classiques if, for, while, until.

Systme d'exploitation - chapitre 2

16


4.3 Boucle for

for var [in mot1 [mot2 ...]]
do liste_de_commandes
done

var prend les valeurs mot1, mot2, ... et excute la liste de commandes pour chaque valeur

ex.: for i do grep $i /users/eleves/m-durand99/telno
done

# on range ce script dans le fichier TEL qu'on rend excutable
# ici, la liste des valeurs est vide; par dfaut,
# elle est prise gale $*, la liste de paramtres de commande

$ TEL paul bernard
# affichera les lignes de /users/eleves/m-durand99/telno contenant paul ou bernard


4.4 Boucle while

while liste_de_commandes
do liste_de_commandes
done

On boucle tant que la dernire commande de la liste renvoie 0 (vrai).
ex.: while test $# -ne 0 # tant qu'il y a des paramtres...
do echo $1 #...on affiche le premier
shift # on dcale les paramtres
done
# on range ce script dans le fichier ACTION qu'on rend excutable

ACTION toto titi # affiche toto titi


4.5 Boucle until

until liste_de_commandes
do liste_de_commandes
done

On boucle jusqu' ce que la dernire commande de la liste renvoie 0 (vrai).

ex.: until test -f fic
do sleep 50 #attendre 50 s.
done


4.6 Choix if

if liste_de_commandes

Systme d'exploitation - chapitre 2

17

then liste_de_commandes
[elif liste_de_commandes
then liste_de_commandes ]
[else liste de commandes ]
fi

On excute "then" si la dernire commande de la liste de "if" retourne 0 (vrai).

ex.: if test -f "$1"
then echo fichier $1 trouve
else echo pas de fichier de nom $1
fi


4.7 Slection case

case vise viter les imbrications de if :
ex.: # fichier ajout
case $# in
1) cat >> $1;;
2) cat >> $2 <$1;;
*) echo "syntaxe : ajout [origine] destination";;
esac

ajout fich #ajoute en fin de fichier jusqu' <CTRL-D>
ajout f1 f2 # f1 copi en fin de f2


On notera aussi les commandes break et continue (idem C). C-Shell contient aussi foreach.


4.8 Slection select

select est une commande intermdiaire entre case et for, utile pour la gestion des menus
ex.: # fichier stest
select i in Choix-A Choix-B Choix-C
do
if [$i = Choix-[A-C]]
then
print "Vous avez choisi $REPLY : $i"
else
print "$REPLY : mauvais choix"
continue
fi
done

$ stest
1) Choix-A
2) Choix-B
3) Choix-C
#? 5
5 : mauvais choix
#? 3
Vous avez choisi : 3

Systme d'exploitation - chapitre 2

18

#? <RETURN> # menu raffich
.............


4.9 Utilisation du rsultat d'une commande

On peut utiliser comme paramtre, ou affecter une variable, la sortie standard d'une commande
place entre ` `

exemples 1 : for i in `ls`
do echo " "$i
done

2 : c=`pwd` # voir commande pwd
ls $c # affiche le catalogue de travail

3 : set `date` ; echo $3 $2 $6
# set range dans les variables prdfinies $1, $2, etc....
# il s'affiche jour, mois anne


4.10 Autres commandes

read echo "Votre nom ? \c"
read name
echo "Bonjour $name, ca va ?"

print "this is a play again" | read X Y Z
print $X
this
print $Y
is
print $Z
a play again

exec ralise des redirections d'E/S
exec 1 > std.out # redirige la sortie standard vers le fichier std.out

exec < fic # redirige l'entre standard sur le fichier fic
.......
exec < /dev/tty # rtablit l'entre standard

exec 5<>fic.out
# le fichier fic.out est ouvert en lecture-criture avec le descripteur 5
print -u5 "Tout va bien"
cat < &5 # lecture partir du fichier de descripteur 5
exec 5 < &- # fermeture du fichier de descripteur 5

let let "expression arithmtique" ou ((expression arithmtique))
exemples :
((X=-7))
((Y=-X+2))
echo $Y
toutes les oprations arithmtiques de C sont permises avec let


Systme d'exploitation - chapitre 2

19

true retourne 0

false retourne 1



5. LE NOYAU D'UNIX


Le noyau est responsable de presque toutes les tches de base qui sont excutes par des procdures
systme :

- initialisation du systme ,
- gestion des ressources : temps, mmoire primaire,

- gestion des fichiers : cration, utilisation, disparition, gestion de la mmoire secondaire,

- gestion de la mmoire : gestion de la segmentation et de la pagination.
- gestion des processus : contrle de la cration, de la terminaison, de la synchronisation,
du partage de temps (ordonnancement), de la communication entre processus,

- gestion des E/S : slection des pilotes (drivers) pour contrler l'E/S en fonction du n
majeur et du n mineur du fichier spcial slectionn,

- gestion des communications : rseaux locaux, X25, etc...

Pour assurer ces activits, le noyau dispose d'un certain nombre de tables :
- table des processus dcrivant l'tat des processus,
- table des fichiers ouverts,
- table des i-nodes en mmoire,
- pour chaque processus, une table des descripteurs de fichiers,
- table des volumes monts,
- table des textes (pour les excutables partageables)

Le noyau rside en mmoire principale tant que le systme est en fonctionnement.

BIBLIOGRAPHIE


S.BOURNE , Le systme UNIX, Interditions 1985
J.P. BRAQUELAIRE, Mthodologie de la programmation en Langage C, Masson, 1993
A.B. FONTAINE, Ph. HAMMES, UNIX Systme V, Masson, 1993
B. KERNIGHAN et R. PIKE , L'environnement de programmation UNIX, Interditions, 1985
J.L. NEBUT , UNIX pour l'utilisateur, Technip, 1990
J.M. RIFFLET , La programmation sous UNIX, Mac Graw-Hill, 1992
A. TANENBAUM, Systmes dexploitation, Prentice Hall, 1999

Systme d'exploitation - chapitre 2

20

ANNEXE : QUELQUES UTILITAIRES

1. ar

ar permet de construire et de mettre jour des bibliothques utilises par l'diteur de liens ld.
On peut ainsi rassembler plusieurs modules objets en un seul fichier d'archive.

Syntaxe : ar cl lib liste_ref avec :

lib nom du fichier archive (la bibliothque),
cl d supprimer la liste de l'archive
r si l'un des modules de la liste est dans l'archive, il sera remplac; sinon, il sera
cr
q ajouter de nouveaux modules la fin de l'archive, sans examiner l'existant
t ou p lister le contenu de l'archive
x extraire des modules de l'archive
liste_ref liste de fichiers objets


2. awk

awk (du nom de ses crateurs, Aho, Weinberger et Kernighan), est un micro-langage de
programmation, accessible par le shell d'UNIX, inspir de C et interprt.

appel : awk 'programme' nom_fichier ou awk -f refprog nom_fichier
o refprog est le fichier contenant le programme
nom_fichier est le fichier de donnes pour le programme ou une liste de fichiers

Un programme est de la forme :

BEGIN {...........}
{ ................}
END { ............}
Les sections BEGIN et END sont facultatives.

Dans le corps du programme (section 2), on peut utiliser la syntaxe complexe de grep pour exprimer
des expressions ("motifs").

identificateurs : comme en C, mais pas de dclarations. Les types flottant et chane de caractres
sont implicites.

Des variables sont prdfinies :
$0 : l'enregistrement courant du fichier
$1, $2, ... : ses champs
FS : sparateur de champs (SP et HT par dfaut)
RS : sparateur d'enregistrements (LF par dfaut)
OFS : sparateur de champs en sortie (SP par dfaut)
ORS : sparateur d'enregistrements en sortie (LF par dfaut)
NF : nombre de champs de $0
NR : numro de l'enregistrement courant $0

oprateurs : + - * / % ++ - < > <= >= == != ! && ||

fonctions : length (ch) retourne la longueur de la chane ch

Systme d'exploitation - chapitre 2

21

int (exp) convertit exp en entier par troncature
index (ch1,ch2) retourne la position de la premire occurence de ch2 dans ch1
ou 0 s'il n'y en a pas
split (ch,t,c) clate ch dans t[1], t[2], ... avec c comme sparateur de zones.
substr (ch,m,n) retourne la sous-chane de ch commenant en position m et de
longueur au-plus n

instructions :
if else comme en C
while comme en C
for comme en C
for (<var> in <tableau>) <instruction>
break continue comme en C
exit passage la section END, ou abandon si on sy trouve
next passage l'enregistrement suivant

On dispose aussi de la fonction printf de C et de print (cf. exemple).

On peut passer la valeur d'une variable du shell une variable locale d'un programme awk:
read reponse
awk ......... x=$reponse ....

en supposant que x=$reponse est en tte de la liste nom_fichier dcrite plus haut, prcde de -v

Un commentaire commence par # et finit la fin de la ligne.


3. make

make est un outil puissant pour grer les projets. Il permet la maintenance des fichiers objets et des
fichiers excutables en lanant les seules compilations indispensables aprs des mises jour.

make utilise un fichier appel makefile par dfaut qui contient une description des liens de
dpendance entre les fichiers et les actions raliser.
Exemple :

prog:fic1.o fic2.o
cc -o prog fic1.o fic2.o
fic1.o:fic1.c menu.h
cc -c fic1.c
fic2.o:fic2.c
cc -c fic2.c

Il peut y avoir plusieurs points d'entre (tels que prog) dans makefile.
Les lignes indentes sont prcedes de TAB.

Syntaxe : make prog
make -f file prog si file est utilis au lieu de makefile

4. sccs

sccs permet le contrle des fichiers source et de leurs diffrentes versions, notamment extraire une
copie d'une version partir d'un fichier historique, verrouiller une version contre tout changement
pour la protger, diter les diffrences entre les versions, etc... (Voir Nebut, pages 223-229).


Systme d'exploitation - chapitre 2

22


5. sed (et ed)

sed est un ancien diteur de texte non interactif reprenant la plupart des commandes du trs ancien
diteur ligne ed (qui n'a plus d'intrt pris isolment). La syntaxe d'appel est :

sed -f fc fa > fb
# cre un nouveau fichier fb partir d'un fichier fa en prenant les directives dans le
fichier de commandes fc

ed offre essentiellement les fonctionnalits suivantes :
- impression :
p imprime (envoie dans stdout) tout le fichier courant
2 p imprime la ligne n 2
2,5 p imprime les lignes n 2 5
8,$ p imprime de la ligne n 8 la fin de fichier
- dsigne la ligne prcdente, . la ligne courante et + la ligne suivante

- remplacement :
La commande s/text_anc/texte_nouveau/g remplace les occurences de texte_anc par
texte_nouveau dans tout ( cause de g) le fichier courant.
Le point reprsente "tout caractre". L'astrisque dsigne 0 ou n occurences.
L'accent circonflexe dsigne le dbut de ligne. $ dsigne la fin de ligne, [ ...] dsigne un
intervalle et [^...] l'intervalle complmentaire, * dsigne une rptition de caractres.
Exemples :

1,$s/./,/g remplace tous les caractres par des virgules
1,$s/\./,/g remplace tous les points par des virgules
s/x *y/x y/g remplace tous les blancs entre x et y par un seul blanc
1,$s/^[0-9]*//g supprime tous chiffres en dbut de ligne
v/^[0-9]*/d dtruit toutes les lignes ne commenant pas (v) par un nombre
g/eau/s/&/vin/ change dans tout le fichier les lignes contenant eau en vin
/sanglots/ recherche la 1re occurence de sanglots vers l'avant du fichier
s/longs/& longs/ remplace dans cette occurence sanglots par sanglots longs
s/.*/(&)/g enferme entre parenthses toute ligne du fichier
g?Jean? recherche toutes les lignes contenant Jean vers le haut du fichier
sed n /PAGNOTTE/p fichier
sed s/PAGNOTTE/Pagnotte fic > res

Le critre de recherche ^[^Uu]r..\. dsigne une ligne ne comportant ni (^) U, ni u en dbut de
ligne, mais incluant un r suivi de 2 caractres quelconques et d'un point.
- destruction :
2d dtruit la ligne 2
2,5d dtruit les lignes 2 5
.,/123/d dtruit toutes les lignes entre la ligne courante et la 1re ligne
contenant 123
- mouvement :
2,5 t 19 insre une copie des lignes 2 5 partir de la ligne 19
2,5 m 19 dplace les lignes 2 5 pour les insrer partir de la ligne 19
0r fic insre le fichier fic en dbut du fichier courant


Systme d'exploitation - Chapitre 3

1
Chapitre 3 LES PROCESSUS



1. ASPECTS GENERAUX DES PROCESSUS

Un processus est un programme qui s'excute, ainsi que ses donnes, sa pile, son compteur ordinal,
son pointeur de pile et les autres contenus de registres ncessaires son excution. Un processus
fournit l'image de l'tat d'avancement de l'excution d'un programme.

Attention : ne pas confondre un processus (objet dynamique dont l'excution peut tre suspendue,
puis reprise), avec le texte d'un programme, source ou excutable.


1.1 Simultanit, ressources


On appelle simultanit l'activation de plusieurs processus au mme moment.

Si le nombre de processeurs est au moins gal au nombre de processus, on parle de simultanit totale
ou vraie, sinon de pseudo-simultanit.

pseudo-simultanit : c'est par exemple l'excution enchevtre de plusieurs processus sur un seul
processeur. La simultanit est obtenue par commutation temporelle d'un processus l'autre sur le
processeur. Si les basculements sont suffisamment frquents, l'utilisateur a l'illusion d'une
simultanit totale.

Dans le langage de la programmation structure, on encadre par les mots-cls parbegin et parend les
sections de tches pouvant s'excuter en parallle ou simultanment.

Avec un SE qui gre le temps partag (pseudo-paralllisme par commutation de temps),
conceptuellement chaque processus dispose de son propre processeur virtuel. Ainsi, concrtement il
n'existe qu'un seul compteur ordinal dont le contenu est renouvel chaque commutation.
Conceptuellement, tout se passe comme si chaque processus disposait de son propre compteur ordinal.

Dans certains SE, il existe des appels systme pour crer un processus, charger son contexte et lancer
son excution. Dans d'autres SE, un processus particulier (INIT sous UNIX) est lanc au dmarrage
de la machine. Il cre un processus par terminal. Chacun de ces processus attend une ventuelle
connexion, et lorsqu'une connexion est valide, il lance un nouveau processus charg de lire et
d'interprter les commandes de l'utilisateur (Shell sous UNIX). Chacune de ces commandes peut elle-
mme crer un nouveau processus, etc... On aboutit ainsi une arborescence de processus.

De faon simplifie, on peut imaginer un SE dans lequel les processus pourraient tre dans trois tats :

- lu : en cours d'excution. Un processus lu peut tre arrt, mme s'il peut poursuivre son
excution, si le SE dcide d'allouer le processeur un autre processus

- bloqu : il attend un vnement extrieur pour pouvoir continuer (par exemple une ressource;
lorsque la ressource est disponible, il passe l'tat "prt")

- prt : suspendu provisoirement pour permettre l'excution d'un autre processus

Le modle processus permet une approche claire du fonctionnement de l'ordinateur : processus
utilisateurs, processus systmes (processus terminaux, processus disques, etc...) qui se bloquent par


Systme d'exploitation - Chapitre 3

2
dfaut de ressource, qui passent de l'tat lu l'tat prt. Dans ce modle, la couche la plus basse du SE
est l'ordonnanceur (scheduler). Il est surmont d'une multitude de processus. La gestion des
interruptions, la suspension et la relance des processus sont l'affaire de l'ordonnanceur.


1.2 Ralisation des processus

Pour mettre en uvre le modle des processus, le SE gre une table des processus dont chaque entre
correspond un processus. Chaque ligne peut comporter des informations sur un processus : son tat,
son compteur ordinal, son pointeur de pile, son allocation mmoire, l'tat de ses fichiers ouverts, et
d'autres paramtres.

Dans bien des SE, on associe chaque priphrique d'E/S une zone mmoire appele vecteur
d'interruptions. Il contient les adresses des procdures de traitement des interruptions cf. ch. 9).
Lorsqu'une interruption survient, le contrle est donn l'ordonnanceur qui dtermine si le processus
lu doit tre suspendu ou bien (par exemple, s'il s'agit du processus traitant une interruption plus
prioritaire) s'il doit poursuivre son excution en empilant l'interruption qui vient d'arriver.


1.3 Mcanismes de commutation

- par interruptions

- par trap ou droutement sur erreur : il s'agit d'une extension du mcanisme des interruptions. En
cas de dtection d'erreur interne au processus (ex : division par 0, erreur d'adressage), le contrle est
pass au SE en cas d'erreur mettant en cause son intgrit (ex : erreur d'adressage) ou une fonction
de traitement de l'erreur du processus courant.

- appel au superviseur (noyau du SE) : dans un SE multi-utilisateur multi-programm, toutes les
interruptions sont contrles par le superviseur. Une raison (pas unique) : l'vnement qui interrompt
un processus est peut tre destin un autre; comme le SE doit garantir l'indpendance des processus,
c'est lui qui doit rcuprer l'vnement pour le transmettre au processus destinataire. Ainsi, en cas
d'interruption :

- on sauve le mot d'tat et le contexte du processus en cours et on passe en
mode superviseur (ou noyau ou systme)

- le traitement de l'interruption est ralis soit par le superviseur lui-mme
(horloge, coupure), soit par un processus spcifique (pilote de priphrique d'E/S), soit par le
processus interrompu (erreur interne)

- on lit un nouveau processus excuter (peut-tre celui qui avait t
interrompu)



2. MODELE DE REPRESENTATION DE PROCESSUS

2.1 Dcomposition en tches

On appelle tche une unit lmentaire de traitement ayant une cohrence logique. Si l'excution du
processus P est constitue de l'excution squentielle des tches T
1
, T
2
,..., T
n
, on crit :
P =T
1
T
2
...T
n



Systme d'exploitation - Chapitre 3

3
A chaque tche T
i
, on associe sa date de dbut ou d'initialisation d
i
et sa date de terminaison ou de fin
f
i
.

Une relation de prcdence, note <, sur un ensemble E est une relation vrifiant :
- T E, on n'a pas T <T
- T E et T' E, on n'a pas simultanment T <T' et T' <T
- la relation <est transitive

La relation T
i
<T
j
entre tches signifie que f
i
infrieur d
j
entre dates. Si on n'a ni T
i
<T
j
,
ni T
j
<T
i
, alors on dit que T
i
et T
j
sont excutables en parallle.

Une relation de prcdence peut tre reprsente par un graphe orient. Par exemple, la chane de
tches S =(( T
1
, T
2
, T
3
), (T
i
<T
j
pour i infrieur j)) a pour graphe :


T1
T2
T3


qu'on peut simplifier, en reprsentant le graphe de la plus petite relation qui a mme fermeture
transitive que la relation de prcdence : c'est le graphe de prcdence :


T1
T2
T3




On munit l'ensemble des graphes de prcdence de deux oprations :

- la composition parallle : G
1
et G
2
tant deux graphes de prcdence correspondant des
ensembles de tches disjoints , G
1
// G
2
est l'union de G
1
et de G
2

- le produit : G
1
* G
2
reprend les contraintes de G
1
et de G
2
avec en plus la contrainte qu'aucune
tche de G
2
ne peut tre initialise avant que toutes les tches de G
1
ne soient acheves.



Systme d'exploitation - Chapitre 3

4
T1
T2
T3
T4
T5
T6
T7
T8
T1
T2
T3
T4 T5
T6
T7
T8
G1 G2
G1 * G2



2.2 Paralllisation de tches dans un systme de tches

La mise en parallle s'effectue par la structure algorithmique :

parbegin
............
parend


exemple 1 :
lire b
lire a
c <- a * a
d <- b *
e <- c +d






Systme d'exploitation - Chapitre 3

5
soit debut
parbegin
lire a
lire b
parend
parbegin
c a * a
d b * b
parend
e c +d
fin

exemple 2 : peut-on reprsenter le graphe suivant de tches par un programme parallle utilisant
parbegin et parend ?


1
2
3
4



Pour augmenter le degr de multiprogrammation, donc le taux d'utilisation de l'UC, on peut excuter
en parallle certaines tches d'un processus squentiel.

exemple : (systme S0)
T1 lire X
T2 lire Z
T3 X X +Z
T4 Y X +Z
T5 afficher Y

Le systme S1 rpartit les 5 tches en 2 processus parallles organiss chacun squentiellement :

(S1)
P1 P2
T1 T2
T3 T4
T5
S1 n'est pas quivalent S0 (affichage pas forcment identique). S1 est indtermin.

T1 T2
T3
T4
T5
(S2)

Et S 2 ?



Mthode d'tude :


Systme d'exploitation - Chapitre 3

6

Supposons la mmoire compose de m cellules : M =( C
1
, C
2
, ..., C
m
)

L'tat initial du systme est S
0
=( C
1
(0), C
2
(0), ..., C
m
(0))
L'tat k du systme ( k [1 , l ] ) est S
k
=( C
1
(k), C
2
(k), ..., C
m
(k))
aprs l'vnement a
k
du comportement w =a
1
a
2
....a
l

Par exemple, considrons le problme prcdent et w =d
1
f
1
d
2
f
2
d
3
f
3
d
4
f
4
d
5
f
5
avec M =( X, Y, Z) et S
0
=(0 , 0 , 0)

d
1
f
1
d
2
f
2
d
3
f
3
d
4
f
4
d
5
f
5
___________________________________________________________________________________
X 0 0 + + + + +
Y 0 0 0 0 0 0 0 0 + 2 + 2 + 2
Z 0 0 0 0
___________________________________________________________________________________
0 1 2 3 4 5 6 7 8 9 10

A une tche T, on associe :
- son domaine de lecture : L ={ C'
1
, ........, C'
p
} ou ensemble des cellules lues par T
- son domaine d'criture : L ={ C"
1
, ........, C"
p
} ou ensemble des cellules crites par T

crire signifie plus gnralement modifier l'tat d'une ressource.

Dans l'exemple que nous dveloppons, nous obtenons :

L1 = E1 ={ X }
L2 = E2 ={ Z }
L3 ={ X , Z } E3 ={ X }
L4 ={ X , Z } E4 ={ Y }
L5 ={ Y } E5 =

A une tche T, on associe une fonction F
T
de L dans E

Dans l'exemple que nous dveloppons, F
T4
(x , z) =x +z , x et z N

Sous-suite des valeurs crites dans une cellule par un comportement w :

V ( X , w) =( 0 , , + )
V ( Y , w) =( 0, + 2 )
V ( Z , w) =( 0, )

2.3 Caractre dtermin d'un systme de tches. Conditions de Bernstein

Dfinition : un systme de tches S est dtermin si pour tous comportements w et w' et pour toute
cellule C de M, on a : V (C, w ) =V (C, w' )

Avec l'exemple que nous traitons , soient w =d
1
f
1
d
2
f
2
d
3
f
3
d
4
f
4
d
5
f
5
et w '=d
1
f
1
d
2
f
2
d
4
f
4
d
3
f
3
d
5
f
5
V ( Y , w ) =( 0, + 2 ) et V ( Y , w ' ) =( 0, + )
Donc le systme de tches est non dtermin



Systme d'exploitation - Chapitre 3

7
Tout systme squentiel est dtermin

Il existe une relation entre le caractre dtermin d'un systme et une proprit de non-interfrence de
tches.

Dfinition : deux tches T et T' sont non-interfrentes vis vis du systme de tches S si :
- T est un prdcesseur ou un successeur de T'
ou - L
T
E
T'
=L
T'
E
T
=E
T
E
T'
=
(conditions de Bernstein)

Avec l'exemple que nous dveloppons, dans le systme S1, T3 et T4 sont interfrentes car T3 n'est ni
prdcesseur, ni successeur de T4 et d'autre part L
4
E
3
( vaut { X } )

Thorme : Si un systme S est constitu de tches 2 2 non interfrentes, alors il est dtermin pour
toute interprtation

Si un systme S est dtermin pour toute interprtation et si T , E
T
, les tches de S sont 2
2 non interfrentes.

Nous sommes donc en mesure de construire, partir d'un systme S, un systme S' comportant moins
de contraintes de prcdence. A condition bien sr que les contraintes d'criture dans les diffrentes
cellules ne soient pas modifies.


2.4 Paralllisme maximal

Dfinition : deux systmes S et S' construits sur le mme ensemble de tches sont quivalents si :

- S et S' sont dtermins
et - pour tout comportement w de S, pour tout comportement w' de S',
pour toute cellule C de M, on a : V ( C, w) =V ( C , w')

Autrement dit, la suite des valeurs crites dans toute cellule par tout comportement de l'un ou l'autre
systme est unique.

Dfinition : un systme S est de paralllisme maximal si :

- S est dtermin
et - son graphe de prcdence G vrifie : la suppression de tout arc ( T, T' ) entrane
l'interfrence des tches T et T'

Exemple : soit le systme S3
1
2 3
5
4
6


M =( M1, M2, M3, M4, M5)


Systme d'exploitation - Chapitre 3

8
L1 ={ M1 } E1 ={ M4 }
L2 ={ M3, M4 } E2 ={ M1 }
L3 ={ M3, M4 } E3 ={ M5 }
L4 ={ M4 } E4 ={ M2 }
L5 ={ M5 } E5 ={ M5 }
L6 ={ M1, M2 } E6 ={ M4 }

Si l'on supprime l'arc (2 , 4), 2 n'est ni prdcesseur, ni successeur de 4,
mais L2 E4 =L4 E2 =E4 E2 =. Donc 2 et 4 ne deviennent pas interfrentes.
Donc le systme S3 n'est pas de paralllisme maximal.


Thorme : S =( E, <) tant un systme dtermin, il existe un unique systme S' de paralllisme
maximal quivalent S. S' est tel que : S' =(E , <' ) avec <' fermeture transitive de la relation :
R ={ (T , T' ) | T <T' et (L
T
E
T'
ou L
T'
E
T
ou E
T
E
T'
)
et E
T
et E
T'
}

Algorithme : il dcoule du thorme :

- construire le graphe de R
- liminer tous les arcs (T , T') redondants, c'est dire tels qu'il existe un chemin de T
T' contenant plus d'un arc


Exemple : avec le systme S3 prcdent : on dmontre qu'il est dtermin

graphe de R : il comporte les arcs :
(1 , 2) car L1 E2 ={ M1 }
(1 , 3) L3 E1 ={ M4 }
(1, 4 ) L4 E1 ={ M4 }
(1 , 6 ) E6 E1 ={ M4 }
(2 , 6 ) L2 E6 ={ M4 }
(3 , 5 ) E3 E5 ={ M5 }
(3 , 6 ) L3 E6 ={ M4 }
(4 , 6) L4 E6 ={ M4 }

Les arcs (1,5) , (2,4) , (3,4) et (5,6) ne sont pas prsents

L'arc (1 , 6), redondant, peut tre supprim.
D'o le systme de paralllisme maximal quivalent S3 :

1
2
4
3 5
6



3. ORDONNANCEMENT DES PROCESSUS



Systme d'exploitation - Chapitre 3

9
L'ordonnanceur (scheduler) dfinit l'ordre dans lequel les processus prts utilisent l'UC (en acquirent
la ressource) et la dure d'utilisation, en utilisant un algorithme d'ordonnancement. Un bon algorithme
d'ordonnancement doit possder les qualits suivantes :

- quitabilit : chaque processus reoit sa part du temps processeur
- efficacit : le processeur doit travailler 100 % du temps
- temps de rponse : minimiser en mode interactif
- temps d'excution : minimiser l'attente des travaux en traitement par lots (batch)
- rendement : maximiser le nombre de travaux effectus par unit de temps

L'ensemble de ces objectifs est contradictoire, par exemple le 3me et le 4me objectif.

On appelle temps de traitement moyen d'un systme de tches la moyenne des intervalles de temps
sparant la soumission d'une tche de sa fin d'excution. On appelle assignation la description de
l'excution des tches sur le ou les processeurs. A chaque tche T
i
du systme de tches, on associe
deux rels :
- t
i
: sa date d'arrive
-
i
: sa dure

Il existe deux familles d'algorithmes :
- sans rquisition (ASR) : le choix d'un nouveau processus ne se fait que sur blocage ou
terminaison du processus courant (utilis en batch par exemple)

- avec rquisition (AAR) : intervalle rgulier, l'ordonnanceur reprend la main et lit un
nouveau processus actif (algorithmes 3.2 3.7)

3.1 ASR

On utilise :
- soit l'ordonnancement dans l'ordre d'arrive en grant une file des processus. Cet algorithme est
facile implanter, mais il est loin d'optimiser le temps de traitement moyen

- soit l'ordonnancement par ordre inverse du temps d'excution (PCTE) : lorsque plusieurs travaux
d'gale importance se trouvent dans une file, l'ordonnanceur lit le plus court d'abord. On dmontre
que le temps moyen d'attente est minimal par rapport toute autre stratgie si toutes les tches sont
prsentes dans la file d'attente au moment o dbute l'assignation. En effet, considrons 4
travaux dont les dures d'excution sont a, b, c, d. Si on les excute dans cet ordre, le temps moyen
d'attente sera : (4a +3b +2c +d)/4. Comme a possde le plus grand poids (4), il faut donc que a soit
le temps le plus court, etc...

Exemple : soient 5 tches A, B, C, D et E de temps d'excution respectifs 2 , 4 , 1 , 1 , 1 arrivant aux
instants 0 , 0 , 3 , 3 , 3. L'algorithme du plus court d'abord donne l'ordre A , B, C , D , E et une attente
moyenne de 2,8. L'ordre B , C , D , E , A donnerait une attente moyenne de 2,6


i
peut aussi tre remplac par la dure estime e
i
de l'excution de la tche T
i.
On peut par exemple
calculer les dures estimes selon une mthode de moyenne pondre, partir d'une valeur initiale e
0

arbitraire :
e
i
= * e
i-1
+(1 - ) *
i -1
, avec souvent =0,5



3.2 Ordonnancement circulaire ou tourniquet (round robin)



Systme d'exploitation - Chapitre 3

10
Il s'agit d'un algorithme ancien, simple et fiable. Le processeur gre une liste circulaire de processus.
Chaque processus dispose d'un quantum de temps pendant lequel il est autoris s'excuter. Si le
processus actif se bloque ou s'achve avant la fin de son quantum, le processeur est immdiatement
allou un autre processus. Si le quantum s'achve avant la fin du processus, le processeur est allou
au processus suivant dans la liste et le processus prcdent se trouve ainsi en queue de liste.

La commutation de processus (overhead) dure un temps non nul pour la mise jour des tables, la
sauvegarde des registres. Un quantum trop petit provoque trop de commutations de processus et
abaisse l'efficacit du processeur. Un quantum trop grand augmente le temps de rponse en mode
interactif. On utilise souvent un quantum de l'ordre de 100 ms.


3.3 Ordonnancement PCTER

Il s'agit d'une gnralisation avec rquisition de l'algorithme PCTE : la fin de chaque quantum, on
lit la tche dont le temps d'excution restant est minimal (PCTER =plus court temps d'excution
restant). Cet algorithme fournit la valeur optimale du temps moyen de traitement pour les algorithmes
avec rquisition.

3.4 Ordonnancement avec priorit

Le modle du tourniquet suppose tous les processus d'gale importance. C'est irraliste. D'o
l'attribution de priorit chaque processus. L'ordonnanceur lance le processus prt de priorit la
plus leve. Pour empcher le processus de priorit la plus leve d'accaparer le processeur,
l'ordonnanceur abaisse chaque interruption d'horloge la priorit du processus actif. Si sa priorit
devient infrieure celle du deuxime processus de plus haute priorit, la commutation a lieu.

Une allocation dynamique de priorit conduit souvent donner une priorit leve aux processus
effectuant beaucoup d'E/S. On peut aussi allouer une priorit gale l'inverse de la fraction du
quantum prcdemment utilise. Par exemple un processus ayant utilis 2 ms d'un quantum de 100
ms, aura une priorit de 50.

A chaque niveau de priorit, on associe une liste (classe) de processus excutables, gre par
l'algorithme du tourniquet. Par exemple, supposons 4 niveaux de priorit. On applique la liste de
priorit 4 l'algorithme du tourniquet. Puis, quand cette liste est vide, on applique l'algorithme la liste
de priorit 3, etc... S'il n'y avait pas une volution dynamique des priorits, les processus faiblement
prioritaires ne seraient jamais lus : risque de famine.

Exemple : VAX/VMS de DEC et OS/2 d'IBM


3.5 Ordonnancement avec files multiples

On associe une file d'attente et un algorithme d'ordonnancement chaque niveau de priorit. Si les
priorits voluent dynamiquement, le SE doit organiser la remonte des tches.

Exemple : UNIX dont le mode d'ordonnancement sera prsent dans un chapitre ultrieur



3.6 Ordonnancement par une politique

S'il y a n utilisateurs connects, on peut garantir chacun qu'il disposera de 1/n de la puissance du
processeur. Le SE mmorise combien chaque utilisateur a consomm de temps processeur et il calcule
le rapport : temps processeur consomm/temps processeur auquel on a droit . On lit le processus
qui offre le rapport le plus faible jusqu' ce que son rapport cesse d'tre le plus faible.


Systme d'exploitation - Chapitre 3

11


3.7 Ordonnancement deux niveaux

La taille de la mmoire centrale de l'ordinateur peut tre insuffisante pour contenir tous les processus
prts tre excuts. Certains sont contraints de rsider sur disque.

Un ordonnanceur de bas niveau (CPU scheduler) applique l'un des algorithmes prcdents aux
processus rsidant en mmoire centrale. Un ordonnanceur de haut niveau (medium term scheduler)
retire de la mmoire les processus qui y sont rest assez longtemps et transfre en mmoire des
processus rsidant sur disque. Il peut exister un ordonnanceur long terme (job scheduler) qui
dtermine si un processus utilisateur qui le demande peut effectivement entrer dans le systme (si les
temps de rponse se dgradent, on peut diffrer cette entre).

L'ordonnanceur de haut niveau prend en compte les points suivants :
- depuis combien de temps le processus sjourne-t-il en mmoire ou sur disque ?
- combien de temps processeur le processus a-t-il eu rcemment ?
- quelle est la priorit du processus ?
- quelle est la taille du processus ? (s'il est petit, on le logera sans problme)


3.8 Ordonnancement de chanes de tches

Supposons que l'on ait r chanes de tches excuter en parallle : C
1
, C
2
, ..., C
r
avec : C
i
=T
i1
T
i2
T
i3
.... T
i ki
, c'est dire que la chane C
1
comprend k1 tches, la chane C
2
comprend k2 tches, etc... On note : k1 +k2 +... +kr =n (nombre total de tches).
On note :
ij
la dure de la tche T
ij

Il existe un algorithme produisant une assignation de temps moyen de traitement minimal :

pour chaque chane C
i
, calculer la dure moyenne d'excution (pas de traitement)
ip
de chaque sous-
chane C'
ip
, pour p =1 ki
tant qu'il existe des tches non assignes
dterminer j tel que :
j pj
=min {
m pm
| m =1 , 2 , ... , n }
ajouter l'assignation les tches de la sous-chane C'
j pj
et les supprimer de la chane C
j
recalculer
j pj
pour la nouvelle chane C
j
fin tant que

Exemple : C
1
:
11
=9,
12
=6 ,
13
=3 ,
14
=5 ,
15
=11

C
2 :

21
=4 ,
22
=1
,

23
=13

C
3 :

31
=8
,

32
=4
,

33
=1 ,
34
=11

On dtermine le minimum :
22
=2,5 , donc : l'assignation T
21
, T
22

puis
33
=4,33 ; on complte l'assignation avec T
31
, T
32
, T
33
; etc ...
D'o l'assignation finale :

T
21
, T
22
, T
31
, T
32
, T
33
, T
11
, T
12
, T
13
, T
14
, T
15
, T
34
, T
23







Systme d'exploitation - Chapitre 3

12
BIBLIOGRAPHIE


J . BEAUQUIER, B. BERARD, Systmes d'exploitation, Ediscience, 1993

A. TANENBAUM, Les systmes d'exploitation, Prentice Hall, 1999





Systme d'exploitation - Chapitre 3

13



Exercices sur le chapitre 3


1. Donner et comparer les assignations produites par les algorithmes FIFO, PCTE, tourniquet avec
un quantum de 1, PCTER dans l'exemple suivant :

ordre d'arrive des tches T1 T2 T3 T4 T5 T6 T7
____________________________________________________________
dure 7 4 6 1 2 4 1
date d'arrive 0 0 1 1 1 2 2

2. Sur un ordinateur, l'ordonnanceur gre l'ordonnancement des processus par un tourniquet avec un
quantum de 100 ms. sachant que le temps ncessaire une commutation de processus est de 10
ms, calculer le temps d'excution moyen pour :

ordre d'arrive des tches T1 T2 T3 T4 T5 T6 T7
___________________________________________________________
dure 700 400 600 100 200 400 100
date d'arrive 0 0 100 100 150 200 200

Si l'on dfinit le rendement du processeur comme le rapport temps pendant lequel l'UC excute
les processus/temps total de traitement, calculer le rendement en ce cas.

3. Un SE utilise 3 niveaux de priorit (numrots par ordre croissant). Le processus se voit affecter
un niveau fixe. Une file de processus est attache chaque niveau. Chaque file est gre par un
tourniquet avec un quantum de 0,5. Un tourniquet de niveau n n'est activ que si toutes les files de
niveau suprieur sont vides.

Que peut-il se passer ?

Donner l'assignation pour :

ordre d'arrive des tches T1 T2 T3 T4 T5 T6 T7
____________________________________________________________
dure 7 4 6 1 2 4 1
date d'arrive 0 0 1 1 1 2 2
priorit 2 3 1 2 3 1 2

Maintenant, on suppose que la priorit n'est pas fixe. Toutes les 2 units de temps, tout processus
n'ayant pas dispos de l'UC monte d'un niveau, alors que ceux en ayant dispos 2 fois en
descendent. Donner la nouvelle assignation.


Systme d'exploitation - chapitre 4

1
Chapitre 4 LES PROCESSUS AVEC UNIX



1. GENERALITES SUR LES PROCESSUS SOUS UNIX

1.1 Contexte d'un processus

On distingue des processus utilisateurs et des processus systme. Ces derniers :
- ne sont sous le contrle d'aucun terminal
- ont comme propritaire le super utilisateur (processus dmons). Ils restent rsidents en
MC en attente d'une requte
- ils assurent des services gnraux accessibles tous les utilisateurs
- ils peuvent tre crs au lancement du systme ou des dates fixes par l'administrateur.

Exemples de processus systme :

cron lance des dates spcifies des commandes particulires
lpsched assure l'ordonnancement des requtes d'impression

Le contexte d'un processus, dfini un instant donn de l'excution, comprend l'ensemble des 3
environnements suivants ncessaires son excution :

- environnement utilisateur : (il se trouve dans le fichier excutable)
zone programme (code excuter) ou TEXT
zone donnes (variables) ou DATA
zone pile utilisateur (pour les variables locales et les appels de fonctions) ou BSS,
dont la taille peut tre modifie dynamiquement.

La zone programme peut tre partage entre plusieurs processus. En outre, un processus peut
partager des segments de mmoire (donnes) avec d'autres processus,

- environnement machine : ensemble des registres utiliss pour l'excution (compteur
ordinal, pointeur de pile, registres de travail, registres de donnes, registres pour la mmoire
virtuelle, etc...)

- environnement systme : situ dans le noyau, il comprend au moins les 3 structures
suivantes :

* table des processus : entit globale; chaque processus correspond une ligne de
la table (pid, tat, priorit, utilisateur rel [celui qui l'a cr], utilisateur effectif [celui qui
prcise les droits d'accs], etc...)

* structure U : il en existe une par processus. Elle contient des informations de
contrle : rpertoire courant; pointeurs vers les fichiers ouverts; variables d'environnement)

* table des textes : utilise par la gestion du code partageable. Chaque ligne
contient les informations suivantes : taille du texte, pointeur vers la structure U, vers l'i-node du
fichier excutable, nombre de processus qui excutent ce texte, etc...)

L'environnement systme initial est cr par le shell lors de la cration du processus.

Un processus peut s'excuter dans deux modes diffrents :


Systme d'exploitation - chapitre 4

2

- mode utilisateur (user mode) : le processus n'accde qu' son espace
d'adressage et n'excute que des instructions ordinaires du programme charg

- mode noyau ou systme (kernel mode) : le processus excute des instructions
n'appartenant pas au programme, mais au noyau. Il accde des donnes externes son espace
d'adressage (tables systmes). On peut passer en mode noyau soit par une interruption approprie,
soit par la ralisation d'un appel systme par le processus lui-mme (exemple : requte de lecture au
clavier dans le programme)


1.2 Structure d'un processus sous UNIX

Le noyau gre une table des processus , listable par la commande ps avec une entre par processus,
et contenant des informations sur celui-ci. Cette entre est alloue la cration du processus,
dsalloue son achvement.

Un processus est identifi par un pid (process identifier), entier de 0 32767 retourn par le noyau.
Il est caractris aussi par sa priorit, son propritaire et son groupe propritaire, son terminal de
rattachement.






1.3 Initialisation

A l'initialisation du systme, s'excute un bootstrap primaire rsidant sur la piste 0 du disque qui
charge un boostrap secondaire (incluant les fonctions d'un changeur), et excutant le noyau
d'UNIX, de pid 0. C'est l'changeur (swapper) qui assure la gestion du va-et-vient (overlay) en
mmoire en remplissant les rles suivants :

- chargement : trouver parmi les processus activables celui qui attend depuis le plus
longtemps et qui peut s'implanter dans l'espace libre de la mmoire.




Systme d'exploitation - chapitre 4

3
- limination : on limine d'abord les processus bloqus dans l'ordre de leur dure de
rsidence en mmoire centrale, et ventuellement d'autres processus.

Le noyau dcoupe la mmoire centrale, teste les volumes, vrifie leur cohrence, charge les tables
systmes ncessaires. Le noyau utilise l'changeur pour crer 4 processus dont l'excution de /etc/
init, de pid 1. init est l'anctre de tous les processus. Il consulte des tables (dont /sbin/inittab qui
contient les conditions initiales du systme). init cre par filiation autant de processus getty qu'il y a
de lignes dans /etc/inittab.

Chaque utilisateur est identifi par un numro individuel UID (user identity). La correspondance
entre le nom et UID est assure par le fichier /etc/passwd. Un groupe est un ensemble d'utilisateurs
ayant des points communs. Un utilisateur appartient un ou plusieurs groupes. Un groupe est
identifi par un GID (group identity) et possde un nom. Leur correspondance est gre par
/etc/group.

La commande uid affiche l'UID, le login name, le GID et le nom du groupe de l'utilisateur.

Exemples:

1. connexion des utilisateurs (getty) : les processus getty , lancs par init, ralisent les 2 oprations
suivantes :
- prparation du terminal en fonction des lments de /etc/gettydefs, initialisation du
groupe avec setpgrp et ouverture du fichier spcial correspondant au terminal dfini
- bouclage sur les 3 oprations suivantes :
affichage d'un prompt contenu dans /etc/issue et d'un message d'invitation la
connexion,
lecture du nom de connexion
excution du processus login qui se substitue getty (mme pid, chef de groupe)

2. administration de l'utilisateur (login) : login, qui reoit le nom d'utilisateur lu par getty, lit le mot
de passe, compare le login et le mot de passe crypt aux donnes de /etc/passwd . Si une
concordance est bonne, login :
- met jour les fichiers de comptabilit,
- modifie les droits de proprit du terminal pour concordance avec ceux de l'usager,
- dtermine le rpertoire d'accueil d'aprs /etc/passwd, initialise les variables HOME,
PATH, LOGNAME,...
- excute (par recouvrement) le programme nomm ct de ce mot de passe dans
/etc/passwd. Lorsque la session est acheve (fin de sh par exemple), il y a retour init et
suppression de tous les processus attachs au dfunt shell
- excute /etc/profile et aussi /etc/.profile (commun tous les utilisateurs), .profile (s'il
existe).

3. Lorsqu'on demande une redirection de sortie (>ou >>), le shell ferme le fichier de descripteur 1
(stdout en gnral), ouvre le fichier de redirection qui prend le descripteur 1 venant d'tre libr, et
excute le fork voqu ci-dessus. Il en est de mme pour une redirection d'entre (cf. chapitre 11).

4. La fonction C system cre un processus shell qui interrompt le programme en cours (processus
pre) jusqu' la fin du processus fils (argument de system).

5. La fonction ioctl prototype dans termio.h permet de reconfigurer les pilotes de terminaux. Trs
bon exemple dans Braquelaire p. 358-359, 361-368.




Systme d'exploitation - chapitre 4

4
1.4 Ordonnancement d'un processus

L'ordonnanceur ou scheduler (gestionnaire des ressources et d'enchanement des processus) gre
plusieurs processus concurremment et autorise le multitche par partage de temps. Il attribue des
quanta de temps. A l'expiration de son quantum de temps, le processus actif, s'il n'est pas termin,
sera oblig de relcher le processeur. Un autre processus est alors lu et attribu au processeur. Le
processus suspendu reprend son excution quand son tour arrive nouveau pour disposer du
processeur.

Sous UNIX, l'horloge de l'ordonnanceur dlivre 100 tops, ou cycles mineurs, par seconde et un
quantum, ou cycle majeur, correspond plusieurs tops (par exemple 100, soit 1 seconde).

Un processus peut prendre l'un des 9 tats dcrits dans /usr/include/sys/proc.h (cods dans le
champ S dans la table des processus), parmi lesquels :

- actif : en mode utilisateur (pas de droit d'accs aux ressources du systme) ou en
mode systme (ou noyau)

- activable ou prt excuter : en mmoire ou en zone de swap. Il est ligible par
l'ordonnanceur. Ces deux tats sont cods R

- bloqu : en attente d'un vnement (horloge, montage d'un disque, rsultat d'un
autre processus, ...), en mmoire ou en zone de swap. Il ne consomme pas de temps CPU. Il repasse
l'tat activable ds que les conditions le permettent. Dsign par S (sleep) pendant les 20 premires
secondes), puis par I

- non prt : en cration ou zombie (dsign par Z, le processus est achev, mais
son pre n'en a pas encore connaissance). Il ne consomme pas de temps CPU.

L'ordonnanceur d'UNIX SystemV met en uvre un algorithme de calcul de la priorit des processus
candidats au processeur partir de quatre paramtres figurant dans la table des processus :

C ou p_pcpu: rend compte de l'utilisation du processus. Si le processus utilise le
processeur, C est incrment chaque top d'horloge et divis par 2 chaque quantum.

NI ou p_nice: (nice) paramtre fix par l'utilisateur (fonction UNIX nice) entre 0 (priorit
maximale) et 39 (priorit minimale) ou dfaut par le systme la valeur 20.
Exemple : nice - 12 tp.e
abaisse de 12 la priorit du processus associ l'excution de tp.e
nice admet des arguments entre 1 et 19 (10 par dfaut)

PRI ou p_user: (priority) est fix 60.

NZERO: est fix 20.

La priorit globale d'un processus utilisateur un quantum donn vaut :

(C/2) +PRI - NZERO +NI

Elle ne peut donc tre infrieure 40. Les valeurs 0 39 sont rserves aux processus systme (PRI
=0). Plus sa valeur est leve, moins un processus a de chances d'accder au processeur.



Systme d'exploitation - chapitre 4

5
NOUVEAU
FIN
ACTIF
ACTIF
UTILISATEUR
PRET
SUSPENDU
NOYAU
ENDORMI
ZOMBIE
1
2
7
3
5
4
9
7
6
8



1 : le processus cr par fork a acquis les ressources ncessaires son excution
2 : le processus vient d'tre lu par l'ordonnanceur
3 : le processus revient d'un appel systme ou d'une interruption
4 : le processus a ralis un appel systme ou une interruption est survenue
5 : le processus se met en attente d'un vnement (libration de ressource, terminaison de processus par wait).
Il ne consomme pas de temps UC
6 : l'vnement attendu par le processus s'est produit
7 : consquence d'un signal particulier
8 : rveil du processus par le signal de continuation SIGCONT
9 : le processus s'achve par exit, mais son pre n'a pas pris connaissance de sa terminaison. Il ne consomme
pas de temps UC et ne mobilise que la ressource table des processus


La commande ps propose 4 options : - a (tous les processus attachs au terminal), - e (tous les
processus), - f (full : plus de renseignements), - l (long : presque tous les renseignements). Les
champs de la tables des processus qui sont dits sont les suivants en fonction des options - f ou - l :

F (- l) localisation d'un processus (0 =hors MC, 1 =en MC, 2 processus systme, 4 =
verrouill car en attente de fin d'E/S, 10 =en vidage)

S ( -l) state (O =non existant, S =sleeping, W =waiting, R =running, Z =zombie, X =
en volution, P =pause, I =attente d'entre au terminal ou input, L =attente d'un fichier verrouill
ou locked)

UID nom du propritaire

PID et PPID

PRI et NI (- l) voir ci-dessus

SZ taille en nombre de blocs

WCHAN (- l) dans l'tat W, l'vnement attendu

STIME (- l) heure de dmarrage

TTY ligne associe au terminal


Systme d'exploitation - chapitre 4

6

TIME temps d'excution cumul (mm:ss)

CMD commande (et ses arguments si - f) excute par le processus


1.5 Gestion du va-et-vient (overlay)

L'changeur (processus systme de pid 0, cr au moment du dmarrage du systme) assure la
gestion du va-et-vient de la mmoire. Il assure trois fonctions :

- allocation d'un espace de swap : la gestion de l'espace disque d'change est diffrente
de celle du reste du disque. On gre un ensemble contigu de blocs de taille fixe, raison d'une map
par priphrique d'change, en utilisant les fonctions swapalloc (int taille) et swapfree (int adresse,
int taille) de demande et de libration d'units d'change. Il peut y avoir plusieurs priphriques
d'change, crs et dtruits dynamiquement.

- transfert en mmoire : l'changeur examine tous les processus qui sont "prt et transfr
sur disque" et slectionne celui qui a t transfr sur disque depuis le plus longtemps (allocation de
MC, lecture du processus sur disque et libration de l'espace de swap). Il recommence jusqu' ce
qu'il n'y ait plus de processus "prt et transfr sur disque" (il s'endort) ou bien jusqu' ce qu'il n'y
ait plus de MC libre (il excute le point suivant).

- transfert hors de la mmoire : l'changeur cherche transfrer d'abord les processus
"bloqu" avant les "prt", mais jamais les "zombie", ni les processus "verrouill par le SE". Un
processus "prt" ne peut tre transfr que s'il a sjourn au moins 2 s. en MC (mme sans avoir t
lu). S'il n' y a aucun processus transfrable, l'changeur s'endort et est rveill toutes les secondes
jusqu' la fin de la ncessit de transfert.

Il peut y avoir "treinte fatale" lorsque tous les processus en MC sont "endormi", tous les processus
"prt" sont transfrs et il n' y a plus de place en MC ni en zone d'change sur disque.


En plus du va-et-vient normal, il existe deux possibilits de transfert :

- l'excution d'un fork, lorsque la cration du fils ne peut tre faite directement en MC :
on cre le fils sur disque par recopie du pre

- lors de l'accroissement de la taille d'un processus : le SE transfre le processus sur disque
en rservant une zone de swap plus grande; au retour en MC, le processus sera "plus grand".



2. PROGRAMMATION DE PROCESSUS AVEC LE SHELL

Excution en parallle (background)

Soit ex un fichier de commandes excutable.

1er cas : on tape $ ex Voici ce qui se passe :
1. le shell lit la commande ex
2. il se duplique au moyen de la fonction fork ; il existe alors un shell pre et un
shell fils
3. grce la fonction exec, le shell fils recouvre son segment de texte par celui de
ex qui s'excute.


Systme d'exploitation - chapitre 4

7
4. le shell pre rcupre le pid du fils retourn par fork ().
5. la fin de l'excution de ex, le shell pre reprend son excution.
La fonction wait lui permet de connatre son achvement : wait (&etat) retourne le pid du processus
fils son achvement (etat : entier).

shell ex
fork ()
pid_fils
while (wait (&etat) != pi d_fils) ;
shell fils
exec (ex) ;


2me cas : on tape $ ex& pour que ex s'excute en arrire-plan (en parallle au
shell, mais n'accde pas l'entre standard rserve au shell). Voici ce qui se passe :
1. 4. comme ci-dessus
5. le shell pre reoit le pid du fils, met un prompt, puis reprend son activit sans
attendre la fin du fils.

shell ex
fork ()
pid_fils
shell fils
exec (ex) ;



Attention, un processus lanc en arrire-plan ne ragit pas aux interruptions mises au clavier.

Les variables d'un processus shell ne sont pas transmises son fils, l'exception des variables
d'environnement. En particulier, login transmet les variables d'environnement ses fils. Si l'on veut
que le fils d'un processus shell reconnaisse la variable x de son pre, on excutera dans le pre la
commande
export x

Si l'on veut retirer cette variable de l'environnement accessible au fils, on excutera :
unset x

Il n'existe aucun moyen d'exporter une variable d'un sous-shell vers son pre.

Exemple : $ x=bonjour
$ export x
$ ksh #cration d'un nouveau sous-shell
$ echo $x
bonjour
$ x='au revoir'
$ <CTRL-D> #retour au shell de dpart
$ echo $x
bonjour

La commande nohup (no hangup, pas d'arrt imprvu) empche l'arrt d'un processus, mme si
l'utilisateur se dconnecte.
stdout et stderr sont redirigs par dfaut sur le fichier nohup.out

Exemple : $ nohup sort oldfic >newfic &


Systme d'exploitation - chapitre 4

8
550
$



3. PROGRAMMATION DE PROCESSUS AVEC C

Les fonctions UNIX cites ci-dessus sont toutes accessibles depuis C.


3.1 fork ()

fork engendre un fils partageant le segment de textes du pre, s'il est partageable, et disposant d'une
copie de son segment de donnes. Il retourne 0 au fils et le pid du fils au pre si la cration a russi
(-1 sinon). Chaque processus a accs la description du terminal de contrle ( terminal o l'on s'est
connect) contenue dans /dev/tty. Un processus fils hrite du terminal de contrle du pre. Le fils
hrite d'une copie des descripteurs de fichiers ouverts. Les pointeurs sur fichiers sont partags. Pre
et fils ont leurs propres tampons d'accs aux fichiers, dupliqus initialement par fork (). A
l'excution d'un fork (), le fils ferme les E/S standards si elles sont rediriges, puis il ouvre les
fichiers de redirection. Il hrite donc des E/S rediriges.

Un processus fils n'hrite pas du temps d'excution du pre (initialis 0 pour le fils). Il n'hrite pas
de la priorit du pre, sauf de son paramtre nice.Il n'hrite pas des verrous sur les fichiers dtenus
par le pre. Il n'hrite pas des signaux en suspens (signaux envoys au pre, mais pas encore pris en
compte).

Tout processus, sauf le processus de pid 0, est cr par fork.


3.2 exit ()

void exit (int etat)

La fonction provoque la terminaison du processus avec le code de retour etat (0 =bonne fin). Si le
pre est un shell, il rcupre etat dans la variable $?

A l'excution de exit, tous les fils du processus sont rattachs au processus de pid 1.exit ralise la
libration des ressources alloues au processus et notamment ferme tous les fichiers ouverts. Si le
pre est en attente sur wait, il est rveill et reoit le code de retour du fils.


3.3 wait ()

int wait (int *p_etat)

- suspend le processus jusqu' ce qu'un de ses fils prenne fin. Si le fils se termine normalement, et
que le pre ne fait pas wait pour l'attendre, on dit que le fils est devenu un processus zombie. Il
n'est plus pris en compte par l'ordonnanceur, son compteur d'alarme est annul, mais son entre dans
la table des processus n'est pas enleve. Elle est signale par la mention <defunct>

- retourne le pid du fils son achvement, ou -1 s'il n'y a plus de fils actif. Si un ou plusieurs fils
sont zombis, c'est le pid de l'un de ces fils qui est retourn. L'algorithme de wait privilgie donc la
suppression des zombies.



Systme d'exploitation - chapitre 4

9
Si le pre s'achve sans attendre la fin d'un fils par wait, le fils sera pris en charge par init, le
processus systme de pid 1.
Si p_etat est non nul, *p_etat fournit des informations sur le type de terminaison du processus fils :
- si le processus fils s'est achev normalement par un appel exit, lavant-dernier octet de
*p_etat contient la valeur de l'argument de exit (l'octet de faible poids est zro)

- sinon, le processus fils s'est termin par suite de la rception d'un signal (voir paragraphe
6). Alors, les bits 0 6 donnent le numro du signal (0 127) et les octets de fort poids sont zro.
Si le bit 7 est 1 (valeur de l'octet de faible poids : 128 255), il y a eu un fichier core cr. On peut
rcuprer le numro du signal en enlevant 128 au contenu de l'octet de faible poids.



3.4 La famille des fonctions de recouvrement (exec)

Il s'agit d'une famille de 6 fonctions permettant le lancement de l'excution d'un nouveau
programme par un processus. Le segment de texte est remplac par celui du nouveau programme. Il
y a recouvrement en mmoire, mais pas de cration d'un nouveau processus. Le retour est -1 en
cas d'erreur.

Les 6 fonctions sont execl, execv, execle, execve, execlp, execvp. Par exemple :
int execv (char *nom, char * argv [])

nom : pointeur sur le nom du programme excuter,
argv : liste de pointeurs (termine par NULL) sur les arguments transmis
au nouveau programme avec argv[0] : "nom" du programme point par nom

Un excellent exemple est donn dans Rifflet p. 251. Attention aux fichiers : seuls les descripteurs
des fichiers ouverts (situs en zne systme) sont conservs par un appel exec. Les modes
d'ouverture, les structures FILE associes sont recouverts, ainsi que les tampons d'accs. Il est donc
recommand d'appeler fflush avant exec pour vider les tampons dans les fichiers, y compris pour
stdout. Un trs bon exemple en est donn dans Rifflet p. 253.

Autre exemple intressant : Braquelaire p. 448-449


3.5 Exemples

Exemple 1 :
main ()
{
int pid_fils;
bloc1
if ((pid_fils =fork()) ==0)
bloc2
else
bloc3
}
Le processus pre excutera le bloc 1. Puis il crera un fils identique par fork et excutera le bloc 3
puisque fork lui retournera une valeur non nulle.

Le processus fils n'excutera pas le bloc 1 car sa cration, son compteur ordinal pointera sur la ligne
contenant fork. Comme fork lui retourne 0, il excutera le seul bloc2. L'affichage des rsultats des
blocs 2 et 3 peut tre entrelac, et pas ncessairement de faon identique d'une excution une autre.



Systme d'exploitation - chapitre 4

10
Exemple 2 :
main ()
{
int m,n;
printf ("processus pre.Fils non encore cr\n");
if (fork () ==0)
{
printf ("pid du fils %d\n", getpid());
exit (1);
}
else {
printf ("pid du pre %d\n", getpid());
m =wait (&n);
printf ("fin du processus de pid %d avec valeur de retour de wait
%d\n",m,n);
}
}



3.6 Les vnements ou signaux

Le fichier /usr/include/signal.h contient notamment la dfinition de NSIG = 32 constantes
caractrisant des vnements, dont plusieurs gnrent un fichier core (copie de l'image mmoire sur
disque; ils sont suivis d'un * dans le tableau ci-dessous) :
- interruptions matrielles (frappe d'un caractre,...)
- interruptions logicielles externes (terminaison d'un autre processus,...) ou
internes(erreur arithmtique, violation mmoire,...).

_____________________________________________________________________________
NOM NUMERO ROLE
_____________________________________________________________________________
SIGHUP 1 mis tous les processus associs un terminal ou un modem quand il dconnecte
SIGINT 2 mis tous les processus associs un terminal lorsque <INTR>(par dfaut <DEL>ou
CTRL-C) est frapp au clavier
SIGQUIT 3* mis tous les processus associs un terminal lorsque <QUIT>(par dfaut CTRL- \
ou CTRL-Z) est frapp au clavier
SIGILL 4* instruction illgale
SIGTRAP 5* mis aprs chaque instruction en cas d'excution en mode trace, par un dbogueur
SIGABR 6* abort
SIGEMT 7 pige d'instruction dbogueur
SIGFPE 8* erreur dans une instruction en virgule flottante
SIGKILL 9 arrt obligatoire du processus (ne peut tre ni ignor, ni captur)
SIGBUS 10* erreur d'adressage sur le bus
SIGSEGV 11* violation des limites de l'espace mmoire
SIGSYS 12* mauvais argument dans un appel systme
SIGPIPE 13 criture dans un tube sans lecteur
SIGALRM 14 signal associ une horloge (cf. ci-dessous fonction systme alarm).
SIGTERM 15 signal de terminaison normale d'un processus
SIGUSR1 16 la disposition des utilisateurs pour la communication entre processus
SIGUSR2 17 idem au prcdent
SIGCHLD 18 mort d'un fils provoque par exit
SIGPWR 19 panne d'alimentation lectrique
SIGWINCH 20 changement de taille de fentre
SIGURG 21 message socket urgent
SIGPOLL 22 vnement stream pollable (cf. sockets)
SIGSTOP 23 signal stop envoy
SIGSTP 24 stop par l'utilisateur


Systme d'exploitation - chapitre 4

11
SIGCONT 25 continuation
SIGTTIN 26 stop sur l'entre du terminal
SIGTOU 27 stop sur la sortie du terminal
SIGVTALRM 28 expiration d'un temporisateur virtuel
SIGPROF 29 temporisateur de profile expir
SIGXCPU 30* temps maximal CPU expir
SIGXFSZ 31* taille maximum du fichier dpasse

Les signaux 18 21, ainsi que le signal 25, sont ignors par dfaut. Les autres provoquent l'arrt du
processus, avec ventuellement la cration d'un fichier core.
Les signaux 4, 6, 7, 10 et 11 sont bien dcrits dans BRAQUELAIRE, p. 434.

La fonction signal, prototype par :
void (* signal (int sig, void (*fonc)(int))) (int)

permet d''intercepter le signal sig et d'excuter la fonction (ou handler) pointe par fonc.
Le processus reprend son excution la fin de l'excution de fonc.

fonc peut prendre des valeurs prdfinies (macros) :
SIG_IGN : signal ignor, sauf SIGKILL
SIG_DFL : fin du processus, avec ou sans fichier core selon sig

Exemple : #include <signal.h>
main ()
{ signal (SIGINT,SIG_IGN);
signal (SIGQUIT,SIG_IGN);
/* partir d'ici, les interruptions SIGINT (par dfaut CTRL-C) et SIGQUIT (par dfaut
CTRL- \) seront dsarmes */
..................................
signal (SIGINT, SIG_DFL);
signal (SIGQUIT,SIG_DFL);
/* partir d'ici, SIGINT ou SIGQUIT mettront fin au processus */
..................................
Lorsque fonc est un pointeur sur une fonction utilisateur, 3 actions se produisent l'arrive de sig :
- le programme courant du processus est interrompu
- le processus est drout vers la fonction pointe par fonc, avec en argument le n du
signal
- aprs excution de cette fonction, le programme courant du processus reprend son
excution, sauf si la fonction a ralis un exit

Lorsqu'un processus est lanc en arrire-plan, les commandes signal (SIGINT,SIG_IGN) et signal
(SIGQUIT,SIG_IGN) sont lances et empchent son interruption par les moyens classiques (CTRL-
C ou CTRL- \). Il faut recourir kill -9 pour l'interrompre.

Un processus fils hrite du comportement de son pre vis vis des signaux.

La fonction prototype par : unsigned alarm (unsigned s), et dcrite dans <unistd.h>, envoie
SIGALRM au processus aprs s secondes ( s <= MAX_ALARM dfinie dans <sys/param.h>). Une
telle demande annule une demande antrieure du mme type. Si s =0, on annule simplement la
demande antrieure. Aprs un fork, l'horloge du fils est mise 0, quelque soit celle du pre. Ce n'est
pas le cas aprs un exec.

alarm retourne le temps restant avant l'envoi du signal correspondant cette demande antrieure.

Un processus peut envoyer un signal s un processus de pid p, condition qu'ils aient tous deux le
mme propritaire, grce la fonction kill prototype par :


Systme d'exploitation - chapitre 4

12

int kill (int p, int s)

kill retourne 0 si l'opration s'est bien droule, -1 sinon.
La valeur s =0 permet de tester si le processus de pid p existe.

Il existe videmment la commande systme kill bnficiant des mmes proprits.
Exemple : kill -9 12356 envoie le signal 9 au processus de pid 12356

La commande shell trap permet d'excuter un processus de droutement la rception d'un signal
donn.

Exemples : trap 'rm toto.c;exit' 3 4
a pour effet de demander l'excution de la squence rm toto;exit la rception des signaux
3 ou 4 (exit est bien sr ncessaire pour assurer la fin du processus).

trap '' 3 4 permettrait d'ignorer les signaux 3 et 4

La fonction int pause (void) dcrite dans <unistd.h>met le processus en attente de l'arrive du
premier vnement non masqu; pause retourne -1 si l'vnement provoque le droutement sur une
autre fonction.

De bons exemples faisant intervenir signal, alarm, wait et pause sont donns dans BRAQUELAIRE,
p. 435-440, 461-464 et surtout 440-443.

A noter aussi les fonctions int sigsetjmp et int siglongjmp, dcrites dans <setjmp.h>, qui
respectivement sauve le contexte d'un processus et restaure ce contexte.





BIBLIOGRAPHIE


J .-P.BRAQUELAIRE, Mthodologie de la programmation en Langage C, Masson,1993

A.B. FONTAINE et Ph. HAMMES, UNIX Systme V, Masson, 1993

J .L. NEBUT, UNIX pour l'utilisateur, Technip, 1990

J .M. RIFFLET, La programmation sous UNIX, Mc Graw-Hill, 1992




Systme d'exploitation - Chapitre 5

1
Chapitre 5 PROCESSUS ET RESSOURCES



1. GENERALITES

Un processus excuter a besoin de ressources : procdures et donnes, mmoire, processeur (UC , et
d'autres ventuellement), priphriques, fichiers, ...

Une ressource est soit locale, soit commune plusieurs processus

locale : utilise par un seul processus. Ex.: fichier temporaire, variable de programme.

commune ou partageable . Ex. : disque, imprimante, fichier en lecture.

Une ressource peut possder un ou plusieurs points d'accs un moment donn :

* un seul : on parle de ressource critique
Ex: un lecteur de disquettes partag entre plusieurs utilisateurs. Une zone mmoire partage en
criture entre plusieurs utilisateurs.

* plusieurs points d'accs: par exemple, un fichier en lecture utilisable par plusieurs processus.

Le SE doit contrler l'utilisation des ressources dans une table indiquant si la ressource est disponible
ou non, et, si elle est alloue, quel processus. A chaque ressource est associe une file d'attente,
pointe par la table prcdente, contenant les BCP des processus qui l'attendent. Chaque fois qu'un
nouveau processus fait une demande de la ressource et que cette dernire n'est pas disponible, son
BCP est ajout en queue de la file d'attente. Lorsqu'une demande survient de la part d'un processus
plus prioritaire que celui qui utilise la ressource, on empile l'tat de la ressource, on la retire au
processus en cours pour l'attribuer par rquisition au processus prioritaire.

Dans le cadre des ressources limites gres par le systme, il n'est pas toujours possible d'attribuer
chaque processus, ds sa cration, toutes les ressources ncessaires. Il peut y avoir blocage .



2. LE PROBLEME DE L'EXCLUSION MUTUELLE

On appelle processus indpendants des processus ne faisant appel qu' des ressources locales. On
appelle processus parallles pour une ressource des processus pouvant utiliser simultanment cette
ressource. Lorsque la ressource est critique (ou en accs exclusif), on parle d'exclusion mutuelle
(par exemple, sur une machine monoprocesseur, l'UC est une ressource en exclusion m

Def.: On appelle section critique la partie d'un programme o la ressource est seulement accessible
par le processus en cours. Il faut s'assurer que deux processus n'entrent jamais en mme temps
en section critique sur une mme ressource. A ce sujet, aucune hypothse ne doit tre faite sur
les vitesses relatives des processus.

Exemple : la mise jour d'un fichier (deux mises jour simultanes d'un mme compte client).La
section critique comprend :
- lecture du compte dans le fichier,
- modification du compte,
- rcriture du compte dans le fichier.



Systme d'exploitation - Chapitre 5

2
Def.: programmation multitche : ensemble de plusieurs processus squentiels dont les excutions
sont imbriques.

Rgle 1: les processus doivent tre en relation fortuite. La dfaillance d'un processus en dehors
d'une section critique ne doit pas affecter les autres processus.

Rgle 2: un programme multitche est juste s'il rpond aux critres de scurit comme
l'exclusion mutuelle.

Def.: On appelle interblocage la situation o tous les processus sont bloqus.

Ex.: chacun attend que l'autre lui envoie un message pour continuer.

Ex.: chacun excute une boucle d'attente en attendant une ressource disque indisponible. C'est la
situation d'un carrefour avec priorit droite pour tous et des arrives continues de vhicules.

Def.: on appelle privation la situation o quelques processus progressent normalement en
bloquant indfiniment d'autres processus. C'est la situation d'un carrefour giratoire avec 4 voies
d'accs dont deux ont des arrives continues de vhicules.

Rgle 3 : Un programme multitche est juste s'il rpond aux critres de viabilit comme la non
privation ou le non interblocage.

Examinons quelques solutions au problme de l'exclusion mutuelle. On s'intresse symboliquement
ici au cas de deux processus P
1
et P
2
excutant chacun une boucle infinie divise en deux parties :
- la section critique (crit
1
, crit
2
respectivement),
- le reste du programme (reste
1
, reste
2
respectivement).
Les excutions de crit
1
et de crit
2
ne doivent pas tre interrompues et ne doivent pas se chevaucher.

Les algorithmes peuvent tre classs en deux catgories :

- algorithmes par attente active :

* masquage des interruptions : le processus qui entre en section critique masque les
interruptions et ne peut donc plus tre dsallou (exemple : accs du SE la table des processus).
Mais s'il y a plusieurs processeurs ou si le processus "oublie" de dmasquer les interruptions, il y a
problme !

* algorithmes 2.1 2.4

En ce cas, les processus restent dans la liste des processus prts puisqu'ils ont toujours quelque chose
tester : d'o une consommation inutile de temps UC

- algorithmes par attente passive : les smaphores

2.1 La mthode des coroutines

Algorithme :
int tour ; /* variable de commutation de droit la section critique */
/* valeur 1 pour P
1
, 2 pour P
2
*/
main ()
{
tour = 1; /* P
1
peut utiliser sa section critique */
parbegin
p1();


Systme d'exploitation - Chapitre 5

3
p2() ;
parend
}
/*********************************************************************/
p1()
{
for ( ; ; )
{
while (tour == 2); /* c'est au tour de P
2
; P
1
attend */
crit
1
;
tour = 2; /* on redonne l'autorisation P
2
*/
reste
1
;
}
}
/*********************************************************************/
p2()
{
for (; ; )
{
while (tour == 1); /* c'est au tour de P
1
; P
2
attend */
crit
2
;
tour = 1; /* on redonne l'autorisation P
1
*/
reste
2
;
}
}


Avantages :
- l'exclusion mutuelle est satisfaite. Pour chaque valeur de tour , une section critique et
une seule peut s'excuter, et ce jusqu' son terme.

- l'interblocage est impossible puisque tour prend soit la valeur 1, soit la valeur 2 (Les
deux processus ne peuvent pas tre bloqus en mme temps ).

- la privation est impossible: un processus ne peut empcher l'autre d'entrer en section
critique puisque tour change de valeur la fin de chaque section critique.

Inconvnients :
- P
1
et P
2
sont contraints de fonctionner avec la mme frquence d'entre en section
critique

- Si l'excution de P
2
s'arrte, celle de P
1
s'arrte aussi: le programme est bloqu. La
dpendance de fonctionnement entre P
1
et P
2
leur confre le nom de coroutines.

2.2 Seconde solution

Chaque processus dispose d'une cl d'entre en section critique (c1 pour P
1
, c
2
pour P
2
). P
1
n'entre en
section critique que si la cl c
2
vaut 1. Alors, il affecte 0 sa cl c
1
pour empcher P
2
d'entrer en
section critique.

Algorithme :
int c
1
, c
2
;
/* cls de P
1
et P
2
- valeur 0: le processus est en section critique */
/* valeur 1: il n'est pas en section critique */
main ()


Systme d'exploitation - Chapitre 5

4
{
c
1
=c
2
= 1; /* initialement, aucun processus en section critique */
parbegin
p1() ;
p2 ();
parend
}
/********************************************************************/
p1 ()
{
for ( ; ; )
{
while (c
2
== 0); /* P
2
en section critique, P
1
attend */
c
1
= 0 /* P
1
entre en section critique */
crit
1
;
c
1
= 1; /* P1 n'est plus en section critique */
reste
1
;
}
}
/********************************************************************/
p2 ()
{
for ( ; ; )
{
while (c
1
== 0); /* P
1
en section critique, P
2
attend */
c
2
= 0; /* P
2
entre en section critique */
crit
2
;
c
2
= 1 ; /* P
2
n'est plus en section critique */
reste
2
;
}
}

Avantage : on rend moins dpendants les deux processus en attribuant une cl de section critique
chacun.

Inconvnients : Au dbut c
1
et c
2
sont 1. P
1
prend connaissance de c
2
et met fin la boucle while.
Si la commutation de temps a lieu ce moment, c
1
ne sera pas 0 et P
2
voluera pour mettre c
2
0,
tout comme le fera irrmdiablement P
1
pour c
1
.
La situation c
1
= c
2
= 0 qui en rsultera fera entrer simultanment P
1
et P
2
en section critique :
l'exclusion mutuelle ne sera pas satisfaite.

Si l'instruction c
i
= 0 tait place avant la boucle d'attente, l'exclusion mutuelle serait satisfaite, mais
on aurait cette fois interblocage.
A un moment donn, c
1
et c
2
seraient nuls simultanment P
1
et P
2
excuteraient leurs boucles d'attente
indfiniment.


2.3 Troisime solution

Lorsque les deux processus veulent entrer en section critique au mme moment, l'un des deux renonce
temporairement.

Algorithme :
int c
1
,c
2
; /* 0 si le processus veut entrer en section critique, 1 sinon */


Systme d'exploitation - Chapitre 5

5
main ()
{
c
1
= c
2
= 1; /* ni P
1
,ni P
2
ne veulent entrer en section critique au dpart */
parbegin
p1();
p2 () ;
parend
}
/**************************************************************************/
p1()
{
for ( ; ; )
{
c
1
= 0; /* P
1
veut entrer en section critique */
while (c
2
== 0) /* tant que P
2
veut aussi entrer en section critique ... */
{
c
1
= 1; /* ....P
1
abandonne un temps son intention... */
c
1
= 0; /* ..... puis la raffirme */
}
crit
1
;
c
1
= 1; /* fin de la section critique de P
1
*/
reste
1
;
}
}
/*************************************************************************/
p2()
{
for ( ; ; )
{
c
2
= 0 ; /* P
2
veut entrer en section critique */
while (c
1
== 0) /* tant que P
1
veut aussi entrer en section critique ... */
{
c
2
= 1; /* .. P
2
abandonne un temps son intention .... */
c2 = 0 ; /* ..... puis la raffirme */
}
crit
2
;
c
2
= 1 ; /* fin de la section critique de P
2
*/
reste
2
;
}
}

Commentaires :
- l'exclusion mutuelle est satisfaite. (cf. ci-dessus)

- il est possible d'aboutir la situation o c
1
et c
2
sont nuls simultanment. Mais il n'y aura pas
interblocage car cette situation instable ne sera pas durable (Elle est lie la commutation de temps
entre c
i
= 1 et c
i
= 0 dans while).

- il y aura donc d'inutiles pertes de temps par famine limite.



Systme d'exploitation - Chapitre 5

6
2.4 Algorithme de DEKKER

DEKKER a propos un algorithme issu des avantages des 1re et 3me solutions pour rsoudre
l'ensemble du problme sans aboutir aucun inconvnient. Par rapport, l'algorithme prcdent, un
processus peut ritrer sa demande d'entre en section critique, si c'est son tour.

Algorithme :
int tour , /* valeur i si c'est au tour de P
i
de pouvoir entrer en section critique */
c1,c2 ; /* valeur 0 si le processus veut entrer en section critique,1 sinon */
main ()
{
c
1
= c
2
= tour = 1; /* P
1
peut entrer en section critique, mais... */
parbegin /* ... ni P
1
, ni P
2
ne le demandent */
p1 () ;
p2 () ;
parend
}
p1 ()
{
for ( ; ; )
{
c
1
= 0; /* P
1
veut entrer en section critique */
while (c
2
== 0) /* tant que P
2
le veut aussi........... */
if (tour == 2) /* ...... si c'est le tour de P
2
........ */
{
c
1
= 1; /* ...... P
1
renonce .................... */
while (tour == 2) ; /* ...... jusqu' ce que ce soit son tour ...... */
c
1
= 0; /* ..... puis raffirme son intention */
}
crit
1
;
tour = 2; /* C'est le tour de P
2
*/
c1 = 1; /* P
1
a achev sa section critique */
reste
1
;
}
}
/**********************************************************************/
p2 ()
{
for (; ; )
{
c
2
= 0; /* P
2
veut entrer en section critique */
while (c
1
== 0) /* tant que P
1
le veut aussi ......... */
if (tour == 1) /* ........ si c'est le tour de P
1
...... */
{
c
2
= 1; /* ........ P
2
renonce ....... */
while (tour == 1); /* ..... jusqu' ce que ce soit son tour .... */
c
2
= 0; /* ..... puis raffirme son intention */
}
crit
2
;
tour = 1; /* C'est le tour de P
1
*/
c
2
= 1; /* P
2
a achev sa section critique */
reste
2
;
}
}


Systme d'exploitation - Chapitre 5

7


Remarques :
- Si p1 veut entrer en section critique (c
1
= 0), alors que p2 le veut aussi (c
2
= 0), et que c'est le
tour de p1 (tour = 1), p1 insistera (while (c
2
== 0 ) sera actif). Dans p2, la mme boucle aboutira
c2 = 1 (renoncement temporaire de p2).

- On dmontre [Ben-Ari pages 51 53] que cet algorithme rsout l'exclusion mutuelle sans
privation, sans interblocage, sans blocage du programme par arrt d'un processus.

- Cet algorithme peut tre gnralis n processus au prix d'une trs grande complexit.

- De manire gnrale, les algorithmes par attente active prsentent un dfaut commun : les
boucles d'attente et le recours frquent la variable tour gaspillent du temps UC. Nouvelle ide :
mettre en sommeil un processus qui demande entrer en section critique ds lors qu'un autre
processus y est dj. C'est l'attente passive.

En outre, l'utilisation par les algorithmes de variables globales n'est pas d'une grande lgance.


2.5 Les smaphores

La rsolution des problmes multi-tches a considrablement progress avec l'invention des
smaphores par E.W. DIJKSTRA en 1965. Il s'agit d'un outil puissant, facile implanter et utiliser.
Les smaphores permettent de rsoudre un grand nombre de problmes lis la programmation
simultane, notamment le problme de l'exclusion mutuelle.

Un smaphore est une structure deux champs :
- une variable entire, ou valeur du smaphore. Un smaphore est dit binaire si sa valeur ne peut
tre que 0 ou 1, gnral sinon.
- une file d'attente de processus ou de tches.

Dans la plupart des cas, la valeur du smaphore reprsente un moment donn le nombre d'accs
possibles une ressource.

Seules deux fonctions permettent de manipuler un smaphore :
- P (s) ou down (s) ou WAIT (s)
- V (s) ou up (s) ou SIGNAL (s)

2.5.1 P (s)

La fonction P(S) dcrmente le smaphore d'une unit condition que sa valeur ne devienne pas
ngative.

dbut
a 1 /* a est un registre */
TestAndSet (&a, &verrou) /* copie le contenu de verrou (variable globale initialise 0) dans a
et range 1 dans le mot mmoire verrou. TestAndSet est ininterruptible Excute par
le matriel, elle permet de lire et d'crire un mot mmoire */
tant que a = 1 /* si a = 0, le verrou est libre et on passe, sinon le verrou est mis */
TestAndSet (&a, &verrou)
fin tant que
si (valeur du smaphore > 0)
alors dcrmenter cette valeur
sinon - suspendre l'excution du processus en cours qui a appel P(s),
- placer le processus dans la file d'attente du smaphore,


Systme d'exploitation - Chapitre 5

8
- le processus passe de l'tat ACTIF l'tat ENDORMI.
finsi
verrou 0
fin

2.5.2 V (s)

La fonction V(S) incrmente la valeur du smaphore d'une unit si la file d'attente est vide et si cette
incrmentation est possible.

dbut
a 1 /* a est un registre */
TestAndSet (&a, &verrou) /* cf. ci-dessus*/
tant que a = 1 /* si a = 0, le verrou est libre et on passe, sinon le verrou est mis */
TestAndSet (&a, &verrou)
fin tant que
si (file d'attente non vide)
alors
- choisir un processus dans la file d'attente du smaphore,
- rveiller ce processus. Il passe de l'tat ENDORMI l'tat ACTIVABLE.
sinon incrmenter la valeur du smaphore si c'est possible
finsi
verrou 0
fin

Remarques:

1. Du fait de la variable globale verrou, les fonctions P et V sont ininterruptibles (on dit aussi
atomiques). Les deux fonctions P et V s'excluent mutuellement. Si P et V sont appeles en mme
temps, elles sont excutes l'une aprs l'autre dans un ordre imprvisible. Dans un systme
multiprocesseur, les accs la variable partage verrou peuvent s'entrelacer. Il est donc ncessaire de
verrouiller le bus mmoire chaque fois qu'un processeur excute TestAndSet.

2. On supposera toujours que le processus rveill par V est le premier entr dans la file
d'attente, donc celui qui est en tte de la file d'attente.

3. L'attente active sur a consomme du temps UC.


2.5.3 Application des smaphores l'exclusion mutuelle

Avec le schma de programme prcdent :

SEMAPHORE s; /* dclaration trs symbolique */
main ()
{
SEMAB (s,1); /* dclaration trs symbolique ; initialise le smaphore binaire s 1 */
parbegin
p1 () ;
p2 () ; /* instructions trs symboliques
parend */
}
/****************************************************************************/
p1 () /* premier processus */
{
for ( ; ; )
{
P (s);


Systme d'exploitation - Chapitre 5

9
................. /* section critique de p1 */
V (s);
................. /* section non critique de p1 */
}
}
/***************************************************************************/
p2 () /* second processus */
{
for ( ; ; )
{
P (s);
................. /* section critique de p2 */
V (s);
................ /* section non critique de p2 */
}
}

La dmonstration formelle que l'algorithme rsout l'exclusion mutuelle et ne cre pas d'interblocage
est donne dans Ben-Ari page 63. Si l'on tend cet algorithme n processus (n > 2) , il peut y avoir
privation (par exemple, P1 et P2 peuvent se rveiller mutuellement et suspendre indfiniment P3 ou
d'autres processus).

J.M. Morris a propos en 1979 un algorithme de rsolution de l'exclusion mutuelle sans privation pour
n processus dans Information Processing Letters, volume 8 , pages 76 80 .










Systme d'exploitation - Chapitre 5

10
3. COMMUNICATION INTER-PROCESSUS

Les processus ont besoin de communiquer, d'changer des informations de faon plus labore et plus
structure que par le biais d'interruptions. Un modle de communication entre processus avec partage
de zone commune (tampon) est le modle producteur-consommateur.

Le producteur doit pouvoir ranger en zone commune des donnes qu'il produit en attendant que le
consommateur soit prt les consommer. Le consommateur ne doit pas essayer de consommer des
donnes inexistantes.

Hypothses :
- les donnes sont de taille constante
- les vitesses respectives des deux processus (producteur consommateur) sont quelconques.

Rgle 1 : Le producteur ne peut pas ranger un objet si le tampon est plein
Rgle 2 : Le consommateur ne peut pas prendre un objet si le tampon est vide.

PRODUCTEUR CONSOMMATEUR

Faire toujours Faire toujours
produire un objet si nb d'objets ds tampon >0
si nb d'objets ds tampon < N alors prendre l'objet
alors dposer l'objet ds le tampon consommer l'objet
finsi finsi
Fait Fait


Rgle 3 : exclusion mutuelle au niveau de l'objet : le consommateur ne peut prlever un objet que le
producteur est en train de ranger.

Rgle 4 : si le producteur (resp. consommateur) est en attente parce que le tampon est plein (resp.
vide), il doit tre averti ds que cette condition cesse d'tre vraie.

Le tampon peut tre reprsent par une liste circulaire. On introduit donc deux variables caractrisant
l'tat du tampon :
NPLEIN : nombre d'objets dans le tampon (dbut : 0)
NVIDE : nombre d'emplacements disponibles dans le tampon (N au dbut).

PRODUCTEUR :
Faire toujours
Produire un objet /* dbut d'atome ininterruptible */
si NVIDE >0 /* s'il existe au moins un emplacement vide dans le tampon */
alors NVIDE --
sinon s'endormir
finsi /* fin d'atome ininterruptible */
ranger l'objet dans le tampon /* dbut d'atome ininterruptible */
si consommateur endormi
alors rveiller le consommateur
sinon NPLEIN ++
finsi
Fait



Systme d'exploitation - Chapitre 5

11
CONSOMMATEUR :
Faire toujours
si NPLEIN > 0 /* s'il existe au moins un objet dans le tampon */
alors NPLEIN --
sinon s'endormir
finsi
prlever l'objet dans le tampon
si producteur endormi
alors rveiller le producteur
sinon NVIDE ++
finsi
consommer l'objet
Fait


3.1 Solution avec des smaphores

On peut considrer NVIDE et NPLEIN comme des smaphores :


PRODUCTEUR CONSOMMATEUR

Faire toujours Faire toujours
produire un objet P (NPLEIN)
P (NVIDE) prlever un objet
dposer un objet V (NVIDE)
V (NPLEIN) consommer l'objet
Fait Fait

On dmontre que le producteur et le consommateur ne peuvent tre bloqus simultanment.

Cas o le nombre de producteur (consommateur) est suprieur 1

Si plusieurs producteurs (consommateurs) oprent sur le mme tampon, il faut assurer l'exclusion
mutuelle dans l' opration dposer un objet ( prlever un objet) afin que le pointeur queue (tete)
garde une valeur cohrente, de mme que pour les objets points par queue (tete).

Si l'on veut s'assurer de plus qu'il n'y aura aucun problme dans l'accs au tampon, on peut
dcider que les oprations prlever et dposer ne s'excutent pas simultanment. Dposer et prlever
doivent donc figurer en section critique pour protger les valeurs ressources (tampon, queue, tete). D'o
l'utilisation d'un smaphore binaire :

PRODUCTEUR CONSOMMATEUR
produire un objet P (NPLEIN)
P (NVIDE) P (MUTEX)
P (MUTEX) objet = tampon [tete]
tampon[queue] = objet tete = (tete ++) % N
queue = (queue ++) % N V (MUTEX)
V (MUTEX) V (NVIDE)
V (NPLEIN) consommer l'objet


3.2 Solution avec un compteur d'vnements

D.P. REED et R.K. KANODIA ont propos en 1979 une solution qui utilise une variable entire
appele compteur d'vnements. Trois primitives permettent de manipuler une variable compteur
d'vnements E, commune tous les processus concerns :

- Read (E) donne la valeur de E


Systme d'exploitation - Chapitre 5

12
- Advance (E) incrmente E de 1 de manire atomique
- Await (E , v) attend que E v

constante TAILLE /* nombre de places dans le tampon */
compteur_d_vnements in = 0, /* nb d'objets mis dans le tampon */
out = 0 /* nb d'objets retirs du tampon */
producteur
Faire toujours
produire l'objet suivant
nb_produits ++ /* nb_produits : nombre d'objets produits */
await (out, nb_produits - TAILLE)
mettre l'objet en position (nb_produits - 1) % TAILLE
advance (in)
Fait


consommateur
Faire toujours
nb_retirs ++ /* nb_retirs : nombre d'objets retirs */
await (in, nb_retirs)
retirer l'objet en position (nb_retirs - 1) % TAILLE
advance (out)
consommer l'objet
Fait


3.3 Solution avec un moniteur

On peut aisment imaginer qu'une erreur de programmation des primitives P() et V() ou l'oubli d'une
de ces primitives peut tre trs grave : interblocage, incohrence des donnes, etc... On ne peut donc
pas concevoir tout un systme d'exploitation uniquement partir des smaphores. Un outil de
programmation plus sr s'avre ncessaire.

Dfinition : Un moniteur est une structure de variables et de procdures pouvant tre paramtre et
partage par plusieurs processus. Ce concept a t propos par C.A.R. HOARE en 1974 et P.
BRINCH-HANSEN en 1975. Le type moniteur existe dans certains langages de programmation, tels
que Concurrent Pascal.

Le corps du moniteur est excut ds que le programme est lanc pour initialiser les variables du
moniteur. Les variables moniteur ne sont accessibles qu' travers les procdures moniteur.

La seule manire pour un processus d'accder une variable moniteur est d'appeler une procdure
moniteur.

On peut prvoir plusieurs moniteurs pour diffrentes tches qui vont s'excuter en parallle. Chaque
moniteur est charg d'une tche bien prcise et chacun a ses donnes et ses instructions rserves. Si
un moniteur M1 est le seul moniteur avoir accs la variable u1, on est sr que u1 est en exclusion
mutuelle. De plus, comme les seules oprations faites sur u1 sont celles programmes dans M1, il ne
peut y avoir ni affectation, ni test accidentels.

On dit que l'entre du moniteur par un processus exclut l'entre du moniteur par un autre processus.
Les moniteurs prsentent plusieurs avantages :

- au lieu d'tre disperses dans plusieurs processus, les sections critiques sont transformes en
procdures d'un moniteur
- la gestion des sections critiques n'est plus la charge de l'utilisateur, mais elle est ralise par le
moniteur, puisqu'en fait le moniteur tout entier est implant comme une section critique.



Systme d'exploitation - Chapitre 5

13
Des exemples de moniteurs sont donns dans Beauquier, p. 139-141.

Il utilise des variables de type condition et deux primitives agissant sur elles :
- WAIT : bloque le processus appelant et autorise un processus en attente entrer dans le moniteur

- SIGNAL : rveille le processus endormi en tte de la file d'attente. Puis, ou bien le processus courant
est endormi (solution de Hoare), ou bien le processus courant quitte le moniteur (solution de Brinch
Hansen, la plus usite), afin qu'il n'y ait pas deux processus actifs dans le moniteur.

Voici une solution du moniteur du problme producteur-consommateur :

moniteur ProdCons /* moniteur, condition : types prdfinis */
condition plein, vide
int compteur
/* dbut du corps du moniteur */
compteur := 0
/* fin du corps du moniteur
procdure ajouter ()
{
if compteur = N then WAIT (plein) /* seul un SIGNAL (plein) rveillera le processus */
........... /* ranger l'objet dans le tampon */
compteur ++
if compteur = 1 then SIGNAL (vide)
/* rveille un processus endormi parce que le tampon tait vide */
}

procdure retirer ()
{
if compteur = 0 then WAIT (vide) /* seul un SIGNAL (vide) rveillera le processus */
.......... /* retirer l'objet du tampon */
compteur --
if compteur = N-1 then SIGNAL (plein)
/* rveille un processus endormi parce que le tampon tait plein */
}
fin du moniteur

procdure producteur ()
{
faire toujours
produire (lment)
ProdCons . ajouter ()
fin faire
}


procdure consommateur ()
{
faire toujours
retirer (lment)
ProdCons . retirer ()
fin faire
}





Systme d'exploitation - Chapitre 5

14
3.4 Solution avec changes de messages

Certains ont estim que les smaphores sont de trop bas niveau et les moniteurs descriptibles dans un
nombre trop restreint de langages. Ils ont propos un mode de communication inter-processus qui
repose sur deux primitives qui sont des appels systme ( la diffrence des moniteurs) :

- send (destination , &message)
- receive (source , &message), o source peut prendre la valeur gnrale ANY

Gnralement, pour viter les problmes dans les rseaux, le rcepteur acquitte le message reu.
L'metteur envoie nouveau son message s'il ne reoit pas d'acquittement. Le rcepteur, s'il reoit
deux messages identiques, ne tient pas compte du second et en tire la conclusion que l'acquittement
s'est perdu.

Dans le contexte d'un mode client-serveur, le message reu contient le nom et les paramtres d'une
procdure lancer. Le processus appelant se bloque jusqu' la fin de l'excution de la procdure et le
message en retour contient la liste des rsultats de la procdure. On parle d'appel de procdure
distance.

On peut proposer une solution au problme producteur-consommateur par change de messages avec
les hypothses suivantes :

- les messages ont tous la mme taille
- les messages envoys et pas encore reus sont stocks par le SE dans une mmoire tampon
- le nombre maximal de messages est N
- chaque fois que le producteur veut dlivrer un objet au consommateur, il prend un message vide,
le remplit et l'envoie. Ainsi, le nombre total de messages dans le systme reste constant dans le temps
- si le producteur travaille plus vite que le consommateur, tous les messages seront pleins et le
producteur se bloquera dans l'attente d'un message vide ; si le consommateur travaille plus vite que le
producteur, tous les messages seront vides et le consommateur se bloquera en attendant que le
producteur en remplisse un.

producteur
Faire toujours
produire_objet (&objet) /* produire un nouvel objet */
receive (consommateur , &m) /* attendre un message vide */
faire_message (&m , objet) /* construire un message envoyer */
send (consommateur , &m) /* envoyer le message */
Fait

consommateur
pour (i = 0 ; i < N ; i++) send (producteur , &m) /* envoyer N messages vides */
Faire toujours
receive (producteur , &m) /* attendre un message */
retirer_objet (&m , &objet) /* retirer l'objet du message */
utiliser_objet (objet)
send (producteur , &m) /* renvoyer une rponse vide */
Fait

On peut galement imaginer une solution de type bote aux lettres de capacit N messages , avec un
producteur se bloquant si la bote est pleine et un consommateur se bloquant si la bote est vide.

3.5 Proprits des solutions prcdentes

On dmontre les rsultats d'quivalence suivants entre smaphores, moniteurs et changes de
messages :



Systme d'exploitation - Chapitre 5

15
- on peut utiliser des smaphores pour construire un moniteur et un systme d'changes de
messages
- on peut utiliser des moniteurs pour raliser des smaphores et un systme d'changes de
messages
- on peut utiliser des messages pour raliser des smaphores et des moniteurs


3.6 Le problme des philosophes

Il s'agit d'un problme trs ancien, dont DIJKSTRA a montr en 1965 qu'il modlise bien les
processus en concurrence pour accder un nombre limit de ressources. "5 philosophes sont assis
autour d'une table ronde. Chaque philosophe a devant lui une assiette de spaghettis si glissants qu'il
lui faut deux fourchettes pour les manger. Or, il n'y a qu'une fourchette entre deux assiettes
conscutives. L'activit d'un philosophe est partage entre manger et penser. Quand un philosophe a
faim, il tente de prendre les deux fourchettes encadrant son assiette. S'il y parvient, il mange, puis il
se remet penser. Comment crire un algorithme qui permette chaque philosophe de ne jamais tre
bloqu ? "

Il faut tout la fois viter les situations :

- d'interblocage : par exemple tous les philosophes prennent leur fourchette gauche en mme
temps et attendent que la fourchette droite se libre
- de privation : tous les philosophes prennent leur fourchette gauche, et, constatant que la droite
n'est pas libre, la reposent, puis prennent la droite en mme temps, etc...

Voici une solution (une autre est donne dans Beauquier p. 155-156) :

#define N 5 /* nombre de philosophes */
#define GAUCHE (i - 1) % N /* n du voisin gauche de i */
#define DROITE (i + 1) % N /* n du voisin droite de i */
#define PENSE 0 /* il pense */
#define FAIM 1 /* il a faim */
#define MANGE 2 /* il mange */
typedef int semaphore;
int etat [N]; /* pour mmoriser les tats des philosophes */
semaphore mutex = 1, /* pour section critique */
s [N]; /* un smaphore par philosophe */
/*****************************/
void philosophe (int i)
{
while (TRUE)
{
penser ();
prendre_fourchettes (i); /* prendre 2 fourchettes ou se bloquer */
manger ();
poser_fourchettes (i);
}
}
/*****************************/
void prendre_fourchettes (int i)
{
P (mutex); /* entre en section critique */
etat [i] = FAIM;
test (i); /* tentative d'obtenir 2 fourchettes */
V (mutex); /* sortie de la section critique */
P (s [i]); /* blocage si pas 2 fourchettes */
}

/*****************************/


Systme d'exploitation - Chapitre 5

16
void poser_fourchettes (int i)
{
P (mutex); /* entre en section critique */
etat [i] = PENSE;
test (GAUCHE);
test (DROITE);
V (mutex) ; /* sortie de la section critique */
}
/*****************************/
void test (int i)
{
if (etat [i] == FAIM && etat [GAUCHE] != MANGE && etat [DROITE] != MANGE)
{
etat [i] = MANGE;
V (s [i] );
}
}


3.7 Le problme des lecteurs et des rdacteurs

Il s'agit d'un autre problme classique dont P.J. COURTOIS a montr en 1971 qu'il modlise bien les
accs d'un processus une base de donnes. On peut accepter que plusieurs processus lisent la base en
mme temps; mais ds qu'un processus crit dans la base, aucun autre processus ne doit tre autoris
y accder, en lecture ou en criture.

Voici une solution qui donne la priorit aux lecteurs (COURTOIS a propos une solution qui donne
la priorit aux rdacteurs) :

typedef int semaphore;
int rc = 0; /* nb de processus qui lisent ou qui veulent crire */
semaphore mutex = 1, /* pour contrler l'accs rc */
bd = 1; /* contrle de l'accs la base */
/*****************************/
void lecteur ()
{
while (TRUE)
{
P (mutex); /* pour obtenir un accs exclusif rc */
rc ++; /* un lecteur de plus */
if (rc == 1) P (bd); /* si c'est le 1er lecteur */
V (mutex);
lire_base_de_donnees ();
P (mutex); /* pour obtenir un accs exclusif rc */
rc --; /* un lecteur de moins */
if (rc == 0) V (bd); /* si c'est le dernier lecteur */
V (mutex);
utiliser_donnees_lues ();
}
}
/*****************************/
void redacteur ()
{
while (TRUE)
{
creer_donnees ();
P (bd);
ecrire_donnees ();
V (bd);
}


Systme d'exploitation - Chapitre 5

17
}

Autre bonne solution : Beauquier p. 146-148


4. APPLICATION DES SEMAPHORES A LA SYNCHRONISATION

4.1 Synchronisation

Def.: On dit qu'un processus P est synchronis avec un processus Q lorsque l'activit de P (resp. Q)
dpend d'un vnement modifi par Q (resp. P).

La synchronisation exige la mise en place d'un mcanisme permettant un processus actif de bloquer
un autre processus ou de se bloquer lui-mme ou d'activer un autre processus. On distingue:

- les actions directes : le processus agit directement sur le processus cible par des primitives telles
que bloque (pid) ou rveille (pid) ou encore dort () qui s'applique lui-mme

- les actions indirectes : le processus utilise un objet commun, tel que smaphore

Exemple :
Soient 3 processus P1, P2, P3 chargs du calcul de (a+ b) * (c + d) - (e/f)
P2 calcule c + d, P3 calcule e/f et P1 le rsultat.
On initialise les smaphores s1 et s2 0.

P1 P2 P3
_________________________________________
t1 = a + b t2 = c + d t3 = e/f
P (s1) V (s1) V(s2)
t4 = t1 * t2
P (s2)
res = t4 - t3


P1 ne peut se poursuivre au-del de tant que P2 n'a pas excut V
P1 ne peut se poursuivre au-del de tant que P3 n'a pas excut V

Plus gnralement, si l'on veut empcher un processus A d'excuter son instruction K avant qu'un
autre processus B n'ait excut son instruction J, on initialise un smaphore binaire s 0. On place P
(s) avant l'instruction K de A et V (s) aprs l'instruction J de B.



4.2 Interblocage

Si les primitives P et V ne sont pas utilises correctement (erreurs dans l'emploi, le partage ou
l'initialisation des smaphores), un problme peut survenir.

Exemple : avec deux processus p1 et p2, deux smaphores s1 et s2
(s1 = s2 = 1)

p1 p2
.... ......
P (S1) P (S2)
....... ..........
P (S2) P (S1)


Systme d'exploitation - Chapitre 5

18
.......
V (S2)

Si p1 fait P (S1) alors S1 = 0
puis p2 fait P (S2) et S2 = 0
puis p1 fait P (S2) et p1 est en attente, ENDORMI
puis p2 fait P (S1) et p2 est ENDORMI

Il y a donc videmment interblocage (puisque aucun des processus ne peut faire V (On dit aussi
treinte fatale ou deadlock)


BIBLIOGRAPHIE


J. BEAUQUIER, B. BERARD, Systmes d'exploitation, Ediscience, 1993

M. BEN-ARI, Processus concurrents, Masson 1986

A. SCHIPER, Programmation concurrente, Presses Polytechnique Romandes 1986

A. TANENBAUM, Les systmes d'exploitation, Prentice Hall, 1999


Systme d'exploitation - Chapitre 5

19
Exercices sur le chapitre 4



1. Expliquer pourquoi l'exclusion mutuelle n'est plus assure si les oprations P et V sur un
smaphore ne sont plus atomiques.

2. Une machine possde une instruction swap qui change de manire atomique le contenu de deux
variables entires. Soient les variables suivantes globales n processus :

int libre = 0;
int tour [n]; /* tableau initialis 1 */

Le code source du processus n i (i = 1 n) est :

main ()
{
while (1)
{
do {
swap (libre, tour [i]);
i++;
} while (tour [i-1] == 1);
/* puis section critique */

swap (libre, tour [i]);
/* puis section non critique */
}
}

L'exclusion mutuelle est-elle satisfaite ?

Un processus dsirant entrer en section critique peut-il attendre indfiniment cette entre ?



Systme d'exploitation - Chapitre 6

1
Chapitre 6 LES ENTREES-SORTIES


1. ENTREES-SORTIES PHYSIQUES

Les principes et les caractristiques des priphriques ont t vus dans le cours de Technologie des
Ordinateurs.

Dans certains ordinateurs, des instructions permettent la redirection des donnes issues de l'UC, non
vers la mmoire, mais vers un priphrique (solution INTEL); ou bien un accs mmoire une
adresse rserve particulire est interprte comme demande d'accs un priphrique (solution
Motorola).

Trois solutions sont utilises pour faire communiquer l'UC et les priphriques :

1.1 Contrleurs

Chaque priphrique est connect l'ordinateur par l'intermdiaire d'une carte lectronique appele
interface ou adaptateur ou contrleur de priphrique, qui transforme les signaux du priphrique
en signaux adapts l'UC et vice-versa. Un contrleur peut grer un ou plusieurs priphriques. Le
SE communique donc avec le contrleur et non avec le priphrique lui-mme. Les petits ordinateurs
utilisent des liaison bus entre les contrleurs, la mmoire et l'UC.

Toutes les donnes transitent par l'UC qui gre toutes les phases de la transmission, du contrle et de
la synchronisation.

Exemple : imprimantes, clavier/cran sur PC.

1.2 DMA

Pour viter le ralentissement de l'UC par ces tches de bas niveau, on utilise parfois l'accs direct la
mmoire (DMA). Il suffit de donner au contrleur l'adresse o il doit accder en mmoire, l'opration
(lecture ou criture), le nombre d'octets transfrer entre la mmoire principale et le tampon du
contrleur. Le contrleur utilise les "temps morts" du bus (vol de cycle ou cycle stealing). L'UC
conserve la responsabilit des fonctions de commande, de contrle et une partie de la synchronisation.
En fin de transfert, le contrleur met une interruption.

Exemple : disque sur PC.


1.3 Canal

Sur les gros ordinateurs, des canaux d'E/S allgent le travail du processeur principal pour sa
communication avec les contrleurs (contrle et synchronisation). Un canal d'E/S est un processeur
spcialis qui gre soit un seul priphrique rapide, soit plusieurs priphriques multiplexs. Un canal
utilise le DMA.

L'UC envoie au canal l'adresse en mmoire centrale du dbut du programme de transfert excuter
(programme canal). L'UC peut interrompre l'excution, scruter l'tat d'avancement par consultation
de registres du canal. Un canal est une solution adapte aux priphriques rapides des mini- et gros
ordinateurs.




Systme d'exploitation - Chapitre 6

2
2. PERIPHERIQUES VIRTUELS D'ENTREE-SORTIE

2.1 Mcanisme des priphriques virtuels

L'objectif est de rendre tout programme utilisateur indpendant des types de priphriques , nombreux
et en volution constante, et des contrles qui en dcoulent. D'o la cration de priphriques
virtuels ou flots d'E/S ou fichiers d'E/S. Sous UNIX, par exemple, une console, un disque ou un
fichier ont la mme interface d'accs.

Les oprations possibles sur un flot sont :
- ouverture et association physique (open en C)
- fermeture et dissociation (close en C)
- lecture (read en C)
- criture (write en C)
- paramtrage et contrle (ioctl , seek en C)

Le systme gre une table des flots par processus dans le BCP.

La concordance entre un priphrique virtuel et un priphrique physique associ est assure par un
pilote de priphrique (device driver) : soit un type de pilote par type de priphrique, soit un seul
type de pilotes configurable par des descripteurs de priphriques. Un pilote est la seule partie du
SE connatre les registres du contrleur, les secteurs et leur facteur d'entrelacement, les pistes, les
cylindres, les ttes, les dplacements des bras, les moteurs, le temps de positionnement des ttes, etc...,
ainsi que le traitement des erreurs.


2.2 Fonctionnement d'un priphrique virtuel

Un processus P demande une E/S avec un priphrique. La correspondance priphrique virtuel-
priphrique physique est ainsi rsolue :

- appel systme : les paramtres de l'appel sont empils et un appel systme (Supervisor
Call =requte SVC) est gnr

- action du superviseur : il identifie la nature de l'appel et rcupre les paramtres (nom du
flot, nombre d'octets, adresse de transfert); puis il identifie le pilote concern et le priphrique
physique. Enfin, il appelle le pilote

- le pilote : le contexte du processus actif est commut aprs sauvegarde. La procdure de
traitement des E/S est excute. Ensuite, le pilote envoie une interruption pour le signaler. Le
processus initial est recharg et ractiv.

Comme il doit y avoir possibilit d'E/S simultanes, un pilote doit tre rentrant. En outre, chaque
pilote gre une table des processus en attente.



3. PROBLEMES D'INTERBLOCAGE DES PERIPHERIQUES

Avec des priphriques partags (disques, ...), des problmes d'interblocage peuvent survenir. Citons
deux exemples :

- un processus A demande le drouleur et un processus B demande le traceur de courbe. Les
deux demandes sont prises en compte. Puis A demande le traceur sans librer le drouleur et B
demande le drouleur sans librer le traceur


Systme d'exploitation - Chapitre 6

3

- un processus A verrouille l'enregistrement R1 d'une BD pour viter les conflits d'accs et un
processus B verrouille l'enregistrement R2. Puis chacun essaie de verrouiller l'enregistrement
verrouill par l'autre


COFFMAN, ELPHICK et SHOSHANI ont montr en 1971 qu'il faut runir 4 conditions pour
provoquer un interblocage :

- l'exclusion mutuelle : chaque ressource est soit disponible, soit attribue un seul processus

- la dtention et l'attente : les processus qui dtiennent des ressources peuvent en demander de
nouvelles

- pas de rquisition : les ressources obtenues par un processus ne peuvent pas lui tre retires,
mais il doit les librer explicitement

- l'attente circulaire : il doit y avoir au moins deux processus, chacun d'eux attendant une
ressource dtenue par l'un des autres

Il existe une solution chacune des 4 conditions prcdentes pour prvenir les interblocages :


3.1 Exclusion mutuelle : usage d'un spoule

Considrons une imprimante avec un fichier tampon associ. Un processus peut ouvrir ce fichier et ne
rien imprimer pendant des heures, bloquant tous les autres processus voulant accder la ressource.

On cre un processus particulier appel dmon (daemon) et un rpertoire spcial, le rpertoire de
spoule (spool). Pour imprimer un fichier, un processus doit d'abord le lier au rpertoire de spoule. Le
dmon, seul processus tre autoris accder au fichier spcial de l'imprimante, imprime les fichiers
du rpertoire de spoule.

Une technique identique peut tre utilise pour la transmission de fichiers travers un rseau (dmon
de rseau, rpertoire de spoule de rseau).

Mais le spoule ne peut pas rsoudre tous les problmes d'exclusion mutuelle (par exemple, spoule
plein et processus inachevs) , ni s'appliquer tous les priphriques. On se reportera donc aux
algorithmes du chapitre prcdent.


3.2 Dtention et attente : demande pralable de ressources

Si l'on oblige tout processus demander l'avance les ressources ncessaires, on n'activera le
processus que lorsque toutes les ressources seront disponibles. Cette condition est bien sr difficile
mettre en pratique. Une alternative : n'accorder une nouvelle ressource que s'il y a libration des
anciennes ressources.


3.3 Pas de rquisition : pas de solution !

3.4 Attente circulaire : l'ordonnancement numrique des ressources

On numrote toutes les ressources (exemple : 1 : imprimante, 2 : traceur, 3 : drouleur, etc...). Un
processus peut demander toutes les ressources qu'il souhaite condition que les numros des
ressources soient croissants (variante : un processus ne peut demander une ressource de numro


Systme d'exploitation - Chapitre 6

4
infrieur la plus haute ressource qu'il dtient). Un interblocage se produirait si le processus A
demande la ressource i dtenue par B et si B demande la ressource k dtenue par A. Si i >k, B ne
pourra demander k et si i <k, A ne pourra demander i : il n'y aura pas interblocage.



3.5 Attente circulaire : l'algorithme du banquier

En 1965, DIJ KSTRA a propos un algorithme qui permet d'viter l'interblocage : l'algorithme du
banquier, qui reproduit le modle de prt des clients par un banquier.

Considrons les deux tableaux suivants qui rsument l'tat d'un ordinateur l'instant t :

proc. P1 P2 P3 P4 proc. P1 P2 P3 P4
A
B
C
D
E
total
ressources actuellement a ttribues
3 0
1
1
0 1 0
0
1
1
1
0
1 1
0 1
0
0
0 0
5 3 2
2
A
B
C
D
E
1
1
0
0
0 1 1 2
3 1 0 0
0 0 1 0
2
1 1 0
ressources encore demand es
ressources existantes : exist =( 6 3 4 2 )
ressources disponibles : dispo =exist - total =( 1 0 2 0)


5 processus sont actifs (A,B,C,D,E) et il existe 4 catgories de priphriques P1 P4 (exemple : P4 =
imprimante). Le tableau de gauche donne les ressources dj alloues et le tableau de droite les
ressources qui seront encore demandes pour achever l'excution.

Un tat est dit sr s'il existe une suite d'tats ultrieurs qui permette tous les processus d'obtenir
toutes leurs ressources et de se terminer. L'algorithme suivant dtermine si un tat est sr :

1. Trouver dans le tableau de droite une ligne L dont les ressources demandes sont toutes
infrieures celles de dispo ( L
i
<= dispo
i
, i). S'il n'existe pas L vrifiant cette condition, il y a
interblocage

2. Supposer que le processus associ L obtient les ressources et se termine. Supprimer sa ligne
et actualiser dispo

3. Rpter 1 et 2 jusqu' ce que tous les processus soient termins (l'tat initial tait donc sr) ou
jusqu' un interblocage (l'tat initial n'tait pas sr)

Ici, par exemple, l'tat actuel est sr car :
- on allouera D les ressources demandes et il s'achvera
- puis on allouera A ou E les ressources demandes et A ou E s'achvera
- enfin les autres

L'inconvnient de cet algorithme est le caractre irraliste de la connaissance pralable des ressources
ncessaires l'achvement d'un processus. Dans bien des systmes, ce besoin volue dynamiquement.





Systme d'exploitation - Chapitre 6

5
4. LES DISQUES

4.1 Caractristiques physiques

Un disque est logiquement organis en cylindres. Un cylindre contient autant de pistes qu'il y a de
ttes. Chaque piste est divise en secteurs(un nombre constant et de taille constante quelque soit le
rayon de la piste). Un contrleur de disques peut effectuer des recherches simultanes sur plusieurs
disques, ou bien lire ou crire sur un disque et attendre des donnes d'un ou plusieurs autres disques.

Pour le systme, une adresse sur disque est forme du triplet : (n de cylindre, n de piste, n de
secteur).

Le temps moyen de lecture/criture sur un secteur est gal la somme de trois dures lmentaires :

- le temps de recherche : positionnement de la tte sur le bon cylindre
- le temps de latence ou dlai rotationnel :pour atteindre le bon secteur (en moyenne 1/2 tour de
rotation)
- le temps de transfert rel de l'information


4.2 Ordonnancement des accs

Algorithme FCFS (FIFO) : la gestion la plus simple du mouvement du bras du disque consiste
satisfaire les requtes d'accs dans l'ordre o elles surviennent. Bien entendu, cet algorithme donne
gnralement de mauvais temps de rponse. Ainsi, si une suite de requtes concerne les pistes : 1, 36,
16, 34, 9, 12, alors que les ttes sont sur le cylindre 11, il faudra se dplacer au total de 111 cylindres.
Il s'agit de l'algorithme First Come First Served.

Algorithme SSF (ou PCD) : ici, le pilote choisit la requte la plus proche de sa position actuelle
(Shortest Seek First, plus courte d'abord, variante du PCTR dj tudi au chapitre 3, 3). Avec
l'exemple ci-dessus, les cylindres seront traits dans l'ordre : 12, 9, 16, 1, 34, 36. On se sera dplac
de 61 cylindres seulement. Mais les requtes portant sur des cylindres loigns peuvent tre
durablement diffres, si d'autres requtes surviennent pendant le traitement de la liste : l'quitabilit
peut souffrir de la rduction du temps de rponse.

Algorithme de l'ascenseur (Look) : pour viter cet inconvnient, on dplace la tte dans une
direction donne en traitant toutes les requtes rencontres, puis le sens du balayage s'inverse et on
traite les requtes rencontres, etc... Dans l'exemple trait, on obtiendrait l'ordre : 12, 16, 34, 36, 9, 1
et un parcours total de 60 cylindres.

Une variante a t propose par T.J . TEOREY en 1972 (C-Look, C pour circulaire) : la
dernire piste est considre comme adjacente la premire. La tte, lorsqu'elle est arrive une
extrmit, retourne immdiatement l'autre sans traiter de requte. On obtiendrait ici l'ordre : 12, 16,
34, 36, 1, 9, soit 68 cylindres parcourus.

Algorithme PCTL : lorsqu'un disque est fortement sollicit, on trouve frquemment plusieurs
rfrences une mme piste ou un mme cylindre. Les requtes doivent tre ordonnes selon le
secteur recherch pour rduire le temps de latence. L'algorithme PCTL (plus court temps de latence)
traite les requtes dans l'ordre de dfilement des secteurs concerns sous la tte, pour une piste
donne, quel que soit leur ordre d'arrive. Par exemple, si la tte se trouve au-dessus du secteur n 2
et que des requtes concernent les secteurs 11, 5, 8 et 7, on traitera dans l'ordre les secteurs 5, 7, 8,
11ce qui vitera d'attendre plus d'un tour pour traiter les secteurs 5, 8, 7. On peut parfois gagner en
efficacit en entrelaant les secteurs sur les pistes.



Systme d'exploitation - Chapitre 6

6
Souvent, les modles probabilistes sont plus ralistes que les modles dterministes. Dans les
problmes d'ordonnancement, en particulier, les modles des files d'attente sont souvent performants.
Ils sont bien traits dans BEAUQUIER et BERARD, ch. 10.


4.3 Mmoire cache pour les pistes du disque

En gnral, le temps de recherche est trs suprieur au temps de transfert. Il importe donc peu de lire
un secteur ou bien une piste complte pour simplifier le fonctionnement du contrleur. On utilise une
mmoire cache pour stocker une piste : mmoire accs rapide, accs direct par le contrleur et par
l'UC.

Il est prfrable d'implanter cette antmmoire dans le contrleur, plutt que dans le pilote, pour que
le transfert puisse se faire par DMA


4.4 Traitement des erreurs

Le fonctionnement des disques est soumis de nombreuses sources d'erreurs :
- erreur de programmation (par exemple : accs un secteur inexistant) ncessitant un arrt de la
requte
- erreur du contrle de parit (checksum) : on dclare le secteur endommag si l'erreur persiste
au bout de plusieurs essais. On tient jour un fichier des secteurs endommags ne jamais allouer et
ne jamais copier lors d'une sauvegarde
- erreur de positionnement du bras : un programme de recalibrage est lanc
-erreur de contrleur


4.5 Disque virtuel

Un disque virtuel utilise une portion de la mmoire centrale pour sauvegarder des secteurs. Il convient
bien pour stocker programmes et donnes frquemment utilises, qui seront ainsi accessibles trs
rapidement.



5. LES TERMINAUX

Il existe de trs nombreuses varits de terminaux. C'est donc au pilote de terminal de masquer ces
diffrences pour qu'un programme soit le plus possible indpendant du terminal utilis.

5.1 Caractristiques physiques

Du point de vue du SE, on distingue deux catgories de terminaux :

5.1.1 Les terminaux interface RS-232 standard

Ils communiquent avec une interface srie et son dots d'un connecteur 25 broches (une broche pour
transmettre les donnes, une pour en recevoir, une pour la masse et quelques autres pour les
contrles). Gnralement un UART (Universal Asynchronous Receiver Transmitter) assure la
conversion parrallle-srie des signaux et srie-parallle. Le pilote envoie octet par octet l'UART et
se bloque entre deux transferts (jusqu' 19200 bits/s).

Les terminaux intelligents actuels possdent un processeur puissant, une mmoire de grande capacit
et peuvent tlcharger des programmes partir de l'ordinateur.



Systme d'exploitation - Chapitre 6

7
5.1.2 Les terminaux mapps en mmoire (memory-mapped terminals)

Ces terminaux ne communiquent pas avec l'ordinateur par une liaison srie, mais font partie de
l'ordinateur. Ils sont interfacs par une mmoire particulire (RAM vido) qui fait partie de la
mmoire de l'ordinateur et est adresse par le processeur comme n'importe quelle partie de la
mmoire. Cette solution es plus rapide que la prcdente. Un autre composant, le contrleur vido,
retire des octets de la RAM vido et gnre le signal vido qui contrle l'affichage l'cran.

Dans le cas des terminaux bitmap, chaque bit de la RAM vido contrle un pixel de l'cran.

Le clavier est interfac par une liaison parallle, voire une liaison srie. A chaque frappe de touche et
chaque relchement, une interruption est dclenche et le code de l'emplacement de la touche est
plac dans un tampon.


5.2 Le logiciel du clavier

Deux types de pilotes sont envisageables :

- le pilote lit chaque octet du tampon, le convertit en code ASCII l'aide de tables internes, et le
transmet sans interprtation, ou plus souvent le stocke dans un tampon : il s'agit d'une approche
caractre (mode raw)

- le pilote prend en compte tout ce qui se rapporte l'dition de ce qui prcde la validation (par
RC ou NL) : BS, etc... et ne transmet que les lignes corriges : il s'agit d'une approche ligne
(mode cooked)

Sous UNIX, le mode cbreak est un compromis entre les modes raw et cooked : les caractres sont
transmis au processus sans attendre la validation (comme en mode raw), mais DEL, CTRL-S, CTRL-
Q et CTRL-\ sont traits comme en mode cooked. La fonction ioctl permet de changer de mode.

Il existe deux faons de grer les tampons des claviers :

- le pilote rserve un ensemble de tampons de taille standard. A chaque terminal est associ un
pointeur sur le premier tampon utilis; l'ensemble des tampons associs un terminal est organis en
une liste chane. Cette mthode est utilise sur les grosses machines possdant beaucoup de
terminaux

- au sein de la structure de donnes associe chaque terminal dans la mmoire, on implante un
tampon propre au terminal. Le pilote est plus simple. Cette solution convient bien aux petits systmes
ou aux PC.

Les pilotes de claviers doivent galement s'acquitter de bien d'autres tches : grer la prsence ou
l'absence d'cho l'cran, grer les lignes de longueur suprieure une ligne d'cran, grer les
caractres de tabulation, produire les caractres RC et NL lors d'une validation avec une convention
donne, grer les caractres spciaux (CTRL-D, CTRL-Q, CTRL-S, DEL, etc....). Sous UNIX, ces caractres


5.3 Le logiciel de l'cran

Dans le cas d'un terminal RS-232, le programme ou la fonction d'cho de la frappe envoie dans le
tampon de l'cran la suite des octets afficher. Si le tampon est plein ou bien si toutes les donnes
sont transmises, le premier caractre est envoy au terminal, le pilote est endormi. Une interruption
provoque la transmission du caractre suivant, etc...



Systme d'exploitation - Chapitre 6

8
Dans le cas de terminaux mapps en mmoire, les caractres afficher sont retirs un un de l'espace
utilisateur et placs dans la RAM vido (avec traitement particulier pour certains caractres, comme
BELL ou les squences classiques d'chappement).

Le pilote gre la position courante dans la RAM vido, en tenant compte des caractres tels que RC,
NL, BS; il gre aussi le dfilement (scrolling) lorsqu'un passage la ligne en bas d'cran survient.
Pour cela, il met jour un pointeur, gr par le contrleur vido, sur le premier caractre de la
premire ligne l'cran. Le pilote gre aussi le curseur en tenant jour un pointeur sur sa position.



Systme d'exploitation - Chapitre 6

9
Exercices :

1. Soit l'tat suivant d'un ordinateur l'instant t :

proc. P1 P2 P3 P4 proc. P1 P2 P3 P4
A
B
C
D
E
total
ressources actuellement a ttribues
3 0
1 1
0 1 1
0
1 1 1
0
1 1 0 1
0
0
0 0
5 3 3
2
A
B
C
D
E
1 1
0
0
0
1 0
2
3
1 0 0
0 0 1
0
2 1 1
0
ressources encore demand es
ressources existantes : exist =( 6 3 4 2 )
ressources disponibles : dispo =exist - total =( 1 0 1 0)


L'tat du systme est-il sr ?
Si le processus E fait la demande (0, 0, 1, 0) le systme qui utilise l'algorithme du banquier lui
attribuera-t-il la ressource P3 ?


2. On excute un ensemble S de n processus indpendants en parallle :
S =p
1
// p
2
// ... // p
n

Le processus p
1
est constitu de 4 tches squentielles : p
1
=T
1
(1) T
2
(1) T
3
(1) T
4
(1)
Le processus p
2
est constitu de 2 tches squentielles : p
2
=T
1
(2) T
2
(2)
Le processus p
3
est constitu de 3 tches squentielles : p
3
=T
1
(3) T
2
(3) T
3
(3)

Trois ressources sont disponibles : R
1
en quantit N
1
=7, R
2
en quantit N
2
=8,
R
3
en quantit N
3
=6

A chaque tche T
i
(k), on associe deux vnements :
d
i
(k) : initialisation de la tche (lecture des paramtres d'entre, acquisition de ressources,
chargement d'information)
f
i
(k) : terminaison de la tche ( criture des rsultats, libration de ressources)

On note d
i
(k) (r
1
, ..., r
n
) l'vnement correspondant l'initialisation de la tche T
i
(k) avec demande
de r
1
ressources R
1
,..., r
n
ressources R
n
et f
i
(k) (r
1
, ..., r
n
) l'vnement correspondant la
terminaison de la tche T
i
(k) avec libration de r
1
ressources R
1
,..., r
n
ressources R
n
.
Le comportement suivant est-il valide :

w = d
1
(1) (1,2,3) d
1
(3) (1,1,1) f
1
(1) (0,1,2) d
1
(2) (0,2,1) f
1
(2) (0,1,0) d
2
(2) (1,2,0)
f
1
(3) (0,0,1) d
2
(1) (3,2,4) f
2
(2) (1,3,1) f
2
(1) (4,2,5) d
2
(3) (3,0,1) d
3
(1) (2,3,1)
f
3
(1) (2,4,0) d
4
(1) (2,0,0) f
2
(3) (3,0,1) d
3
(3) (2,1,0) f
3
(3) (3,2,0) f
4
(1) (2,0,1)

Quelles sont les valeurs maximales de N
1
, N
2
, N
3
de telle faon ce que si le mot tait valide, il ne le
soit plus ? Quelles sont les valeurs minimales de N
1
, N
2
, N
3
de telle faon ce que si le mot n'tait pas
valide, il le soit ?


Systme d'exploitation - Chapitre 7

1
Chapitre 7 GESTION DE LA MEMOIRE


Pour pouvoir utiliser un ordinateur en multiprogrammation, le SE charge plusieurs processus en
mmoire centrale (MC). La faon la plus simple consiste affecter chaque processus un ensemble
d'adresses contigus.

Quand le nombre de tches devient lev, pour satisfaire au principe d'quitabilit et pour minimiser
le temps de rponse des processus, il faut pouvoir simuler la prsence simultane en MC de tous les
processus. D'o la technique de "va et vient" ou recouvrement (swapping), qui consiste stocker
temporairement sur disque l'image d'un processus, afin de librer de la place en MC pour d'autres
processus.

D'autre part, la taille d'un processus doit pouvoir dpasser la taille de la mmoire disponible, mme si
l'on enlve tous les autres processus. L'utilisation de pages (mcanisme de pagination) ou de
segments (mcanisme de segmentation) permet au systme de conserver en MC les parties utilises
des processus et de stocker, si ncessaire, le reste sur disque.

Le rle du gestionnaire de la mmoire est de connatre les parties libres et occupes, d'allouer de la
mmoire aux processus qui en ont besoin, de rcuprer de la mmoire la fin de l'excution d'un
processus et de traiter le recouvrement entre le disque et la mmoire centrale, lorsqu'elle ne peut pas
contenir tous les processus actifs.


1.GESTION SANS RECOUVREMENT, NI PAGINATION

1.1 La monoprogrammation

Il n'y a en MC que :
- un seul processus utilisateur,
- le processus systme (pour partie en RAM, pour partie en ROM; la partie en ROM tant
appele BIOS [Basic Input Output System ] )
- les pilotes de priphriques

Cette technique en voie de disparition est limite quelques micro-ordinateurs . Elle n'autorise qu'un
seul processus actif en mmoire un instant donn.


1.2 La multiprogrammation

La multiprogrammation est utilise sur la plupart des ordinateurs : elle permet de diviser un
programme en plusieurs processus et plusieurs utilisateurs de travailler en temps partag avec la
mme machine.

Supposons qu'il y ait n processus indpendants en MC, chacun ayant la probabilit p d'attendre la fin
d'une opration d'E/S. La probabilit que le processeur fonctionne est 1 - p
n
.( Il s'agit d'une
estimation grossire, puisque sur une machine monoprocesseur, les processus ne sont pas
indpendants (attente de libration de la ressource processeur pour dmarrer l'excution d'un
processus prt).

Toutefois, on remarque que plus le nombre n de processus en MC est lev, plus le taux d'utilisation
du processeur est lev : on a donc intrt augmenter la taille de la MC.


Systme d'exploitation - Chapitre 7

2
Une solution simple consiste diviser la mmoire en n partitions fixes, de tailles pas ncessairement
gales (mthode MFT [Multiprogramming with a Fixed number of Tasks ] apparue avec les IBM
360). Il existe deux mthodes de gestion :

- on cre une file d'attente par partition . Chaque nouveau processus est plac dans la file
d'attente de la plus petite partition pouvant le contenir. Inconvnients :
* on perd en gnral de la place au sein de chaque partition
* il peut y avoir des partitions inutilises (leur file d'attente est vide)

- on cre une seule file d'attente globale. Il existe deux stratgies :
* ds qu'une partition se libre, on lui affecte la premire tche de la file qui peut y
tenir. Inconvnient : on peut ainsi affecter une partition de grande taille une petite tche et perdre
beaucoup de place

* ds qu'une partition se libre, on lui affecte la plus grande tche de la file qui peut y
tenir. Inconvnient : on pnalise les processus de petite taille.


1.3 Code translatable et protection

Avec le mcanisme de multiprogrammation, un processus peut tre charg n'importe o en MC. Il n'y
a plus concordance entre l'adresse dans le processus et l'adresse physique d'implantation. Le problme
de l'adressage dans un processus se rsout par l'utilisation d'un registre particulier, le registre de base
: au lancement du processus, on lui affecte l'adresse de dbut de la partition qui lui est attribue. On a
alors :
adresse physique =adresse de base (contenu de ce registre)
+adresse relative (mentionne dans le processus)

De plus, il faut empcher un processus d'crire dans la mmoire d'un autre. Deux solutions :

* des cls de protection : une cl de protection pour chaque partition, duplique dans le
mot d'tat (PSW =Program Status Word) du processus actif implant dans cette partition. Si un
processus tente d'crire dans une partition dont la cl ne concorde pas avec celle de son mot d'tat, il y
a refus.

* un registre limite, charg au lancement du processus la taille de la partition. Toute
adresse mentionne dans le processus (relative) suprieure au contenu du registre limite entrane un
refus.


2. GESTION AVEC RECOUVREMENT, SANS PAGINATION

Ds que le nombre de processus devient suprieur au nombre de partitions, il faut pouvoir simuler la
prsence en MC de tous les processus pour pouvoir satisfaire au principe d'quit et minimiser le
temps de rponse des processus. La technique du recouvrement (swapping) permet de stocker
temporairement sur disque des images de processus afin de librer de la MC pour d'autres processus.

On pourrait utiliser des partitions fixes, mais on utilise en pratique des partitions de taille variable,
car le nombre, la taille et la position des processus peuvent varier dynamiquement au cours du temps.
On n'est plus limit par des partitions trop grandes ou trop petites comme avec les partitions fixes.
Cette amlioration de l'usage de la MC ncessite un mcanisme plus complexe d'allocation et de
libration.



Systme d'exploitation - Chapitre 7

3
2.1 Oprations sur la mmoire

Le compactage de la mmoire permet de regrouper les espaces inutiliss. Trs coteuse en temps UC,
cette opration est effectue le moins souvent possible.

S'il y a une requte d'allocation dynamique de mmoire pour un processus, on lui alloue de la place
dans le tas (heap) si le SE le permet, ou bien de la mmoire supplmentaire contigu la partition du
processus (agrandissement de celle-ci). Quand il n'y a plus de place, on dplace un ou plusieurs
processus :

- soit pour rcuprer par ce moyen des espaces inutiliss,
- soit en allant jusqu'au recouvrement. A chaque retour de recouvrement (swap), on rserve
au processus une partition un peu plus grande que ncessaire, utilisable pour l'extension de la
partition du processus venant d'tre charg ou du processus voisin.

Il existe trois faons de mmoriser l'occupation de la mmoire : les tables de bits (bits maps ), les
listes chanes et les subdivisions (buddy ).


2.2 Gestion de la mmoire par table de bits

On divise la MC en units d'allocations de quelques octets quelques Ko. A chaque unit,
correspond un bit de la table de bits : valeur 0 si l'unit est libre, 1 sinon. Cette table est stocke en
MC. Plus la taille moyenne des units est faible, plus la table occupe de place.

A un retour de recouvrement (swap), le gestionnaire doit rechercher suffisamment de 0 conscutifs
dans la table pour que la taille cumule de ces units permette de loger le nouveau processus
implanter en MC, avec le choix entre trois critres possibles :

- la premire zne libre (first fit ) : algorithme rapide
- le meilleur ajustement (best fit ), mais on peut crer ainsi de nombreuses petites units
rsiduelles inutilisables (fragmentation ncessitant un compactage ultrieur)
- le plus grand rsidu (worst fit ), avec le risque de fractionnement regrettable des grandes
units



2.3 Gestion de la mmoire par liste chane

On utilise une liste chane des zones libres en MC. On applique :

- soit l'un des algorithmes prcdents,

- soit un algorithme de placement rapide (quick fit ) : on cre des listes spares pour chacune
des tailles les plus courantes, et la recherche est considrablement acclre.

A l'achvement d'un processus ou son transfert sur disque, il faut du temps (mise jour des liste
chanes) pour examiner si un regroupement avec ses voisins est possible pour viter une
fragmentation excessive de la mmoire.

En rsum, les listes chanes sont une solution plus rapide que la prcdente pour l'allocation, mais
plus lente pour la libration.



2.4 Gestion de la mmoire par subdivisions (ou frres siamois)


Systme d'exploitation - Chapitre 7

4

Cet algorithme propos par Donald KNUTH en 1973 utilise l'existence d'adresses binaires pour
acclrer la fusion des zones libres adjacentes lors de la libration d'units.

Le gestionnaire mmorise une liste de blocs libres dont la taille est une puissance de 2 ( 1, 2, 4, 8
octets, ...., jusqu' la taille maximale de la mmoire).

Par exemple, avec une mmoire de 1 Mo, on a ainsi 251listes. Initialement, la mmoire est vide.
toutes les listes sont vides, sauf la liste 1 Mo qui pointe sur la zone libre de 1 Mo :

1M


Un processus A demande 70 Ko : la mmoire est fragmente en deux compagnons (buddies) de 512
Ko; l'un d'eux est fragment en deux blocs de 256 Ko; l'un d'eux est fragment en deux blocs de 128
Ko et on loge A dans l'un d'eux, puisque 64 <70 <128 :

A 128
256
512


Un processus B demande 35 Ko : l'un des deux blocs de 128 Ko est fragment en deux de 64 Ko et on
loge B dans l'un d'eux puisque 32 <35 <64 :

A
256
512
B 64


Un processus C demande 80 Ko : le bloc de 256 Ko est fragment en deux de 128 Ko et on loge C
dans l'un d'eux puisque 64 <80 <128 :

A
512
B 64 C 128


A s'achve et libre son bloc de 128 Ko. Puis un processus D demande 60 Ko : le bloc libr par A est
fragment en deux de 64 Ko, dont l'un logera D :

512
B 64 C 128
D
64


B s'achve, permettant la reconstitution d'un bloc de 128 Ko :

512
C 128
D
64
128


D s'achve, permettant la reconstitution d'un bloc de 256 Ko , etc...

512
C 128
256


L'allocation et la libration des blocs sont trs simples. Mais un processus de taille 2
n
+1 octets
utilisera un bloc de 2
n+1
octets ! Il y a beaucoup de perte de place en mmoire.


Dans certains systmes, on n'alloue pas une place fixe sur disque aux processus qui sont en mmoire.
On les loge dans un espace de va et vient (swap area ) du disque. Les algorithmes prcdents sont
utiliss pour l'affectation.




Systme d'exploitation - Chapitre 7

5
3. GESTION AVEC RECOUVREMENT AVEC PAGINATION OU
SEGMENTATION


La taille d'un processus doit pouvoir dpasser la taille de la mmoire physique disponible, mme si
l'on enlve tous les autres processus. En 1961, J . FOTHERINGHAM proposa le principe de la
mmoire virtuelle : le SE conserve en mmoire centrale les parties utilises des processus et stocke,
si ncessaire, le reste sur disque. Mmoire virtuelle et multiprogrammation se compltent bien : un
processus en attente d'une ressource n'est plus conserv en MC, si cela s'avre ncessaire.

La mmoire virtuelle fait appel deux mcanismes : segmentation ou pagination. La mmoire est
divise en segments ou pages. Sans recours la mmoire virtuelle, un processus est entirement
charg des adresses contigus ; avec le recours la mmoire virtuelle, un processus peut tre charg
dans des pages ou des segments non contigus.



3.1 La pagination

L'espace d'adressage d'un processus est divis en petites units de taille fixe appeles pages. La MC
est elle aussi dcoupe en units physiques de mme taille appeles cadres. Les changes entre MC et
disques ne portent que sur des pages entires. De ce fait, l'espace d'adressage d'un processus est
potentiellement illimit (limit l'espace mmoire total de la machine). On parle alors d'adressage
virtuel.

Pour un processus, le systme ne chargera que les pages utilises. Mais la demande de pages charger
peut tre plus leve que le nombre de cadres disponibles. Une gestion de l'allocation des cadres libres
est ncessaire.

Dans un SE sans mmoire virtuelle, la machine calcule les adresses physiques en ajoutant le contenu
d'un registre de base aux adresses relatives contenues dans les instructions du processus. Dans un SE
pagination, un sous-ensemble insr entre l'UC et la MC, la MMU (Memory Management Unit ou
unit de gestion de la mmoire) traduit les adresses virtuelles en adresses physiques.

La MMU mmorise :
- les cadres physiques allous des processus (sous forme d'une table de bits de prsence)

- les cadres mmoire allous chaque page d'un processus (sous forme d'une table des pages )

On dira qu'une page est mappe ou charge si elle est physiquement prsente en mmoire.




Systme d'exploitation - Chapitre 7

6
adresses
virtuelles
0-4 K
4-8K
8-12 K
8-12 K 12-16 K
16-20 K
20-24 K
24-28 K
28-32 K
32-36 K
36-40 K
40-44 K
44-48 K
0
1
2
3
4
5
6
7
8
9
10
11
x
x
x
x
0 4
1
5
2 x
3 2
4
8
n page prsence
table des pages
MMU
adresses
physiques
0-4 K
4-8 K
8-12 K
12-16 K
16-20 K
20-24 K
24-28 K
28-32 K
32-36 K



Dans l'exemple prcdent, les pages ont une taille de 4 Ko. L'adresse virtuelle 12292 correspond un
dplacement de 4 octets dans la page virtuelle 3 (car 12292 =12288 +4 et 12288 =12*1024). La
page virtuelle 3 correspond la page physique 2. L'adresse physique correspond donc un
dplacement de 4 octets dans la page physique 2, soit : (8*1024) +4 =8196 .

Par contre, la page virtuelle 2 n'est pas mappe. Une adresse virtuelle comprise entre 8192 et 12287
donnera lieu un dfaut de page. Il y a dfaut de page quand il y a un accs une adresse virtuelle
correspondant une page non mappe. En cas de dfaut de page, un droutement se produit (trap) et
le processeur est rendu au SE. Le systme doit alors effectuer les oprations suivantes :
- dterminer la page charger
- dterminer la page dcharger sur le disque pour librer un cadre
- lire sur le disque la page charger
- modifier la table de bits et la table de pages



3.2 La segmentation

Dans cette solution, l'espace d'adressage d'un processus est divis en segments, gnrs la
compilation. Chaque segment est repr par son numro S et sa longueur variable L. Un segment est
un ensemble d'adresses virtuelles contigus.

Contrairement la pagination, la segmentation est "connue" du processus : une adresse n'est plus
donne de faon absolue par rapport au dbut de l'adressage virtuel; une adresse est donne par un
couple (S , d), o S est le n du segment et d le dplacement dans le segment, d [0 , L [ .

Pour calculer l'adresse physique, on utilise une table des segments :



Systme d'exploitation - Chapitre 7

7
.............
............
table des segments
S
d
B
L p
descripteur de segment


B : adresse de base (adresse physique de dbut du segment)
L : longueur du segment ou limite
p : protection du segment

L'adresse physique correspondant l'adresse virtuelle (S , d) sera donc B +d, si d <=L

La segmentation simplifie la gestion des objets communs (rangs chacun dans un segment),
notamment si leur taille volue dynamiquement.



3.3 La pagination segmente

Lorsque le systme possde beaucoup de pages, la consultation de la table des pages peut tre lente et
inefficace s'il y a beaucoup de pages non charges. On la segmente alors par processus.

Chaque processus possde une table des segments de la table des pages qui le concernent.

Une adresse (P , r) , avec P n logique de page et r dplacement dans la page, est transforme la
compilation en adresse (S , P' , r), avec S n d'un segment et P' .

Exemple :


L'adresse (5 , 100)

est transforme en
(1 , 2 , 100)
table des segments
cadre cherch
table des pages
MC
..........
1 3
.............
0
1
2
3
4
5
4
5
x
2
8
1
2
0 4





Systme d'exploitation - Chapitre 7

8
3.4 La segmentation pagine

La taille d'un segment peut tre importante, d'o un temps de chargement long qui peut en rsulter. La
pagination des segments peut tre une solution.

Une adresse virtuelle (S , d), avec S n de segment et d dplacement dans le segment, est transforme en
(S , P , d' ), o P est un n de page et d' un dplacement dans la page P.

Exemple : avec l'hypothse de pages de 4 Ko, l'adresse logique (2 , 9200) est transforme en
(2 , 2, 1200)

0
1
2
............
200
1000
15700
table des segments
...........
table des pages
(une par segment)
adresse

(2 , 2 , 1200)
0
1
2
limite de segment
cadre dans lequel
on effectuera
le dplacement
de 1200
MC


Dans tous les cas, l'utilisation d'une mmoire associative, stockant des triplets (S, P, adresse de cadre),
gre comme fentre au voisinage du dernier cadre accd, peut acclrer la recherche
des cadres.



4. ALGORITHMES DE REMPLACEMENT DE PAGES

Les mthodes reposent sur 3 stratgies :
- une stratgie de chargement qui choisit les pages charger et l'instant de chargement
- une stratgie de placement qui choisit un cadre libre pour chaque page charger
- une stratgie de remplacement destine librer certains cadres. La recherche se fait soit sur
l'ensemble des pages (recherche globale), soit sur les pages "appartenant" au processus (recherche
locale). Les stratgies de placement sont dpendantes des stratgies de remplacement : on charge
ncessairement une page dans le cadre qui vient d'tre libr.

On peut distinguer deux catgories de mthodes :

- pagination anticipe : on charge les pages l'avance; mais comment prvoir efficacement ?
- pagination la demande : le chargement n'a lieu qu'en cas de dfaut de page et on ne charge
que la page manquante.

On appelle suite de rfrences w =p
1
p
2
... p
n
une suite de numros de pages correspondant des
accs ces pages. On dira qu'un algorithme A de pagination sur m cadres est stable si :
m , w , on a : Cot (A , m , w) <= Cot ( A , m+1 , w)

Cette notion est importante pour viter l'croulement du SE (thrashing) par une gnration excessive de
dfauts de pages.


Systme d'exploitation - Chapitre 7

9


4.1 Remplacement de page optimal

Le SE indexe chaque page par le nombre d'instructions qui seront excutes avant qu'elle ne soit
rfrence. En cas de ncessit, le SE retire la page d'indice le plus lev, c'est dire la page qui sera
rfrence dans le futur le plus lointain.

Cet algorithme est pratiquement impossible appliquer (comment calculer les indices des pages ?).
Toutefois, avec un simulateur, on peut valuer les performances de cet algorithme et s'en servir
comme rfrence pour les suivants. En outre, cet algorithme est stable.


4.2 NRU (not recently used)

Le SE rfrence chaque page par deux bits R (le plus gauche) et M initialiss 0. A chaque accs
en lecture une page, R est mis 1. A chaque accs en criture, M est mis 1. A chaque
interruption d'horloge, le SE remet R 0.

Les bits R-M forment le code d'un index de valeur 0 3 en base 10. En cas de dfaut de page, on
retire une page au hasard dans la catgorie non vide de plus petit index. On retire donc
prfrentiellement une page modifie non rfrence (index 1) qu'une page trs utilise en
consultation (index 2). Cet algorithme est assez efficace.


4.3 FIFO ( first in, first out)

Le SE indexe chaque page par sa date de chargement et constitue une liste chane, la premire page
de la liste tant la plus ancienne ment charge et la dernire la plus rcemment charge. Le SE
replacera en cas de ncessit la page en tte de la liste et chargera la nouvelle page en fin de liste.

Deux critiques cet algorithme :
- ce n'est pas parce qu'une page est la plus ancienne en mmoire qu'elle est celle dont on se sert
le moins
- l'algorithme n'est pas stable : quand le nombre de cadres augmente, le nombre de dfauts de
pages ne diminue pas ncessairement ( on parle de l'anomalie de BELADY : L.A. BELADY a
propos en 1969 un exemple 4 cadres montrant qu'on avait plus de dfaut de pages qu'avec 3).

Amlioration 1 : le SE examine les bits R et M (grs comme ci-dessus en 4.2) de la page la plus
ancienne en MC (en tte de la liste). Si cette page est de catgorie 0, il l'te. Sinon, il teste la page un
peu moins ancienne, etc... S'il n'y a aucune page de catgorie 0, il recommence avec la catgorie 1,
puis ventuellement avec les catgories 2 et 3.

Amlioration 2 : Algorithme de la seconde chance : R et M sont grs comme ci-dessus en 4.2. Le
SE examine le bit R de la page la plus ancienne (tte de la liste). Si R =0, la page est remplace, sinon
R est mis 0, la page est place en fin de liste et on recommence avec la nouvelle page en tte. Si
toutes les pages ont t rfrences depuis la dernire RAZ, on revient FIFO, mais avec un surcot.





Systme d'exploitation - Chapitre 7

10
4.4 LRU (least recently used)

En cas de ncessit, le SE retire la page la moins rcemment rfrence. Pour cela, il indexe chaque
page par le temps coul depuis sa dernire rfrence et il constitue une liste chane des pages par
ordre dcroissant de temps depuis la dernire rfrence.

L'algorithme est stable. Mais il ncessite une gestion coteuse de la liste qui est modifie chaque
accs une page.

Variantes :
NFU (not frequently used) ou LFU (least frequently used) : le SE gre pour chaque page un
compteur de nombre de rfrences . Il cumule dans ce compteur le bit R juste avant chaque RAZ de
R au top d'horloge. Il remplacera la page qui aura la plus petite valeur de compteur.

Vieillisement (aging) ou NFU modifi : avant chaque RAZ de R, le SE dcale le compteur de 1
bit droite (division entire par 2) et additionne R au bit de poids fort. En cas de ncessit, on tera la
page de compteur le plus petit. Mais en cas d'galit des compteurs, on ne sait pas quelle est la page la
moins rcemment utilise.

Matrice : s'il y a N pages, le SE gre une matrice (N , N+1). A chaque rfrence la page p, le
SE positionne 1 tous les bits de la ligne p et 0 tous les bits de la colonne p. En outre, le 1er bit de
la ligne p vaut 0 si la page est charge, 1 sinon. On tera la page dont la ligne a la plus petite valeur.


4.5 Amliorations

Le drobeur de pages : ds qu'un seuil minimal de cadres libres est atteint, le SE rveille un
drobeur de pages . Celui-ci supprime les pages les moins rcemment utilises, par algorithme
d'aging, et les range dans la liste des cadres libres, ceci jusqu' un seuil donn. Le SE vrifie qu'une
page rfrence sur dfaut de page n'est pas dans la liste.

Problmes d'entre/sortie : on a intrt, soit verrouiller les pages concernes par les E/S pour
viter de les ter, soit effectuer les E/S dans des tampons du noyau et copier les donnes plus tard
dans les pages des utilisateurs.

Pages partages : lorsque plusieurs processus excutent le mme ensemble de code, on a intrt
utiliser des pages de code partages, plutt que des pages dupliques. Mais on aura prvoir une
gestion spcifique des pages partages pour viter des dfauts de pages artificiels.


4.6 Taille optimale des pages

Soit t la taille moyenne des processus et p (en octets) la taille d'une page. Soit e (en octets) la taille de
l'entre de chaque page dans la table des processus. Le nombre moyen de pages par processus est t/p.
Ces pages occupent t*e/p octets dans la table des processus. La mmoire perdue en moyenne dans la
dernire page d'un processus est p/2 (fragmentation interne). La perte totale q est donc :
q =t*e/p +p/2

q est minimal si : dq/dp =0, c'est dire : p =(2 t*e)
0.5

Exemple : t =64 Ko, e =8 octets, donc p =1 Ko
Les valeurs courantes sont 1/2 Ko, 1 Ko, 2 Ko ou 4 Ko





Systme d'exploitation - Chapitre 7

11
4.7 Le modle du Working Set

Le modle working-set de comportement d'un programme est une tentative propose par P.J .
DENNING en 1968 pour comprendre les performances d'un systme pagin en multi-programmation.
Il s'agit de raisonner non pas en terme de processus isols, mais d'effet des autres processus prsents
sur chacun d'eux, de corrler allocation de mmoire et allocation du processeur.

Dans le cas d'un systme mono-processeur, lorsque le degr de multi-programmation augmente
(nombre de processus prsents en mmoire), l'utilisation du processeur augmente : en effet,
l'ordonnanceur a toutes les chances de trouver chaque instant un processus exploiter.

Toutefois, si le degr de multi-programmation franchit un certain seuil, il en rsulte une forte
croissance du trafic de pagination entre disques et mmoire centrale, accompagne d'une diminution
brusque de l'utilisation du processeur. Le haut degr de multi-programmation empche chaque
processus de garder suffisamment de pages en mmoire pour viter un grand nombre de dfauts de
pages. Le canal de liaison avec le disque arrive saturation et beaucoup de processus sont bloqus par
attente de transfert de pages. On parle de thrashing (dconfiture) du processeur.

En d'autres termes, chaque processus exige un nombre minimal de pages prsentes en mmoire
centrale (appel son working-set) pour pouvoir rellement utiliser le processeur. Le degr de multi-
programmation doit tre tel que le working-set de tous les processus prsents en mmoire doit tre
respect.

Conceptuellement, on peut dfinir le working-set un instant t :

w (t , h) ={ ensemble des pages apparaissant dans les h dernires rfrences }

DENNING a montr que w(h) avait un graphe tel que celui-ci :
w (h)
h h0


Plus h crot, moins on trouve de pages en excdent dans le working-set. Cela permet d'tablir une
valeur raisonnable de h (h
0
) tel qu'une valeur de h suprieure h
0
n'accrotrait pas beaucoup le
working-set.



5. PARTAGE DE CODE ET DONNEES EN MEMOIRE CENTRALE

Des procdures peuvent tre partages entre plusieurs processus. On a intrt ce qu'il n'y ait qu'une
copie du code qui sera excute par chaque processus avec ses propres donnes.

Par exemple deux processus P1 et P2 sont susceptibles d'utiliser une procdure R. On ne peut pas
prvoir l'ordre dans lequel ils vont entrer dans R ou sortir de R. Si l'un des deux processus est
dsallou pendant qu'il excute R et qu'il voit ses variables locales modifies par l'excution de R par
l'autre processus, alors on dit que R n'est pas r-entrante.


Systme d'exploitation - Chapitre 7

12


5.1 Cas de la pagination

Le partage du code et des donnes se fait par un double rfrencement aux pages contenant les
informations communes.

5.1.1 Partage du code

Chaque fois qu'un processus fait rfrence son propre code, il utilise un numro de page fixe qui le
fait accder toujours la mme page virtuelle. Donc, si un processus partage son code, il va toujours
rfrencer la mme page virtuelle, quelle que soit la table des pages utilise. Chaque tche doit donc
mettre le code excutable de ce processus la mme adresse virtuelle.

5.1.2 Partage de donnes

Pour partager des donnes, la zone commune peut tre des endroits diffrents dans la table des pages
de chacune des tches. Soit une page commune P contenant un pointeur q :
- si D pointe sur une adresse dans P, le numro de cette page doit tre le mme dans tous les
processus
- si l'objet point n'est pas dans P, alors il doit avoir la mme adresse virtuelle dans tous les
processus


5.1.3 Solution habituelle




processus 1
processus 2
codes partags donnes partages
adresse de dbut de la z ne
de codes partags
adresse de dbut de la z ne
de donnes partages
adresses virtuelles
non valides




5.2 Cas de la segmentation

Pour que deux processus rfrencent une partie commune, il suffit que cette partie se trouve dans un
segment qui possde le mme descripteur dans la table des segments de chacun des processus.



6. EXEMPLE : GESTION DE LA MEMOIRE PAR WINDOWS NT



Systme d'exploitation - Chapitre 7

13
Avec les adresses exprimes sur 32 bits, WINDOWS NT offre chaque processus 2
32
octets =4 Go
de mmoire virtuelle : 2 Go pour le SE (threads en mode noyau) et 2 Go pour les programmes
(threads en mode utilisateur et en mode noyau) pagins en pages de 4 Ko.

WINDOWS NT protge sa mmoire grce aux mcanismes suivants :

- espace d'adressage virtuel diffrent pour chaque processus

- fonctionnement en mode noyau pour l'accs au code et aux donnes du systme



6.1 Le gestionnaire de la mmoire virtuelle

Il optimise l'utilisation de la mmoire selon plusieurs techniques :

- valuation diffre : plusieurs processus peuvent accder aux mmes donnes en lecture, sans
les dupliquer. Si l'un des processus veut modifier des donnes, la page physique est recopie ailleurs
dans la mmoire; l'espace d'adressage virtuel du processus est mis jour

- protection de mmoire par page : chaque page contient le mode d'accs autoris en mode
noyau et en mode utilisateur (lecture, lecture/criture, excution, pas d'accs, copie l'criture, page
de garde)

Le gestionnaire de la mmoire virtuelle fournit des services natifs aux processus :

- lecture/criture en mmoire virtuelle

- blocage des pages virtuelles en mmoire physique

- protection des pages virtuelles

- dplacement des pages virtuelles sur disque

- allocation de la mmoire en deux phases : rservation (ensemble d'adresses rserves pour un
processus) et engagement (mmoire retenue dans le fichier d'change avec le disque du gestionnaire
de la mmoire virtuelle)

Le gestionnaire de pages utilise des techniques classiques :

- pagination la demande : la suite d'un dfaut de pages, on charge les pages requises plus
quelques pages voisines

- placement des pages virtuelles en mmoire : la premire page physique disponible

- remplacement selon la stratgie FIFO d'une page virtuelle d'un processus, suite un dfaut de
page

- table des pages deux niveaux

En outre, lorsqu'une page est requise suite un dfaut de page, et qu'elle est non utilise, un
indicateur de transition permet de dceler si elle peut devenir utilisable sans la faire transiter par le
disque.




Systme d'exploitation - Chapitre 7

14
Toute page physique peut prendre l'un des 6 tats suivants utiliss dans la base de donnes des pages
physiques :

- valide : page utilise par un processus

- zro : libre et initialise avec des 0 pour des raisons de scurit ("niveau C2")

- modifie : son contenu a t modifi et n'a pas encore t recopi sur disque

- mauvais : elle a gnr des erreurs au contrle

- en attente : retire d'un ensemble de pages de travail


Le gestionnaire des pages tant rentrant, il utilise un verrou unique pour protger la base de donnes
des pages physiques et n'en autoriser l'accs qu' une tche (thread) simultane.


6.2 La mmoire partage

Dfinition : c'est de la mmoire visible par plusieurs processus ou prsente dans plusieurs espaces
d'adressage virtuels

WINDOWS NT utilise des objets-sections pour utiliser des vues de fentres de la zone de mmoire
partage partir de diffrents processus. La mmoire partage est gnralement pagine sur disque.




Systme d'exploitation - Chapitre 7

15

EXERCICES

1. On considre la table de segments suivante :

segment base longueur
_________________________
0 540 234
1 1254 128
2 54 328
3 2048 1024
4 976 200

Reprsenter la mmoire. Calculer les adresses physiques correspondant :
(0 , 128) , (1, 99) , (4 , 100) , (3 , 888) , (2 , 465) , (4 , 344)

2. Dans un systme pagination de 100 octets, donner la suite des pages correspondant aux
adresses suivantes : 34 , 145 , 10 , 236, 510, 412, 789
Proposer une formule de calcul.


3. Pourquoi combine-t-on parfois pagination et segmentation ? Dcrire un mcanisme d'adressage
o la table des segments et les segments sont pagins.

Soit un processus dont la table des segments est :

segment base longueur
_________________________
0 540 234
1 1254 128
2 54 328

La taille de page est 100 octets et les cadres sont allous dans l'ordre suivant :
3, 4, 9, 0, 8, 7, 6, 11, 15, 5, 17

Reprsenter graphiquement la nouvelle table des segments et la mmoire (le processus tant
entirement charg).
Traduire les adresses suivantes : (0 , 132) , (2 , 23) , (2 , 301)

4. Soit une machine 3 pages dans laquelle le temps de traitement d'un dfaut de page est 1 ms s'il
n'y a pas de recopie, 3 ms s'il y a recopie. Le processus en cours effectue 5 ms de calcul entre
deux rfrencements de page. Les bits R et M sont remis 0 toutes les 25 ms de calcul, mais le
traitement d'un dfaut de page suspend l'horloge.
L'astrisque dsignant un accs en criture, w =0 2* 4 1* 2 3* 0 4* 2* 4 3* 4* 5 3* 2, calculer
le temps total d'excution du processus avec les algorithmes :
- FIFO seconde chance,
- NFU avec un compteur sur 4 bits

Comparer avec le remplacement optimal.


5. Soit le programme C :
int A [1000], B [1000], C [1000], i;
main ()
{
for i =0; i <1000; i++) C [i] =A [i] +B [i] ;


Systme d'exploitation - Chapitre 7

16
}

La MC est de 2 K mots et un entier occupe un mot. Le code du programme et la variable i
occupent 256 mots.
Calculer le nombre et le taux (nombre de dfauts de pages/nombre de rfrencements) des
dfauts de pages lorsque :

- une page =128 mots, taille de la zone de donnes =3 pages
- une page =128 mots, taille de la zone de donnes =6 pages
- une page =256 mots, taille de la zone de donnes =6 pages

pour les algorithmes FIFO, LRU et remplacement optimal.


Systme d'exploitation - chapitre 8
1
Chapitre 8 SYSTEME DE FICHIERS



1. CONCEPTION D'UN SYSTEME DE FICHIERS

1.1 Fichiers

Un fichier est vu comme une suite d'articles ou d'enregistrements logiques d'un type donn qui ne
peuvent tre manipuls qu'au travers d'oprations spcifiques. L'utilisateur n'est pas concern par
l'implantation des enregistrements, ni par la faon dont sont ralises les oprations. Gnralement,
elles sont traduites par le SE en oprations lmentaires sur les mmoires.

On dispose gnralement des oprations suivantes :

fichiers : crer, ouvrir, fermer, dtruire, pointer au dbut, renommer, copier dans un autre
fichier, diter le contenu

articles : lire, crire, modifier, insrer, dtruire, retrouver

Dfinition : un systme de fichiers (SGF) est l'entit regroupant les fichiers mmoriss sur disque. Il
contient les donnes des fichiers et un ensemble d'informations techniques.

Exemple : le SGF d'UNIX. Ses principales caractristiques sont les suivantes :

- aucune structure interne : les fichiers sont de simples suites d'octets dont chacun peut
tre adress individuellement. L'enregistrement logique a la taille d'un octet

- l'expansion des fichiers est dynamique

- les rpertoires forment une structure hirarchique

- l'utilisation est commune pour les fichiers de donnes et les fichiers spciaux

Le superbloc d'UNIX contient notamment les informations suivantes :

- taille du systme de fichier
- nombre de blocs libres
- pointeur sur le premier bloc libre dans la liste des blocs libres
- taille de la liste des i-nodes
- nombre et liste des i-nodes libres

UNIX utilise une technique de zones tampons en MC afin d'optimiser l'utilisation du disque. Une
partie du superbloc et de la table des i-nodes est charge en MC lors de l'excution de la commande
mount. Toute opration d'E/S se fera travers ces tables afin d'optimiser l'utilisation du disque.
Lorsqu'un programme met jour des informations d'un fichier, cela se fait travers les zones tampons
de la MC. Rgulirement, ces zones sont recopies sur disque. Les zones concernes du superbloc
sont mises jour. cette situation est critique car la version du superbloc en MC et celle sur disque
peuvent tre diffrentes jusqu' recopie sur disque de la partie du superbloc qui est en MC.





Systme d'exploitation - chapitre 8
2
1.2 Organisation de l'espace disque

Il existe deux stratgies pour stocker un fichier de n octets sur disque :

- allouer des secteurs contigus totalisant une capacit d'au-moins n octets. Avec deux
inconvnients :
- le dernier secteur a toutes chances d'tre sous-utilis et ainsi, on gaspille de la place.
Le pourcentage de place perdue est d'autant plus grand que la taille moyenne des fichiers est faible, ce
qui est la ralit

- si le fichier est agrandi, il faudra dplacer le fichier pour trouver un nouvel
ensemble de secteurs conscutifs de taille suffisante

- diviser le fichier en blocs de taille fixe, inscables, que le SE alloue de faon non
ncessairement contigu des secteurs.

Un bloc est dfini comme une zone de mmoire secondaire contenant la quantit d'information qui
peut tre lue ou crite par un priphrique en une seule opration. La taille d'un bloc est donc attache
un priphrique d'E/S et fixe par le matriel. Cependant, si le SE n'a pas le choix de la taille d'un
bloc, il peut grouper plusieurs article dans un mme bloc (packing).

Pour des blocs de taille < 1 Ko, le taux de remplissage du disque est excellent, mais la vitesse de
transfert des donnes est modeste (dlai de rotation du disque et de recherche importants par rapport
au temps de transfert lui-mme). Au-del de 1 Ko, le taux de remplissage se dgrade, mais la vitesse
de transfert s'amliore.



1.3 Gestion des blocs libres

Ds qu'on a choisi une taille de blocs (souvent 1/2 Ko 2 Ko), on doit trouver un moyen de
mmoriser les blocs libres. Les deux techniques les plus rpandues sont les suivantes :

- table de bits : on gre une table comportant autant de bits que de blocs sur le disque. A
chaque bloc du disque, correspond un bit dans la table, positionn 1 si le bloc est occup, 0 si le
bloc est libre (ou vice versa). Par exemple, un disque de 300 Mo, organis en blocs de 1 Ko, sera gr
par une table de 300 Kbits qui occupera 38 des 307.200 blocs

- liste chane de n des blocs : par exemple, un disque de 300 Mo, organis en blocs de
1 Ko : supposons que chaque bloc soit adress par 4 octets. Chaque bloc de la liste pourra contenir
255 adresses de blocs libres. La liste comprendra donc au plus 307.200/255 =1205 blocs. Cette
solution mobilise beaucoup plus de place que la prcdente.



Systme d'exploitation - chapitre 8
3
0
1
2
3
4
5
254
255
42
136
2541
5478
14
25897
58
1 Ko


On peut imaginer deux variantes de cette dernire solution :

- une liste chane de blocs : chaque bloc libre pointe sur le bloc libre suivant

- une liste chane de znes libres : chaque bloc de dbut d'une srie de blocs libres (zone
libre) contient la taille de la zone et pointe sur le premier bloc de la zone libre suivante.



1.4 Allocation de blocs pour le stockage des fichiers

Quatre mthodes sont utilises selon les SE :

- allocation contigu : on retrouve les solutions utilises pour l'allocation de mmoire
(algorithmes de la premire zone libre, algorithme du meilleur ajustement, algorithme du meilleur
rsidu). L'implantation physique est proche de la vision logique. On limite galement les
dplacements de la tte le lecture/criture, coteux en temps. Toutefois, il y a deux inconvnients :
- le risque d'absence d'une zone libre de taille suffisante,
- le dplacement possible du fichier, lorsqu'il s'agrandit, vers une zone libre de taille
suffisante.

- allocation non contigu chane : chaque bloc du fichier contient un pointeur sur le
bloc suivant. Lorsque le fichier change de taille, la gestion des blocs occups est simple. Il n'y a
aucune limitation de taille, si ce n'est l'espace disque lui-mme. Deux inconvnients toutefois :

- la perte d'un pointeur entrane la perte de toute la fin du fichier ou bien il faut un double
chanage par scurit

- le mode d'accs est totalement squentiel


- allocation non contigu indexe : on peut envisager 3 solutions :

- une table globale d'index : elle vite la dispersion des pointeurs en rassemblant la
liste des numros de blocs utiliss par tous les fichiers. Cette table occupe beaucoup de place .

- une liste chane : dans le SE, donne la liste des blocs utiliss par les fichiers



Systme d'exploitation - chapitre 8
4
- une table locale d'index : une table, en dbut de chaque fichier, contient l'ensemble
des blocs utiliss. Il est donc ais d'effectuer un accs direct un bloc d'un fichier, ou de faire voluer
dynamiquement la taille d'un fichier. Quand cette table est petite, elle est stocke dans un bloc spcial
ou bloc d'index. La taille des blocs d'index est une question difficile : s'ils sont trop petits, ils
limiteront fortement la taille d'un fichier; s'ils sont trop grands, une grande partie de leur contenu est
inutilise ("fragmentation interne").


- allocation non contigu mixte : on peut amliorer la solution prcdente en utilisant
plusieurs niveaux de tables d'index. Citons par exemple la mthode utilise par UNIX :

- chaque fichier se voit affecter une table 13 entres
- les entres 0 9 pointent sur un bloc de donnes
- l'entre 10 pointe sur un bloc d'index qui contient 128 ou 256 pointeurs sur bloc de
donnes (simple indirection)
- l'entre 11 pointe sur un bloc d'index qui contient 128 ou 256 pointeurs sur bloc d'index
dont chacun contient 128 ou 256 pointeurs sur bloc de donnes (double indirection)
- l'entre 12 pointe sur un bloc d'index qui contient 128 ou 256 pointeurs sur bloc d'index
dont chacun contient 128 ou 256 pointeurs sur bloc d'index dont chacun contient 128 ou 256
pointeurs sur bloc de donnes (triple indirection)



0
1
2
3
4
5
6
7
8
9
10
11
12
10 blocs
de donnes
128 blocs
de donnes
128 blocs
de donnes
128 blocs
de donnes
128 blocs
de pointeurs
sur blocs
128 blocs
de donnes
128 blocs
de donnes
128 blocs
de pointeurs
sur blocs
128
pointeurs






Systme d'exploitation - chapitre 8
5
Pour les fichiers les plus longs, trois accs au disque suffisent pour connatre l'adresse de tout octet du
fichier. Avec des blocs de 2 Ko, on peut aller jusqu' 128 Go par fichier, mais UNIX limite la taille
16 Go.



2. CORRESPONDANCE FICHIERS LOGIQUES-FICHIERS
PHYSIQUES

Un rpertoire est une table ou une liste chane dans laquelle le systme range, pour chaque fichier :
- les informations ncessaires son exploitation : droits, nom, dates, etc...
- les informations sur son implantation : taille, adresse de la table des index ou du premier bloc
ou ...

Il existe diverses solutions d'implmentation d'un rpertoire :

- rpertoire un niveau : la table est gre comme une liste. C'est une solution acceptable
pour un SE mono-utilisateur, trop contraignant pour un SE multi-utilisateur (deux fichiers ne peuvent
porter le mme nom)

- rpertoire deux niveaux : chaque utilisateur possde son propre rpertoire et il existe un
rpertoire de niveau suprieur qui associe un nom d'utilisateur l'adresse de son rpertoire.
Inconvnient : l'utilisation d'un fichier partag (exemple : fichier de commande) ncessite
soit sa recopie dans le rpertoire de chacun de ses utilisateurs, soit l'nonc de son chemin complet.
Une autre solution est utilise pour les fichiers systme : on cre un utilisateur fictif qui contient tous
les fichiers systme, voire d'autres fichiers partags. Quand un fichier est indiqu par un utilisateur,
s'il n'existe pas dans son rpertoire, le SE le cherche dans le rpertoire fictif.


- rpertoire structure d'arbre : c'est le cas par exemple d'UNIX : cf. schma page suivante


- rpertoire structure de graphe sans cycle : un fichier peut tre dans les sous-arbres de
plusieurs utilisateurs. Si un utilisateur le met jour, il est modifi pour tous les autres. Un tel fichier
possde plusieurs chemins d'accs, d'o un algorithme compliqu pour l'effacer. Au total, un
rpertoire peut contenir un pointeur sur un fichier ou un rpertoire qui n'est pas dans le sous-arbre
dont il est racine.




Systme d'exploitation - chapitre 8
6
1
1
4
7
14
9
6
8
.
..
bin
dev
lib
etc
usr
tmp
mode
taille
dates
........
132
superbloc i-node 6
6
1
147
.
..
pierre
bloc 132
mode
taille
dates
mode
taille
dates
392
.........
i-node 147
147
bloc 392
6
..
.
30
28
160
yves
jean
cathy
66
202
684
courrier
tp
notes
recherche de /usr/pierre/ courrier
0
1
2
3
4
5
6
7
8
9
10
11
12
10 blocs
de donnes
128 blocs
de donnes
128 blocs
de donnes
128 blocs
de donnes
128 blocs
de pointeurs
sur blocs
128 blocs
de donnes
128 blocs
de donnes
128 blocs
de pointeurs
sur blocs
128
pointeurs

i-node 202
mode
taille
dates









Systme d'exploitation - chapitre 8
7
3. COHERENCE D'UN SYSTEME DE FICHIERS

3.1 Cohrence au niveau des blocs

En parcourant la liste des blocs libres, on les note dans le tableau LIBRE. En parcourant tous les blocs
d'information, on note les blocs utiliss dans le tableau UTILISE.

Si LIBRE [i] >1, on supprime une des rfrences au bloc i dans LIBRE
Si LIBRE [i] >0 et UTILISE [i] >0, on supprime la rfrence au bloc i dans LIBRE
Si UTILISE [i] >1, on duplique le bloc i et on l'insre dans un des fichiers qui le rfrencient


3.2 Cohrence au niveau des fichiers

En parcourant tous les rpertoires, on note pour chaque i-node le nombre d'entres (n) qui pointent sur
ce nud.

Si n =0, le fichier est mis dans un rpertoire spcial (LOST+FOUND)

Si n =nombre L de liens dclars dans l'i-node, c'est correct



Systme d'exploitation - chapitre 9

1
Chapitre 9 LES INTERRUPTIONS




1. DEFINITIONS ET GENERALITES

Comment prendre en compte un vnement, comment provoquer une rupture de squence
d'excution d'un processus dans un dlai trs court ? Une solution : les interruptions.


1.1 Dfinitions

Def: Une interruption est un signal dclench par un vnement interne la machine ou externe,
provoquant l'arrt d'un programme en cours d'excution la fin de l'opration courante, au profit
d'un programme plus prioritaire appel programme d'interruption. Ensuite, le programme
interrompu reprend son excution l'endroit o il avait t interrompu.

Le systme d'interruption est le dispositif incorpor au squenceur qui dtecte les signaux
d'interruption. Ces signaux arrivent de faon asynchrone, n'importe quel moment, mais ils ne sont
pris en compte qu' la fin de l'opration en cours.

Mcanisme gnral : Lorsqu'une interruption survient, le processeur achve l'excution de
l'instruction en cours pour les interruptions externes (cf. plus loin), puis il se produit :

1 Sauvegarde du contexte dans une pile :
- adresse de la prochaine instruction excuter dans le programme interrompu,
- contenu des registres qui seront modifis par le programme d'interruption,
- contenu du mot d'tat (registre de drapeaux) rassemblant les indicateurs
( tout cela forme le contexte sauvegard)

2 Chargement du contexte du programme d'interruption (contexte actif) et passage en mode
systme (ou superviseur)

3 Excution du programme d'interruption

4 Retour au programme interrompu en restaurant le contexte (commande Assembleur IRET) et
en repassant en mode utilisateur.


1.2 Diffrents types d'interruptions

Les interruptions ne jouent pas seulement un rle important dans le domaine logiciel, mais aussi
pour l'exploitation de l'lectronique.

On distingue donc :

interruptions internes : protection du systme et des processus, appeles par une
instruction l'intrieur d'un programme (overflow, erreur d'adressage, code opration inexistant,
problme de parit) (hardware internes)



Systme d'exploitation - chapitre 9

2
interruptions logiques :permet un processus utilisateur de faire un appel au systme
(software)

interruptions matrielles dclenches par une unit lectronique (lecteur, clavier, canal,
contrleur de priphrique, panne de courant,....) ou par l'horloge (hardware externes)


1.3 Les priorits

A chaque interruption, est associe une priorit (systme d'interruptions hirarchises) qui permet
de regrouper les interruptions en classes. Chaque classe est caractrise par un degr d'urgence
d'excution de son programme d'interruption.

Rgle : Une interruption de priorit j est plus prioritaire qu'une interruption de niveau i si j >i.



L'intrt de ce systme est la solution de problmes tels que :
arrive de plusieurs signaux d'interruption pendant l'excution d'une instruction,

arrive d'un signal d'interruption pendant l'excution du signal de traitement d'une
interruption prcdente.


On peut utiliser un contrleur d'interruptions pour regrouper les fils d'interruptions, grer les
priorits entre les interruptions et donner les lments de calcul d'adresse au processeur.


1.4 Masquage des interruptions

Certaines interruptions prsentent tellement d'importance qu'il ne doit pas tre possible
d'interrompre leur traitement. On masquera alors les autres interruptions pour empcher leur prise
en compte. Certaines interruptions sont non-masquables : on les prend obligatoirement en compte.
Une interruption masque n'est pas ignore : elle est prise en compte ds qu'elle est dmasque.

Au contraire, une interruption peut-tre dsarme : elle sera ignore. Par dfaut, les interruptions
sont videmment armes.


Systme d'exploitation - chapitre 9

3
1
interruption
OU
1
Registre d'interruption
Le bit correspondant un e interruption masque es t 1 dans
le registre d'interruptio n : sortie de OU 1, don c masquage
Si le bit est 0, pas de masquage.




2. INTERRUPTIONS VECTORISEES

Prenons l'exemple du microprocesseur 80386. Il peut comporter 256 interruptions numrotes de 0
255. Le lien entre chaque interruption et son programme est ralis par une table ou vecteur
d'interruptions.




Chaque lment contient l'adresse de dbut d'un programme d'interruption sur 4 octets (offset 2
octets, segment 2 octets). La taille de la table est donc de 4 x 256 =1 Ko. Elle occupe les adresses
0h 3FFh en mmoire centrale.



3. LES INTERRUPTIONS MATERIELLES : exemple du Intel 80386
et de ses successeurs

Elles sont dclenches par une unit lectronique. Par exemple, chaque fois qu'on presse ou relve
une touche du clavier, l'IT clavier est dclenche. Le programme d'interruption place le caractre
entr dans le buffer la suite des caractres entrs auparavant. Si le buffer est plein, il dclenche un
bip ou une action convenue.


Systme d'exploitation - chapitre 9

4

Les interruptions peuvent tre masques (exemple : clavier) grce l'instruction Assembleur CLI
(CLear Interrupt flag) ou grce la fonction TURBO-C disable (). Ainsi, aprs CLI ou disable
(), aucun caractre ne peut tre entr au clavier. Le flag IF (flag correspondant du registre d'tat)
est positionn 0.

De mme, l'instruction Assembleur STI (SeT Interrupt flag) ou la fonction TURBO-C enable ()
dmasque les interruptions en positionant le flag IF 1.

La commande Assembleur NMI (No Mask Interrupt) permet de rendre une interruption non
masquable. Les interruptions qui ne peuvent tre masquables sont toujours excutables, mme
aprs CLI ou disable ().

Dans le contexte Intel, les interruptions sont gres par un contrleur d'interruptions (circuit
intgr 8259 ou circuit inclus dans le microprocesseur lui-mme).Ce composant intercepte toutes
les demandes d'interruption des priphriques et les communique l'U.C. selon leurs priorits



INTR
INTA
D15
D0
80386
Bus
....
16 broches
Contrleur d'interruption s
.....
7 0
8 broches pour recevoir
les codes de 256 interrup tions



INTR : interrupt request : le processeur est inform par le contrleur de l'arrive d'une demande
d'IT

INTA : interrupt acknowledgement : le processeur a bien reu par le bus de donnes le n d'IT
envoy par le contrleur. Le mcanisme dtaill de traitement d'une interruption non masque est le
suivant :

- l'U.C. termine l'excution de l'instruction en cours

- elle lit sur le bus le numro de l'interruption.

- elle sauvegarde le mot d'tat dans la pile et l'adresse de retour CS : IP (adresse de
l'instruction suivante)

- elle lit dans la table d'interruption l'adresse :
[ 4 * n d'IT ] (mode calcul indirect)
Ainsi, l'adresse [4*nd'IT +2] dans la table, elle trouve la partie segment CS de
l'adresse du programme d'interruption et l'adresse [4* n d'IT] la partie offset de cette adresse.

- elle met jour le compteur ordinal avec CS:IP



Systme d'exploitation - chapitre 9

5
- elle excute le programme s'achevant par IRET

Le ROM BIOS (Read Only Memory Input/Output System) et le DOS reprsentent le noyau du systme
d'un micro-ordinateur. Les routines du ROM BIOS permettent essentiellement le traitement des
oprations d'entre/sortie et d'interface avec les priphriques.

Citons notamment les principales interruptions du ROM BIOS :

IT 8 : tic horloge (timer) appel toutes les 55 ms (18,2 fois/s.). Elle sert par exemple arrter
le moteur de l'unit de disquette lorsque aucun accs la disquette n'est excut. Cette interruption
08H, aprs avoir lanc le programme correspondant, appelle l'interruption 1CH. Cette dernire ne
contient qu'un retour IRET afin de permettre aux programmeurs d'implanter leurs propres
programmes d'interruption (objectifs : programmation concurrente, multitche,....)

IT 10h 12h : variable selon le matriel connect. Souvent, IT 10 dsigne l'IT vido IT 11
fournit la liste du matriel disponible et IT 12 le calcul de l'espace mmoire disponible
IT 13h : gestion des disques
IT 14h : gestion de la porte srie
IT 15h : gestion d'un lecteur de cassettes
IT 16h : gestion du clavier
IT 17h : imprimante
IT 18h : activation du ROM BIOS
IT 19h : reset du systme
IT 1Ah : gestion de la date et de l'heure

Les IT de 0 7 sont appeles directement par l'U.C. du microprocesseur . Il s'agit de :

IT 0 : division par 0
IT 1 : pas pas
IT 2 : circuit RAM dfectueux
IT 3 : point d'arrt
IT 4 : dbordement
IT 5 : copie d'cran
IT 6 et 7 : inutilises

Les routines associes au DOS travaillent un niveau suprieur. Elles peuvent parfois faire appel des
routines du ROM BIOS. Les principales interruptions associes au DOS sont :

IT 20h : fin normale d'un programme
IT 21h : appel de sous-routines systme
IT 22h : gestion de l'adresse de saut aprs l'excution d'un programme
Elle ne peut tre active directement. Elle prcise la routine qui reprend le contrle aprs
la fin du programme
IT 23h : gestion de l'adresse de saut aprs un control-break. Idem ci-dessus.
IT 24h : gestion de l'adresse de saut en cas d'erreur
IT 25h : lecture directe sur disque
IT 26h : criture directe sur disque
IT 27h : programme rsident (terminer un programme en le laissant rsident). Un programme
est dit rsident si , une fois son excution termine, il rend le contrle l'environnement appelant
mais reste charg en mmoire. Il pourra alors tre ractiv tout moment , notamment l'aide d'une
IT. La fonction de Turbo-C void keep (int retour, in taille) , prototype dans dos.h, suspend le
programme en cours d'excution, le rend rsident. taille dsigne sa taille qui peut tre dtermine
par un appel MK_FP et code dsigne le code retourn l'environnement par ce programme.




Systme d'exploitation - chapitre 9

6

4. ACTIVATION D'INTERRUPTIONS A PARTIR D'UN PROGRAMME
C

Fonction int86 (int num, union REGS * r_in, union REGS * r_out) : gnre l'interruption num
en fonction des contenus des registres passes en paramtres via r_in . La structure union REGS
est dfinie dans dos.h

Fonction int86x (int num, union REGS * r_in, union REGS * r_out, union REGS * r_seg) :
utilise lorsque l'IT ncessite pour son traitement des znes de mmoire. Pour cela, les registres
d'adressage de segments sont passs comme paramtres

Fonction geninterrupt (int num) : dclenche l'IT num sans effectuer de copie de registres,
mais en initialisant les registres l'aide de pseudo variables dfinies dans dos.h : _ah, _al, _ch, etc...

Fonctions intdos ( union REGS * r_in, union REGS * r_out) et intdosx ( union REGS * r_in,
union REGS * r_out, union REGS r_seg) : permettent d'appeler directement une routine de
traitement de l'IT 21h

Fonction biosequip : dtermine la liste des quipements disponibles (IT 11h)

Fonction biosmemory : calcule l'espace mmoire disponible (IT 12h)

Fonction biosdisk (int cmd, int face, int piste, int secteur, int n_secteur, void * buffer) :
appelle la fonction cmd de l'IT 13h

Fonction bioscom (int cmd, char octet, int port) : appelle la routine cmd de l'IT 14h. octet
reprsente l'octet crire si cmd =1, port dsigne le n de la porte

Fonction bioskey (int cmd) : appelle la routine cmd de l'IT 16h

Fonction biosprint (int cmd, char octet, int port) : appelle la routine cmd de l'IT 18 h. octet
reprsente l'octet crire si cmd =0, port donne le n de la porte parallle

Fonction biostime (int cmd, long new_time) : appelle la fonction cmd de l'IT 1Ah. new_time
contient la nouvelle heure en nombre de battements si cmd =1


Il existe en Turbo-C le type interrupt. Lorsqu'une fonction est dclare de ce type, TURBO-
C va gnrer du code pour sauver les registres en dbut d'excution et pour terminer la routine avec
l'instruction IRET signalant le retour d'une interruption. La routine de service doit viter un appel
aux routines systme car le DOS n'est pas rentrant.

La fonction setvect (int num, void interrupt (*f) ()) insre la fonction f en tant que routine de
service de l'IT num. Pour viter cette opration, il faut viter d'tre interrompu. Il faut donc faire
prcder l'appel setvect d'un appel disable () qui masquera toutes les IT. Ensuite, un appel
enable () rendra nouveau possible l'interruption du programme.


Systme d'exploitation - chapitre 10

1
Chapitre 10 NOTIONS SUR WINDOWS NT



Le systme d'exploitation WINDOWS NT (New Technology) a t conu par Microsoft entre 1988
et 1993. Cinq objectifs taient poursuivis en crant ce nouveau SE :

- offrir une interface homme-machine conviviale et standard pour tous ceux qui taient
familiers de l'environnement Windows sous MS-DOS, voire d'Apple

- conception modulaire du SE permettant son volution

- portabilit du code sur toute machine utilisant un espace d'adressage sur 32 bits

- compatibilit binaire avec toutes les applications Microsoft existantes et compatibilit
au niveau source avec la norme POSIX (Portable Operating System Interface for Computer
Environment, 1988 et 1990). Cette norme est destine rendre les applications compatibles avec les
diffrentes versions d'UNIX

- optimisation des services systme et mcanisme d'changes grande vitesse pour
accrotre les performances

Outre la version de base pour postes de travail de gamme convenable, WINDOWS NT existe dans la
version Advanced Server qui offre des services tendus de partage de ressources et d'administration.

1. CARACTERISTIQUES DE WINDOWS NT

4 caractristiques principales permettent WINDOWS NT d'tre considr comme un descendant
volu d' OS/2 d'IBM, de VMS de DEC et d'UNIX :

1.1 Utilisation du modle client-serveur

Il assure l'accs transparent aux services de WINDOWS NT pour les clients htrognes
WINDOWS, MS-DOS, OS/2 ou POSIX. Le dialogue entre clients et serveur se fait par change de
messages.

1.2 Modle en couches

Il est utilis notamment dans le systme d'E/S et dans la partie de plus bas niveau : le noyau et la
couche d'abstraction du matriel (Hardware Abstraction Layer, HAL)

1.3 Modle de traitement symtrique

SMP (Symmetric MultiProcessing) permet de mieux exploiter la puissance du processeur physique,
notamment tous les processeurs architecture CISC (Complex Instruction Set Computer) tel que le
486 ou le Pentium d'INTEL ou architecture RISC (Reduced Instruction Set Computer).


1.4 Utilisation des objets

L'utilisation des objets pour reprsenter les ressources du systme permet de grer les ressources de
faon homogne et scurise.
Windows NT peut travailler selon deux modes :


Systme d'exploitation - chapitre 10

2

- le mode utilisateur : mise en uvre des sous-systmes protgs ou serveurs, ainsi que
des applications clientes

- le mode moyau : excution des fonctions systme ou excutif NT














































2. MODE UTILISATEUR

Dans ce mode, on accde l'excutif NT (code systme) uniquement travers ses services. Les
sous-systmes ou serveurs sont protgs.

Les communications entre sous-systmes se font par change de messages et plus rarement par
partage de mmoire. Chaque serveur dispose d'une interface de programmation d'application
(Application Programming Interface ou API) que les clients et autres serveurs peuvent appeler.


Systme d'exploitation - chapitre 10

3

On distingue deux classes de sous-systmes protgs ou serveurs :

2.1 Les sous systmes d'environnement

Ils offrent un pseudo-environnement Windows, MS-DOS, OS/2 ou POSIX et proposent chacun une
API spcifique avec un espace d'adressage priv pour tre protgs les uns des autres :

- le sous-systme Win 32 offre l'API de Windows et l'interface graphique de
WindowsNT (fentres). Il gre aussi les saisies utilisateur et les sorties de donnes de toutes les
applications. Il est le lien entre l'utilisateur et le reste du SE. Lors du lancement d'une application,
Win 32 cre un processus et en donne le contrle au sous-systme concern

- le sous-systme POSIX offre une API pour applications UNIX

- le sous-systme OS/2 offre une API pour applications OS/2

- le sous-systme MS-DOS ( Virtual DOS Machine ou VDM, client de Win 32) offre aux
applications MS-DOS le contexte d'un processus appel machine virtuelle DOS 5.0, avec un
processeur virtuel Intel x86, sans son SGF propre , mais avec espace d'adressage priv et pilotes

- le sous-systme Windows 16 bits (WOW, Windows on Win 32, client de Win 32) est
une VDM multitches dont chaque tche fait tourner une application Windows 16 bits. Le code du
noyau de Windows 3.1 est charg au-dessus du code de MS-DOS. La gestion des fentres est faites
par l'API Win 32


Systme d'exploitation - chapitre 10

4

2.2 Les sous systmes intgraux

Ils excutent les fonctions de base du SE :

- les sous-systmes rseau grent les demandes d'E/S sur le rseau

- le sous-systme de scurit maintient une base de donnes contenant des informations
de scurit sur les comptes utilisateurs locaux ou distants. Il est charg de l'authentification des
utilisateurs lors d'une tentative de connexion locale ou via le rseau.

Ainsi, ds qu'un utilisateur ouvre une session dans WINDOWS NT aprs avoir fourni un nom de
compte et un mot de passe corrects, le sous-systme de scurit construit un objet appel jeton
d'accs et l'attache en permanence au processus utilisateur lanc la connexion. Un jeton d'accs
comprend l'identificateur personnel de scurit de l'utilisateur (Security Identifier ou SID) et la liste
des groupes dont il fait partie. Le jeton d'accs identifie tout processus et ses tches (threads) auprs
du SE.









Systme d'exploitation - chapitre 10

5
Lorsqu'on cre un objet partageable par plusieurs processus, un descripteur de scurit est cr dans
l'en-tte de l'objet. Il s'agit d'un pointeur sur une liste de contrle d'accs (Access Control List ou
ACL) dont chaque lment (Access Control Entry ou ACE) comporte deux champs : un utilisateur
ou un groupe, une liste de droits d'accs l'objet (cf. exemple ci-dessus). Pour des raisons
d'efficacit, les contrles sont effectus l'ouverture d'un objet et non pas chaque utilisation.



3. MODE NOYAU

C'est le mode dans lequel tourne le code systme ou excutif de WINDOWS NT. On ne peut
accder que dans ce mode au matriel et la mmoire.

L'excutif est le moteur du SE. Il peut grer un nombre quelconque de processus serveurs.

L'excutif NT est compos de plusieurs lments :


3.1 Le gestionnaire d'objets

gre les structures de donnes de l'excutif, modlisant les ressources du SE. Elles sont utilises par
les programmes en mode utilisateur au travers des services.


3.2 Le moniteur de rfrence de la scurit

surveille les ressources du SE en contrlant l'accs aux objets par les processus. Quand un processus
demande l'ouverture d'un objet, le moniteur consulte la liste de contrle d'accs de l'objet et le jeton
d'accs du processus.


3.3 Le gestionnaire de processus

cre, termine les processus et les tches (threads), suspend et relance l'excution des tches, gre
leurs donnes


3.4 L'appel de procdures locales

LPC (Local Procedure Call) transmet les messages entre client et serveur sur la mme machine


3.5 Le gestionnaire de mmoire virtuelle

gre la pagination, fournit un espace priv d'adresses mmoire pour chaque processus et en protge
l'accs


3.6 Le noyau

traite les interruptions, ralise l'ordonnancement des tches, synchronise les processus, fournit des
objets et des interfaces de bas niveau au reste de l'excutif


Systme d'exploitation - chapitre 10

6
3.7 Le systme d'E/S

Il comprend :

- le gestionnaire d'E/S qui gre des modles d'E/S indpendants des priphriques

- les pilotes de fichiers (drivers) qui traduisent les demandes d'E/S fichiers

- le redirecteur et le serveur du rseau : pilotes spcifiques qui transmettent et reoivent
des demandes d'E/S avec une autre machine du rseau

- les pilotes de priphriques (device drivers) grent la lecture ou l'criture sur un
priphrique physique ou un rseau

- le gestionnaire de mmoire cache


3.8 La couche d'abstraction du matriel (HAL)

masque WINDOWS NT les dtails d'implmentation de la plate-forme : contrleurs d'interruption,
mcanismes de communication multiprocesseur, interfaces d'E/S, etc...


Systme d'Exploitation - chapitre 11
1
Chapitre 11 L'EXECUTIF DE WINDOWS NT
Objets, processus et gestion de la mmoire



Comme il a t indiqu au chapitre 9, l'excutif de WINDOWS NT met des sous-services standard
la disposition des applications clientes, gre les processus et les tches (threads), gre la mmoire et
les E/S.

Les ressources systme sont reprsentes par des objets, mais WINDOWS NT est crit en C de
Microsoft et ne dispose pas vraiment de structures orientes objet.


1. GESTION DES OBJETS

Les objets de l'excutif permettent trois fonctionnalits :

- offrir des noms explicites pour les ressources du systme
- partager ressources et donnes entre les processus
- protger les ressources

Seules les structures concernes par ces traitements sont modlises par des objets.

Il existe deux sortes d'objets :

- les objets de l'excutif : accessibles par les sous-systmes protgs en mode utilisateur
(processus, tche, jeton d'accs, smaphore, fichier).

- les objets du noyau : accessibles par les couches basses du systme (interruption, tche-
noyau, processus-noyau, etc...)

Dfinition : on appelle handle d'objet un index dans une table de pointeurs sur les objets spcifique
un processus. Cette table comprend des pointeurs vers tous les objets pour lesquels le processus a
ouvert un handle. Un handle est donc un pointeur indirect vers un objet. Seul le gestionnaire d'objets
a le droit de crer un handle.

Pour un processus, un handle d'objets est un pointeur indirect sur des ressources du systme. On vite
ainsi que les applications manipulent directement les structures de donnes du systme.




















Systme d'Exploitation - chapitre 11
2
1.1 Structure des objets

Un objet comporte deux parties :

- un en-tte contrl par le gestionnaire d 'objets. Les services gnriques (fermer un
handle, dupliquer un handle, interroger l'objet, interroger la scurit, changer la scurit, attendre un
objet) accdent aux donnes de l'en-tte.

- un corps contrl par le sous-ensemble du SE qui a cr ce type d'objet. Le corps
comprend plusieurs champs : type d'objet, attributs de l'objet, services de l'objet.


1.2 Gestionnaire d'objets

Il assure des fonctionnalits nombreuses :
- vrification des droits d'accs des tches et processus sur les objets et ralisation de
leur protection

- cration et suppression des objets; surveillance des objets temporaires pour les
supprimer ds qu'ils ne sont plus utiliss; suivi des objets en utilisant leur en-tte

- centralisation des oprations de contrle des ressources

- attribution des noms aux objets (chaque nom est global sur une machine, mais pas dans
le rseau) et implantation des objets nomms dans une mmoire globale gre dynamiquement,
attribution d'alias aux noms. Cet espace est structur en arbre.



2. LES PROCESSUS ET LES TCHES (THREADS)

Chaque processus est dcoup en une ou plusieurs units d'excution ou tches ou threads. Le
dcoupage en threads permet un processus de parallliser l'excution d'une partie de son code ou
d'une partie de celui-ci.

Processus et threads sont implments sous formes d'objets. Le gestionnaire de processus de l'excutif
cre ou supprime des processus et des threads et gre les communications interprocessus. Le
gestionnaire de processus fournit des services pour la gestion des processus lis aux sous-systmes
d'environnement. Il n'y a pas de relation pre-fils entre les processus natifs de WINDOWS NT.


2.1 Les processus

Un processus WINDOWS NT comprend :

- un programme excutable (code et donnes)
- un espace d'adressage virtuel priv
- un ou plusieurs threads auxquels des ressources systme sont affectes (smaphores, fichiers,
ports, ...)

La plupart des processus fonctionnent en mode utilisateur : ainsi, leur espace d'adressage est protg
des applications et des autres sous-systmes.

A chaque processus est associ un ensemble de ressources : jeton d'accs, table d'objets, structure de
donnes pour le gestionnaire de la mmoire virtuelle



Systme d'Exploitation - chapitre 11
3
La structure de processus de l'excutif NT fournit des mcanismes de base qui permettent aux sous-
systmes d'environnement (POSIX, Win32, OS/2) de construire leur propre structure de processus et
de la grer.




















2.2 Les tches

Un thread appartient un processus et un seul. Sa structure comporte les lments du contexte:
- un compteur ordinal
- une pile en mode utilisateur
- une pile en mode noyau
- une zone de donnes prives
- un mot d'tat du processeur

Tous les threads d'un processus peuvent accder son espace d'adressage, aux handles d'objets et
ses autres ressources.

Lorsqu'un thread en mode utilisateur fait appel au SE, il est bascul en mode noyau et le service
demand est excut aprs vrification de ses paramtres. Puis, le thread est bascul nouveau en
mode utilisateur.

Il existe deux moyens de communications entre threads :

- les objets de synchronisation qui implmentent des fonctions d'attente et de signalisation.
Un objet de synchronisation possde deux tats : signal et non signal

- la fonction d'alerte, notifie par l'APC (Asynchronous Procedure Call) permet d'interrompre
l'excution d'un thread pour lui faire excuter une procdure ( comparer aux signaux d'UNIX)




3. COMMUNICATION INTER-PROCESSUS

Il existe 3 moyens de faire communiquer des processus avec WINDOWS NT : les appels de
procdure locale, les appels de procdure distante et les canaux nomms.


3.1 LPC, Local Procedure Call



Systme d'Exploitation - chapitre 11
4
C'est un mcanisme rapide de transmission de message entre processus situs sur la mme machine.

Le processus client envoie une demande de connexion sur le port de connexion du processus serveur.
Le processus serveur cre deux objets-ports de communication pour tablir un canal entre client et
serveur et retourne au client l'un des handles correspondant.
A la mise en place du canal de communication, le processus client indique la mthode LPC qu'il veut
utiliser parmi les trois suivantes :

- envoi d'un message dans la file de message de l'objet-port du processus serveur (1 bloc de
message =256 octets). Cette mthode, valable pour des messages courts, relie les espaces d'adressage
des processus client et serveur par l'intermdiaire de la mmoire systme alloue l'objet-port





















- envoi, au port du serveur, d'un pointeur sur le message et passage du message en
mmoire partage. Le processus client cre un objet de mmoire partage : objet-section associ au
port de communication du client, mais visible des deux processus. Lorsque le processus serveur
rpond, il cre aussi un objet-section associ son propre port de communication

- transmission d'un message un thread spcifique d'un serveur travers une mmoire
partage. Ce mcanisme est appel "LPC rapide". Il est utilis par Win32 pour augmenter ses
performances dans la gestion des fentres et des graphismes. Ds qu'un processus serveur reoit une
demande de transmission LPC rapide de messages sur son port de connexion, Win32 cre trois
ressources pour le client :

* un thread pour le traitement des requtes
* un objet-section de 64 Ko de mmoire partage pour la transmission des messages
* un objet-"paire d'vnements" pour synchroniser le thread client et le thread serveur

3.2 RPC, Remote Procedure Call

L'objectif est de permettre une application distribue sur plusieurs machines d'appeler des services
disponibles sur diverses machines du rseau. Ce mcanisme est conforme aux standards RPC de
l'OSF.

Pour traiter des procdures distantes, une application utilise une bibliothque locale de liaison
dynamique (Dynamic Link Library ou DLL), comprenant des procdures relais qui portent le mme
nom que les procdures distantes et possdent les mmes interfaces.



Systme d'Exploitation - chapitre 11
5
Le relais rcupre une copie des donnes pointes par un de ses paramtres, rsout les rfrences et
appelle des procdures d'excution de RPC qui s'adressent la machine distante.



3.3 Les canaux nomms

Ce mcanisme fait abstraction des problmes de routage et de transmission de donnes dans le rseau.
Il est implment par un pseudo-SGF : le pilote du systme de fichiers des canaux nomms.

Chaque canal nomm est implment par un objet-fichier et dispose des mmes mcanismes
de scurit que les autres objets de l'excutif. Un canal nomm est utile pour l'envoi de flots de
donnes entre client et serveur d'une application distribue.




4. Gestion des processus et threads par le noyau

Le noyau de WINDOWS NT est crit en C de Microsoft et en Assembleur. Il assure le contrle des
processeurs et fournit des fonctions de bas niveau l'excutif NT. Pour l'essentiel, le noyau assure
l'ordonnancement des processus et des threads, et gre les interruptions.

Le code du noyau n'est pas pagin hors de la mmoire et n'est pas interruptible. Il s'excute toujours
en mode noyau.

Le rle du noyau peut se rsumer 4 lments principaux :


4.1 Ordonnancement des threads

L'ordonnanceur des tches est appel "module rpartiteur du noyau". Chaque tche peut se trouver
dans l'un des 6 tats suivants :

- prt : en attente d'excution

- standby : un thread et un seul est dans cet tat un instant donn sur un processeur
donn; c'est le thread dont l'excution sera lance la prochaine commutation de tches

- en excution : tat du thread en cours d'excution. Si le noyau l'interrompt pour
excuter un thread de priorit plus leve, il est plac en tte de la file d'attente, dans ltat prt

- attente : le thread attend qu'un objet soit disponible ("mis en tat signal") . Le noyau
l'informera que le rpartiteur rendra disponible cet objet attendu

- transitoire : le thread pourrait tre prt, mais une ressource est indisponible. Ds que la
ressource attendue est disponible, il passe l'tat prt

- termin : son excution est acheve. Il est supprim ou bien rinitialis.


Les niveaux de priorit des threads sont numrots de 1 (le plus bas niveau) 31 (le plus lev). Les
niveaux 16 31 sont rservs aux threads temps rel et les niveaux 1 15 sont allous aux threads
priorit variable. L'ordonnanceur gre une file d'attente par niveau de priorit.




Systme d'Exploitation - chapitre 11
6

4.2 Traitement des interruptions

Lorsque survient une interruption, le processeur transfre le contrle au code de traitement des
droutements du noyau. Celui-ci transfre son tour le contrle au module charg du traitement de
l'interruption qui a t dcele.

Le noyau utilise un ensemble standard de priorits d'interruptions (Interrupt Request Level ou IRQL),
portables d'un processeur un autre.

Les exceptions (erreurs synchrones rsultant de l'excution d'une instruction en langage machine)
sont traites sont traites en mode utilisateur ou en mode noyau selon un mcanisme analogue.



4.3 Synchronisation des processeurs

Sur une machine multiprocesseurs, le noyau assure la synchronisation des processeurs. Il dispose de
primitives d'exclusion mutuelle pour la gestion de l'accs aux donnes globales tous les processeurs
(mcanisme dit de verrou continu).

Le noyau fournit aussi des mcanismes de synchronisation entre processeurs appels objets-
rpartiteurs.



4.4 Reprise aprs interruption d'alimentation

Le noyau rserve la coupure d'alimentation le deuxime niveau d'interruption par ordre dcroissant
(le niveau le plus lev est allou aux erreurs de bus et aux tests dfectueux de la machine). L'objectif
est de permettre la reprise des oprations d'E/S pour tout ordinateur muni d'une batterie de secours
pour la mmoire, aprs une coupure d'alimentation. deux objets sont ddis la gestion de la reprise :
objet-notification d'alimentation et objet-tat d'alimentation.




5. GESTION DES ENTREES-SORTIES

Le systme d'E/S de WINDOWS NT offre un accs aux priphriques sous forme de fichiers virtuels,
manipuls par des handles de fichiers. Tous les pilotes de priphriques communiquent l'aide de
paquets de demandes d'E/S (Input/Output Request Packet ou IRP). Tous les priphriques physiques,
sources ou destinations, du systme d'E/S sont modliss par des objets-fichier . Ds le chargement
d'un pilote de priphrique, l'objet-pilote associ et l'objet-priphrique associ permettent de traiter
toute demande d'accs en occultant au maximum les caractristiques physiques du priphrique.

Pour chaque opration d'E/S, le systme d'E/S cre un IRP, le passe au pilote qui doit le traiter et
rcupre l'IRP lorsque l'E/S est acheve.

Les priphriques courants : clavier, souris, cran, imprimante, sont grs par un pilote monocouche.
Les units de disques et les gestionnaires de rseaux ont des pilotes multicouches (pilote de fichiers,
puis pilotes de priphriques).

Les principales caractristiques du systme d'E/S sont les suivantes :



Systme d'Exploitation - chapitre 11
7
- il admet plusieurs systmes de fichiers : celui de MS-DOS, celui d'OS/2, CDFS (systme de
fichiers de CD-ROM), et bien sr NTFS (celui de Windows NT)

- on peut ajouter ou enlever dynamiquement des pilotes; ceux-ci ont une structure uniforme et
modulaire

- il protge ses ressources partageables par l'utilisation d'objets

- il supporte les interfaces d'E/S de Win32, OS/2 et POSIX


BIBLIOGRAPHIE SUCCINCTE


Helen CUSTER Au cur de Windows NT, Microsoft Press, 1993
Bruno DARDONVILLE Architecture de Windows NT, Herms, 1996
Paul YAO An Introduction to Windows NT Memory Management Fundamentals,
Microsoft Development Library, 1992


Systme d'exploitation - Chapitre 12

1
Chapitre 12 LES SEMAPHORES SOUS UNIX



1. PRINCIPE DES SEMAPHORES SOUS UNIX


Pour crer un smaphore, l'utilisateur doit lui associer une cl. le systme lui renvoie un identificateur
de smaphore auquel sont attachs n smaphores numrots de 0 n-1. Pour spcifier un smaphore
parmi les n, l'utilisateur indique l'identificateur et le numro du smaphore.

A chaque identificateur de smaphore sont associs des droits d'accs. Ces droits sont ncessaires
pour effectuer des oprations sur les smaphores, mais inoprants pour :
- la destruction d'un identificateur de smaphore,
- la modification des droits d'accs.
Seul le crateur, le propritaire ou le super-utilisateur peuvent raliser ces oprations.


1.1 Le fichier <sys/sem.h>

A chaque ensemble de smaphores sont associes les structures semid_ds (une par ensemble de
smaphores), __sem et sembuf (une par smaphore) dcrites dans <sys/sem.h>

struct __sem /* correspond la structure d'un smaphore dans le noyau */
{
unsigned short semval; /* valeur du smaphore */
unsigned short sempid; /* pid du dernier processus utilisateur */
unsigned short semcnt;
/* nombre de processus attendant l'incrmentation du smaphore */
unsigned short semzcnt;
/* nombre de processus attendant que semval soit nul */
};

struct sembuf /* correspond une opration sur un smaphore */
{
unsigned short sem_num; /* n de smaphore : 0,.... */
short sem_op; /* opration sur le smaphore */
short sem_flg; /* option */
};

struct semid_ds
/* correspond la structure d'une entre dans la table des smaphores */
{
struct ipc_perm sem_perm; /* les droits */
struct __sem * sem_base; /* pointeur sur le premier smaphore de l'ensemble */
time_t sem_otime; /* date dernire opration par semop */
ushort sem_nsems; /* nombre de smaphores de l'ensemble */
time_t sem_ctime; /* date dernire modification par semctl */
};



Systme d'exploitation - Chapitre 12

2
1.2 La fonction semget

int semget ( key_t cle, int nb_sem, int option)

nb_sem : nombre de smaphores de l'ensemble

cle : si cle =IPC_PRIVATE, un nouvel ensemble de smaphores est cr sans cl
d'accs
sinon, il y a appel a ftok.
si cle ne correspond pas un ensemble de smaphores existant
si IPC_CREAT n'est pas positionn : erreur et retour de -1
sinon, un nouvel ensemble de smaphores est cr et associ cette
cl. Les droits d'accs sont ceux mentionns; le propritaire et crateur est le propritaire effectif du
processus; le groupe propritaire et crateur est le groupe propritaire effectif du processus

sinon si IPC_CREAT et IPC_EXCL sont tous deux positionns :
erreur et retour de -1
sinon la fonction retourne l'identificateur de l'ensemble de
smaphores

option : on peut combiner par | des droits d'accs et les constantes suivantes :
SEM_A : permission de modification
SEM_R : permission en lecture
IPC_CREAT , IPC_EXCL

La fonction : key_t ftok (char * path , int id) utilise une chane de caractres (en principe un nom
de fichier unique dans le systme ), la combine id pour gnrer une cl unique dans le systme,
sous forme d'un key_t (quivalent un entier long).

Exemple : rcupration de l'identificateur d'un ensemble de 5 smaphores
num =semget (ftok (path, cle), 5, 0)
Exemple : /* cration de 4 smaphores associs la cl 456 */
#include <errno.h>
#define CLE 456
main ()
{
int semid ; /* identificateur des smaphores */
char *path ="nom_de_fichier_existant";
if (( semid =semget (ftok (path, (key_t) CLE) , 4, IPC_CREAT | IPC_EXCL | SEM_R |
SEM_A)) ==-1)
{
perror ("chec de semget\n");
exit (1);
}
printf (" identificateur de l'ensemble : %d\n", semid);
printf ("cl de l'ensemble : %d\n", ftok (path, (key_t) CLE));
}


1.3 La fonction semctl

int semctl ( int semid, int semnum, int cmd, arg)

semid : identificateur de l'ensemble de smaphores

semnum : numro du smaphore trait


Systme d'exploitation - Chapitre 12

3
union semun
{
int val;
struct semid_ds *buf;
ushort array [ <nb de smaphores>];
} arg;

cmd : paramtre de commande pouvant prendre 10 valeurs :
GETVAL : retourne la valeur du smaphore de n semnum
SETVAL : le smaphore de n semnum reoit la valeur arg.val
GETPID : retourne le pid du processus qui est intervenu en dernier lieu
GETNCNT : retourne le nombre de processus en attente d'une incrmentation de
la valeur du smaphore de n semnum
GETZCNT : retourne le nombre de processus en attente du passage 0 du
smaphore de n semnum
GETALL : range les valeurs de tous les smaphores dans le tableau point par
arg.array
SETALL : positionne les valeurs de tous les smaphores l'aide des valeurs du
tableau point par arg.array
IPC_STAT : la structure associe semid est range l'adresse contenue dans
arg.buf
IPC_SET : positionne les valeurs gid, uid et mode partir de la structure pointe
par arg.buf
IPC_RMID : dtruit le smaphore



1.4 La fonction semop

int semop (int semid, struct sembuf (* sops) [ ], int nbops)
retournesemval du dernier smaphore manipul ou -1 en cas d'erreur

semid : identificateur de l'ensemble de smaphores

sops : pointeur vers un tableau de nbops structures de type sembuf (cf. page 1)

Pour chaque smaphore de n sem_num (0 nbops-1), on indique dans le champ
sem_op l'opration effectuer avec un code entier :
si sem_op >0 : semval =semval +sem_op
si sem_op =0 : si semval =0, rien n'est effectu
sinon le processus est endormi en attendant la nullit de semval
si sem_op <0: si semval >=|sem_op|, alors semval semval - |sem_op|
sinon, le processus est endormi jusqu' : semval >=|sem_op|
Pour le champ sem_flg :
s'il vaut IPC_NOWAIT, vite le blocage de processus et retourne un code d'erreur
s'il vaut SEM_UNDO, on vite de bloquer indfiniment des processus sur des
smaphores aprs la mort accidentelle d'un processus. Trs coteux en temps CPU et en mmoire






Systme d'exploitation - Chapitre 12

4
2. LES OPERATEURS P ET V
(WAIT et SIGNAL au sens de DIJKSTRA)

/* Appelons ce fichier par exemple : "Dijkstra.h"
Il est videmment inclure dans le programme utilisateur*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/*************************************************************/
int sem_create (key_t CLEF, int initval)
/* cre un ensemble d'un seul smaphore dont la cl est relie CLEF, de valeur initiale initval
retourne l'identifiant associ au smaphore si OK, sinon retourne -1
Si l'ensemble associ CLEF existe dj, la fonction part en chec.
Les droits sont positionns de sorte que tout processus peut modifier le smaphore */
{
union semun {
int val;
struct semid_ds *buf;
ushort *array;
} arg_ctl;
int semid;
semid =semget ( ftok ("Dijkstra.h-<votre login>", CLEF), 1, IPC_CREAT | IPC_EXCL | 0666);
if (semid ==-1) return -1;
arg_ctl.semval =initval;
if (semctl (semid, 0, SETVAL, arg_ctl) ==-1) return -1;
return semid;
}
/********************************************************/
int sem_delete ( int semid)
/* supprime l'ensemble de smaphores identifis par semid */
{
return semctl (semid , 0 , IPC_RMID , 0) ;
}
/********************************************************/
int P (int semid)
{
struct sembuf sempar;
sempar.sem_num =0;
sempar.sem_op = -1;
sempar.sem_flg =SEM_UNDO;
return semop (semid , &sempar , 1);
}

/********************************************************/
int V (int semid)
{
struct sembuf sempar;
sempar.sem_num =0;
sempar.sem_op = 1;
sempar.sem_flg =SEM_UNDO;
return semop (semid , &sempar , 1);
}





Systme d'exploitation - Chapitre 12

5
En outre, la commande shell ipcs permet d'obtenir des informations sur les objets de type
ensemble de smaphores (et plus gnralement tous les IPC), avec l'option :

- s pour se limiter aux smaphores
- m pour se limiter aux segments de mmoire
- q pour se limiter aux files de messages
- c pour faire pparatre l'identit de l'utilisateur crateur

Elle fournit :
T : type de l'objet (q, m ou s)
ID : identification interne de l'objet
KEY : cl de l'objet en hexadcimal
MODE : droits d'accs l'objet. Les 2 premiers des 11 caractres indiquent des
informations spcifiques une file de messages ou un segment de mmoire partage
OWNER : identit du propritaire
GROUP : identit du groupe propritaire


3. EXEMPLE DE PROGRAMMATION CONCURRENTE

main ()
{
int i, CLE =33, mutex =0;
if ((mutex =sem_create ( CLE, 1)) ==-1)
{
perror ("problme de cration du smaphore ");
exit (-1);
}
printf ("cration du smaphore d'identifiant %d\n", mutex);
if (fork () ==0)
{
printf ("je suis le processus %d, fils de %d\n", getpid (), getppid ());
for (i =0; i <3 ; i++)
{
P (mutex);
printf ("le fils entre dans sa section critique\n");
sleep (15);
printf ("le fils sort de sa section critique\n");
V (mutex);
}
exit (0);
}
else {
for (i =0 ; i <4 ; i++)
{
P (mutex);
printf ("le pere entre dans sa section critique\n");
sleep (10);
printf ("le pere sort de sa section critique\n");
V (mutex);
}
wait (0);
printf ("FIN !\n");
sem_delete (mutex);
}
}



Systme d'exploitation - chapitre 13

1
Chapitre 13 LES TUBES



Nous avons vu dans les chapitres prcdents deux moyens pour faire communiquer des processus
sous UNIX : les signaux et les smaphores. Les smaphores, ainsi que les tubes, les files de
messages et les segments de mmoire partage constituent les IPC (Inter Process
Communications), apparus avec UNIX System V. Le fichier /usr/include/sys/ipc.h contient la
dfinition des objets et des noms symboliques utiliss par les primitives des IPC.

Qu'il s'agisse des smaphores, des tubes, des files de messages ou des segments de mmoire
partage, il s'agit d'objets externes au SGF. Pour chacune de ces catgories, il existe une primitive
(....get) d'ouverture/cration (cf. ouverture des fichiers). Elle donne au processus une identification
de l'objet interne (cf. descripteurs de fichiers).


1. DEFINITION ET CARACTERISTIQUES

Les tubes (pipes) constituent le mcanisme fondamental de communication entre processus sous
UNIX. Ce sont des files d'octets. Il est conseill de les utiliser de faon unidirectionnelle. Si l'on
veut une communication bidirectionnelle entre deux processus, il faut ouvrir deux tubes, chacun
tant utilis dans un sens. Un tube est implment de faon proche d'un fichier : il possde un i-
node, mais ne possde pas de nom dans le systme ; son compteur de liens est nul puisque aucun
rpertoire n'a de lien avec lui.

Les tubes sont accessibles au niveau du shell pour rediriger la sortie d'une commande sur l'entre
d'une autre (symbole | ).

Comme un tube ne possde pas de nom, il n'existe que le temps de l'excution du processus qui le
cre. Plusieurs processus peuvent lire ou crire dans un mme tube, sans qu'on puisse diffrencier
l'origine des informations en sortie. La capacit d'un tube est limite (PIPE_BUF octets).

Les processus communiquant par un tube doivent avoir un lien de parent (par exemple
descendance d'un anctre commun ayant cr ce tube : problme classique de l'hritage des
descripteurs de fichiers par un fils).



2. CREATION ET UTILISATION D'UN TUBE

La cration d'un tube correspond celle de deux descripteurs de fichiers, l'un permettant d'crire
dans le tube et l'autre d'y lire par les oprations classiques read et write de lecture/criture dans un
fichier. Pour cela, on utilise la fonction prototype par :

int pipe (int *p_desc)

o p_desc[0] dsigne le n du descripteur par lequel on lit dans le tube
et p_desc [1] dsigne le n du descripteur par lequel on crit dans le tube.

La fonction retourne 0 si la cration s'est bien passe et - 1 sinon.

La fonction C prototype par :

FILE * fdopen (int desc, char *mode)


Systme d'exploitation - chapitre 13

2

permet d'associer un pointeur sur FILE au tube ouvert ; mode doit tre conforme l'ouverture dj
ralise.



3. SECURITES APPORTEES PAR UNIX

Un processus peut fermer un tube, mais alors il ne pourra plus le rouvrir. Lorsque tous les
descripteurs d'criture sont ferms, une fin de fichier est perue sur le descripteur de lecture : read
retourne 0.

Un processus qui tente d'crire dans un tube plein est suspendu jusqu' ce que de la place se libre.
On peut viter ce blocage en positionnant le drapeau O_NDELAY (mais l'criture peut n'avoir pas
lieu). Lorsque read lit dans un tube insuffisamment rempli, il retourne le nombre d'octets lus.

Attention : les primitives d'accs direct sont interdites; on ne peut pas relire les informations d'un
tube car la lecture dans un tube est destructive.

Dans le cas o tous les descripteurs associs aux processus susceptibles de lire dans un tube sont
ferms, un processus qui tente de lire reoit le signal 13 SIGPIPE et se trouve interrompu s'il ne
traite pas ce signal.


3.1 Ecriture dans un tube ferm en lecture

#include <errno.h>
#include <signal.h>
/****************************************************************/
void it_sigpipe ()
{
printf ("On a recu le signal SIGPIPE\n");
}
/****************************************************************/
void main ()
{
int p_desc [2];
signal (SIGPIPE, it_sigpipe);
pipe (p_desc);
close (p_desc [0]); /* fermeture du tube en lecture */
if (write (p_desc [1], "0", 1) == -1)
perror ("Erreur write : ");
}

Tester l'excution de ce programme et expliquez son fonctionnement.

Autres exemples intressants : Jean-Pierre BRAQUELAIRE, "Mthodologie de la programmation
en Langage C", Masson, 1993, p. 344-345, 456-457


Systme d'exploitation - chapitre 13

3

3.2 Lecture dans un tube ferm en criture.

#include <errno.h>
#include <signal.h>
/****************************************************************/
void main ()
{
int i , ret , p_desc [2];
char c;
pipe (p_desc);
write (p_desc[1], "AB", 2);
close (p_desc [1]);
for (i = 1; i <= 3; i++)
{ ret = read (p_desc [0], &c, 1);
if (ret == 1) printf ("valeur lue : %c\n", c );
else perror ("lecture impossible : ");
}

Tester l'excution de ce programme et expliquez son fonctionnement


4. EXEMPLES DE PROGRAMMES.

4.1 Communication pre-fils

Un fils hrite des tubes crs par le pre et de leurs descripteurs.

/* exemple 1 */
#include <stdio.h>
#include <errno.h>
#define TAILLE 30 /* par exemple */
main ()
{
char envoi [TAILLE], reception [TAILLE];`int p [2], i, pid;
strcpy (envoi, "texte transmis au tube");
if (pipe (p) < 0)
{
perror ("erreur de cration du tube ");
exit (1);
}
if ((pid = fork()) == -1)
{
perror ("erreur au fork ");
exit (2);
}
if (pid > 0) /* le pre crit dans le tube */
{
for (i=0 ; i<5; i++) write (p[1], envoi, TAILLE);
wait (0);
}
if (pid == 0) /* le fils lit dans le tube */
{
for (i=0 ; i<5 ; i++) read (p[0], reception, TAILLE);
printf (" --> %s\n", reception);
exit (0);
}
}
Testez l'excution de ce programme.


Systme d'exploitation - chapitre 13

4

/* exemple 2 */
#include <stdio.h>
#include <errno.h>
#define NMAX 10 /* par exemple */
/**************************************************************/
void main ()
{
int pid , p_desc [2];
char c;
if (pipe (p_desc))
{ perror ("erreur en creation du tube ");
exit (1);
}
if ((pid = fork ()) == -1)
{ perror ("echec du fork ");
exit (2);
}
if (pid == 0)
{ char t [NMAX];
int i=0;
close (p_desc [1]);
while (read (p_desc [0], &c, 1))
if (i < NMAX) t[i++] = c;
t [( i == NMAX) ? NMAX-1 : i ] = 0;
printf ("t : %s\n", t);
}
else { close p_desc [0]);
while ((c = getchar ()) != EOF)
if (c 'a' && c 'z') write (p_desc [1], &c, 1);
close p_desc [1]);
wait (0);
}
}


/* exemple 3 */
#include <stdio.h>
#include <errno.h>
#define NMAX 10 /* par exemple */
/**************************************************************/
void main ()
{
int pid , p_desc [2] , m;
FILE *in, *out;
if (pipe (p_desc))
{ perror ("erreur en cration du tube ");
exit (1);
}
out = fdopen (p_desc [0], "r");
in = fdopen (p_desc [1], "w");
if ((pid = fork ()) == -1)
{ perror ("echec du fork ");
exit (2);
}

if (pid == 0)
{ int t[NMAX], i = 0;
fclose (in);
while (fscanf (out, "%d", &m) != EOF)


Systme d'exploitation - chapitre 13

5
if (i <NMAX) t[i++] = m;

t ( [ i == NMAX) ? NMAX-1 : i ] = 0;
for (m=0 ; m < i ; m++) printf ("%d \n", m);
}
..................................... cf. exemple 2 .................................
}


Testez l'excution de ces programmes et expliquez leur fonctionnement.

Autres exemples intressants : Braquelaire p. 465-467.


4.2 Hritage des descripteurs lors d'un fork

#include <errno.h>
#include <stdio.h>
/****************************************************************/
void code_fils (int numero)
{
int fd, nread;
char texte [100];
fd = numero;
printf ("le descripteur est : %d\n", fd);
switch (nread = read (fd, texte, sizeof (texte)))
{ case -1 : perror (" erreur read : ");
break;
case 0 : perror ("erreur EOF");
break;
default : printf ("on a lu %d caractres : %s\n", nread, texte);
}
}
/****************************************************************/
void main ()
{
int p_desc [2],
char chaine [10];
if (pipe (p_desc ))
{ perror ("erreur en creation du tube ");
exit (1);
}
switch (fork())
{ case -1 : perror (" erreur fork : ");
break;
case 0 :if (close (p_desc [1]) == -1) perror ("erreur close : ");
code_fils (p_desc [0]);
exit (0);
}
close (p_desc [0]);
if (write (p_desc [1], "hello", 6) == -1) perror ("erreur write :");
}

Testez l'excution de ce programme et expliquez son fonctionnement.


4.3 Les redirections d'E/S standards : exemple de who | wc

#include <errno.h>


Systme d'exploitation - chapitre 13

6
#include <stdio.h>
/****************************************************************/
void main ()
{
int p [2], n;
if (pipe (p ))
{ perror ("erreur en cration du tube ");
exit (1);
}
if ( n= fork ()) == -1)
{ perror ("erreur avec fork : ");
exit (2);
}
if (n == 0) /* processus correspondant who */
{ close (1); /* on ferme la sortie standard */
dup (p [1]); /* fournit un descripteur ayant les mmes caractristiques
physiques que p[1], et ayant la valeur la plus faible possible. Ici, ncessairement : 1 */
close (p [1]); /* la sortie standard est ainsi redirige sur l'entre du tube */
close (p [0]);
execlp ("who", "who", 0);
/* on recouvre le processus par le texte de who */
}
else { /* processus correspondant wc */
close (0); /* on ferme l'entre standard */
dup (p [0]); /* fournit un descripteur ayant les mmes caractristiques
physiques que p[0], et ayant la valeur la plus faible possible. Ici, ncessairement : 0 */
close (p [0]); /* l'entre standard est ainsi redirige sur l'entre du tube */
close (p [1]);
execlp ("wc", "wc", 0); /* on recouvre le processus par le texte de wc */
}
}

Autre exemple intressant : Braquelaire p. 472-478.


4.4 Communication entre deux fils

#include <errno.h>
#include <stdio.h>
/****************************************************************/
void main ()
{
int pid1, pid2, ret, p_desc [2];
char *arg1, *arg2;
ret = pipe (p_desc);
sprintf (arg1, "%d", p [0]); /* conversion de p[0] en chane de caractres */
sprintf (arg2, "%d", p [1]); /* conversion de p[1] en chane de caractres */
pid1 = fork ();
if (pid1 == 0) execl ("fils1", "fils1", arg1, 0);
pid2 = fork ();
if (pid2 == 0) execl ("fils2", "fils2", arg2, 0);

/* suite du pre */

}

La communication est bien : fils1 -> fils2. Avec 3 tubes, on raliserait une communication
circulaire : pre -> fils1 -> fils2 -> pre.
tube p1 : pre -> fils1 (fils1 doit connatre p1[0])
tube p2 : fils1 -> fils2 (fils 1 doit connatre p2[1], fils 2 doit connatre p2 [0])


Systme d'exploitation - chapitre 13

7
tube p3 : fils2 -> pre (fils 2 doit connatre p3 [1])

Autre exmple intressant : Braquelaire p. 467-472.



5. LES TUBES NOMMES

Un tube nomm possde un nom dans le systme. S'il n'est pas dtruit, il persiste dans le systme
aprs la fin du processus qui l'a cr. Tout processus possdant les autorisations appropries peut
l'ouvrir en lecture ou en criture. Un tube nomm conserve toutes les proprits d'un tube : taille
limite, lecture destructive, lecture/criture ralises en mode FIFO. Un tube nomm permet des
processus sans lien de parent dans le systme de communiquer.

Pour crer un tube nomm, on utilise la fonction : int mknod (char *ref, int mode)
qui retourne 0 si elle a pu crer un i-node dont la premire rfrence est pointe par ref, avec les
protections mode); en cas d'chec, le retour est -1.

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
/*****************************************/
void main ()
{
printf ("on va crer un tube de nom fifo1 et un tube de nom fifo2\n");
if (mknod ("fifo1", S_FIFO | 0666) == -1) /* S_FIFO obligatoire */
{ perror ("erreur de cration fifo 1 ");
exit (1);
}
if (mknod ("fifo2", S_FIFO | 0666) == -1) /* S_FIFO obligatoire */
{ perror ("erreur de cration fifo2 ");
exit (1);
}
sleep (30);
printf ("on efface le tube fifo1\n");
unlink ("fifo1");
}

Lancez ce programme en arrire-plan et testez avec ls les crations et la suppression, ainsi que la
prsence de fifo2 aprs la fin du processus. Dans le catalogue, les tubes nomms apparaissent avec
p en tte des droits d'accs.

Pour utiliser un tube nomm cr, il est ncessaire de l'ouvrir en lecture ou en criture avec open.

Des prcautions d'ouverture et d'utilisation sont connatre. On se reportera avec profit Jean-
Marie RIFFLET, "La programmation sous UNIX", Mac-Graw-Hill, 1992, pages 263 267.

/* exemple 1 : l'excutable sera nomm ex1 */
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
main (int n, char ** v)
{
int p;
if (mknod ( v[1], S_IFIFO | 0666) == -1)
{


Systme d'exploitation - chapitre 13

8
perror ("cration impossible ");
exit (1);
}
if ((p = open (v[1], O_WRONLY, 0) )== -1)
{
perror ("ouverture impossible ");
exit (2);
}
write (p, "ABCDEFGH", 8);
}

/* l'excutable sera nomm ex2 */
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
main (int n, char ** v)
{
int p;
char c;
if ((p = open (v[1], O_RDONLY, 0)) == -1)
{
perror ("ouverture impossible ");
exit (2);
}
read (p, &c, 1);
printf ("%c\n", c);
}

On lance : $ ex1 fifo&
(il s'affiche ....... )
$ ex2 fifo
A

Vous aimerez peut-être aussi