un I nœud

publicité
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Diagramme bloc du noyau
• Le noyau pourrait lire et écrire directement
• la relative lenteur de transfert du disque
•
•
•
•
•
•
•
Le buffer Cache
=> faible capacité de traitement
L ’utilisation d ’une réserve de tampons
=> minimisation de la fréquence d ’accès
Le buffer Cache = réserve de tampons
Implantation du buffer-Cache
Lors de l’initialisation le noyau alloue de l ’espace pour les tampons
Un tampon = un en-tête + un tableau contenant les données d ’un bloc
un tampon représente un bloc disque (temporaire).
Les données d ’un bloc se trouvent dans au plus un tampon
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 1
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
En-tête d ’un tampon
• Le noyau gère les tampons en utilisant :
En-tête d ’un tampon
– des files à adressage calculé
– une liste de tampons libres
– files et liste doublement chaînées
• L ’état d ’un tampon :
–
–
–
–
–
verrouillé (occupé) ou déverrouillé (libre)
contient des données valides
marqué en écriture différée
En train d ’être charger ou transférer
attendu par un processus
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 2
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
La liste des tampons libres
• l ’extraction se fait en tête et la remise en queue (en général).
Les files à adressage calculé
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 3
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Extraction d ’un tampon
•
Algorithme getbloc{ /* (retourne un tampon verrouillé) */
while(T non trouvé){
if(bloc dans une file){
if(T occupé){ sleep (E); continue;}
marquer T occupé; extraire T de la LTL; return(T);
}
else{ /* le bloc n ’est pas dans la réserve */
if(LTL est vide){ sleep(E); continue; }
extraire un T de la LTL;
if(T marqué écriture différée){
écriture asynchrone du tampon; continue;
extraire T et le mettre dans la bonne file;
return T verrouillé;
}
}
}
Libération de tampons
• Un tampon retourné par getbloc reste verrouillé --> libération HN explicite
• Le tampon est mis à la fin sauf :
•
une erreur E/S
marqué ancien
Pas de libérations imbriquées
la procédure de libération est invoquée aussi à la fin d ’une E/S asy
•
•
•
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 4
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Algorithme de libération
•
Algorithme libérer_tampon
Entrée : tampon verrouillé
{
réveiller tous les processus en attente d ’un tampon
relever le niveau d ’exécution du processeur
if(contenu du tampon valide et non ancien)
mettre le tampon à la fin de la LTL;
else
mettre le tampon en tête de LTL;
rabaisser le niveau d ’exécution du processeur
déverrouiller le tampon;
}
Quelques remarques
• Verrouillage au début d ’un appel sys et déverrouillage avant la fin.
• Le noyau perd le contrôle sur les tampons seulement dans le cas d ’une E/S.
• En théorie le noyau ne résout pas le problème de famine, mais dans la pratique….
Lecture d ’un bloc
• Algorithme bread /lecture d ’un bloc */
sortie : tampon verrouillé contenant les données
{
obtenir un tampon pour le bloc (getbloc).
If(données valides) return (tampon);
initialiser une lecture disque;
sleep(E);
return(tampon);
}
Ecriture d ’un tampon
• Algorithme bwrite /* écriture d ’un bloc */
Entrée : tampon verrouillé
{
initialiser une écriture disque;
if(E/S synchrone){
sleep(E);
libérer le tampon;
}
else
if(écriture différée)
marquer « à mettre en tête de la LTL »
}
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 5
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Représentation Interne des fichiers
•
•
•
•
•
Tout fichier (Unix) à un unique i-nœud.
Il contient les infos concernant un fichier
Les i-nœuds se présentent sous forme statique sur le disque
Elles sont placés dans des i-nœuds mémoire pour être gérés et utilisés
le numéro d ’i-nœud est l ’identification interne d ’un fichier.
L ’i-noeud
• Un i-nœud disque contient:
–
–
–
–
–
–
–
le propriétaire
Type : ordinaire, répertoire, spécial, FIFO
Permissions : u-g-o
les dates des derniers accès et modification
nombre de liens au fichier
la table des adresses
la taille
I-nœud mémoire
• En plus des infos d ’un i-nœuds disque:
– l ’état :
l ’i-nœud est verrouillé
un processus attend que l ’i-nœud soit déverrouillé
– l ’i-nœud disque != l ’i-nœud mémoire
– les données d ’un fichiers sont différentes
– le fichier est un point de montage
le numéro de périphérique
le numéro d ’i-nœud
Pointeurs sur d ’autres i-nœuds mémoire
• listes d ’i-nœud libres
• files à adressage calculée
Un compte référence, indiquant le nombre d ’instances actives du fichier.
Rq: un i-nœud est libre seulement si son cpt ref est nul ==> il y a une différence entre « libre » et
« déverrouillé »
–
–
–
–
–
–
–
• Algorithme iget
Accès aux i-nœuds
Entrée : n° d ’i-nœud dans SF :: Sortie : i-nœud verr
{
while (non effectué){
if(I dans la réserve d ’i-nœuds){
if(I verrouillé){
sleep(E);
continue;
}
if(I dans LIL){
extrait I de LIL;
Cpt_Ref++ ; return(I);
}
}
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 6
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Accès à un i-nœud
•
If (LIL est vide)
return(erreur);
else{
extraire un nouvel I de la LIL;
mettre à jour le n° d ’i-nœud et de SF;
changer la file (si nécessaire);
lire l ’i-nœud depuis le disque (bread);
initialiser le Cpt_Ref à 1;
return(I)}
}}
• N° bloc = ( (n° I - 1)/ #(I/bloc) )+ premier bloc
• dep = ((n° I - 1) mod #(I/bloc))*taille d ’un I nœud);
• un i-nœud est verrouillé au sein d ’un appel Système
• Algorithme i_put {
Libération d ’i-nœud
verrouiller l ’i-nœud; cpt_ref --;
if(cpt_ref == 0){
if(cpt_lien == 0){
libérer les blocs disque (bfree);
positionner le type à 0;
libérer l ’i-nœud (ifree);
}
if (changement) mettre à jour l ’i-nœud disque;
placer l ’i-nœud dans la LIL;
}
déverrouiller l ’i-nœud;
}
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 7
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
I-nœud d ’un fichier ordinaire
Les répertoires
•
•
•
•
•
•
Ce sont des fichiers qui permettent la structure hiérarchique.
important pour la conversion d ’un nom de fichier en un n° d ’i-nœud
chaque répertoire contient . & ..
. & .. de la racine est la racine
Les données d ’un Rep sont rangée comme celles d ’un fichier.
Structure d ’un répertoire
Dep octet ds le Rep
n° d ’i-nœud
Noms
0
83
.
16
2
..
32
1798
init
48
1276
fsck
64
85
clri
80
2114
passwd
96
188
inittab
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 8
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Conversion d ’un chemin d ’accès en i-nœud
•
Algorithme nom2ino{ /* sortie : i-nœud verroullé */
i-no_de_travail = i-no_racine ou i-no du_rep_de_travail ;
while(chemin non épuisé){
extraire Comp de chemin ;
if ( !(l ’i_no_de_travail est rep) || ! (perm OK )) erreur ;
if(racine && (.. || .)) continue ;
lire le rep (i_no_de_travail) : bmap, bread, libère_bloc ;
if(Comp existe dans rep de travail){
accéder au numéro d ’i-nœud ;
libérer i_no_de_travail (i_put) ;
i-no_de_travail = i-no_de_Comp ;
}
else erreur;
}
return (i-no_de_travail);
}
Le super bloc
• Comment le noyau attribue i-nœuds et blocs
• utilisation du super_bloc:
– la taille du SF
– le nbre de blocs libres dans le SF
– une liste de bloc libres disponible (LBL)
– l ’indice du 1er bloc libre dans LBLD
– la taille de la liste des i-nœuds
– le nbre d ’i-nœuds libres dans le SF
– une liste d ’i-nœuds libre dans le SF
– l ’indice du 1er i-nœud libre dans la LILD
– des champs verrou pour la LBLD et LILD
– un drapeau indiquant si le super bloc a été modifié
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 9
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Attribution d ’un i-nœud
•
Algorithme ialloc { /* attribuer un i-nœud */
while (non effectué) {
if (super bloc verrouillé) {sleep (E); continue;}
if (LILD est vide) {
verrouillé le super_bloc et remplir LILD;
déverrouiller le super_bloc;
wakeup(E);
if( aucun i-nœud libre) erreur;
initialiser l ’i-nœud rappelé;
}
accéder à un n° d ’i-no dans la LILD (super-bloc);
accéder à l ’ino (algorithme iget);
if (i_no pas libre !!!) {libérer l ’i-no (iput); continue;}
initialiser l ’ino; écrire l ’ino sur le disque; nb_i-no_libres--;
return(i-nœud);
}
}
Libération d ’un i-nœud
• Algorithme ifree {
nbre_i-no_libres ++;
if (super_bloc verrouillé) return;
if(liste d ’i-no pleine)
actualiser l ’i-no rappelé;
else ranger le n° d ’i-nœud dans la liste;
return;
}
Attribution d ’un bloc
• Algorithme alloc { /sortie tampon pour le bloc */
while (super_bloc verrou) sleep (E);
extraire un bloc de la LBLD;
if(le dernier){
verrou de super_bloc;
lire le boc (bread) et remplire la LBLD;
libérer le tampon;
déverrou le super_bloc;
wakeup(E: verrou de super_bloc);
}
accéder à un tampon pour le bloc extrait (get_bloc);
nbre_bloc_libres --;
marquer le super_bloc modifié;
return(tampon);
}
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 10
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Libération de blocs
• L'algorithme free pour libérer un bloc est l'inverse de celui qui en attribue un (alloc).
• Si la liste du super bloc n'est pas pleine alors le n° y est mis.
• Sinon il devient un bloc de chaînage :
– le noyau écrit la liste du super_bloc dans le bloc
– le noyau le copie sur le disque
– le n° du bloc est le seul membre de la liste
Appel Système du SGF
retour desc
open
creat
dup
pipe
name2ino
open, stat
creat, link
chdir, unlink
chroot, mknod
chown, chmod
i-nœud
creat
mknod
link
unlink
name2i-no
iget , iput
ialloc ifree
alloc free bmap
attributs
chown
chmod
stat
E/S
read
write
lseek
algorithmes sur les tampon
get_bloc , liberer_tampon, bread, bwrite
• La 1ère étape pour accéder à un fichier
• voici la syntaxe:
–
–
–
–
Open
fd=open(chemin,drapeau,mode);
chemin : ex: /etc/passwd
drapeau : lecture , écriture
mode : droit d ’accès en mode création
fd : est un indice dans la table des fichiers locale à un processus (zone u)
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 11
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
Open
• Algorithme open /* renvoie un descripteur */
Open
{
- convertir le nom en i-nœud (nom2ino);
- if (PB dans nom ou droit d ’accès) return (erreur);
- attribuer à l ’ino une entrée de la table des fichiers
- initialiser le compte, le déplacement et drapeau;
- attribuer une entrée dans la table des descripteurs
- if (mode & troncature)
libérer tous les blocs (free);
- déverrouiller l ’i-nœud;
- return (descripteur);
}
• nbo = read ( fd, tampon, compte );
read
– fd : descripteur de fichier
– tampon : adresse d ’une structure alloué
– compte : le nbre d ’octets à lire
• Les paramètres d ’E/S sauvegardés dans la zone U:
– mode , compte, dép dans le fichiers, adresse de lecture ou d ’écriture
• Algorithme read /* lecture fichier */
{
- initialiser les paramètres d ’E/S dans la zone U;
- verrouiller l ’i-nœud;
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 12
cours de Systèmes d’Exploitation II ( Driss MATROUF )
Licence GMI
while (encore à lire){
- convertir le dep dans le fichier en n° bloc;
- calculer (dep dans le bloc & nbre d ’octets à lire)
- if (nbre d ’octets à lire == 0) break;
- lire le bloc (bread);
- copier les données depuis le tampon vers l ’usr
- mettre à jour les paramètres d ’E/S dans la zone U;
- liberer le tampon;
}
- déverrouiller l’i-nœud;
- mettre à jour le dep dans la table des fichiers;
- return (nbre d ’octets lus);
}
•
•
•
•
•
Write
L'algorithme write est similaire à read
Si le fichier ne contient pas un bloc, le noyau alloue un nouveau bloc …(alloc)
En cas de double indirection, le noyau peut allouer plusieurs blocs…
L’i-nœud est verrouillé durant l'appel système
Mise à jour de la taille du fichier ds l'i-noeud
• On peut utiliser flock
• On peut utiliser fcntl
• Les sémaphores…
Verrouillage
• Permet l'accès aléatoire à un fichier
• Syntaxe :
lseek
– Position = lseek(fd, dep_rel, repère);
• implémentation : le noyau ajuste simplement la valeur du déplacement dans la table des fichiers.
IUP GMI – Université d’Avignon et des Pays de Vaucluse
Page 13
Téléchargement