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