Mémoire périphérique Stockage primaire: Mémoire principale (RAM) Stockage secondaire: Périphériques Disques Rubans magnétiques
Comparaison (exemple) Temps d’accès à un octet de donnée Accès disque: 9 x 10-3 sec Accès mémoire: 60 x 10-9 sec.
Comparaisons (par mégabyte) Médium 1996 1997 2000 RAM $45.00 7.00 1.50 Disque 0.25 0.10 0.01 Floppy 0.50 0.36 Ruban 0.03 0.001 RAM est volatile. RAM est environ 1/4 million fois plus rapide qu’un disque.
Traitement de fichiers Minimiser le nombre d’accès disque! 1. Structurer l’information sur le disque pour minimiser le nombre d’accès nécessaires. 2. Minimiser le nombre d’accès futurs. Structure de fichier: organisation des données sur le disque. Compromis espace temps (disque): Compresser l’information peut réduire le temps de d’accès et de traitement.
Lecteur de disque Perche Plateaux Têtes de lecture/écriture Piste Axe
Secteurs Un secteur est l’unité de base des E/S. Secteurs Espaces inter-secteur Bits de données
Secteurs Facteur d’entrelacement (Interleaving factor): Distance physique entre deux secteurs logiquement adjacent sur une piste. Tête Tête
Terminologie Principe de la localité: Lorsqu’un enregistrement est lu sur le disque, la prochaine requête risque de se faire dans la même localité. Groupe de secteurs (cluster): Plus petite unit d’allocation d’un fichier. Domaine (extent): Un ensemble de groupes physiquement contigue. Fragmentation interne: Espace perdu dans un secteur si la taille de l’enregistrementif ne correspond pas à la taille d’un secteur où si la taille du fichier n’est pas un multiple de la taille d’un groupe de secteurs.
Temps d’accès Temps d’accès (seek time): Temps pour atteindre la piste désirée. Temps inter-piste: Temps minimum pour se déplacer d’une piste à une piste adjacente.. Temps d’accès moyen: Temps moyen pour atteindre une piste lors d’un accès direct.
Autres facteurs Temps de rotation:. Temps de transfert: À 7200 rmp: La moitié d’une rotation en moyenne À 7200 rpm, cela prend 8.3/2 = 4.2ms. Temps de transfert: À 7200 rmp: 8.3ms * (Nb secteurs à lire) / (Nb secteurs/piste)
Exemple Disque de 16.8 GB sur 10 plateaux= 1.68GB/plateau 13,085 pistes/plateau 256 secteurs/piste 512 octets/secteur Temps inter-piste: 2.2 ms Temps d’accès moyen: 9.5ms 4KB groupes, 32 groupes/piste. Facteur d’entrelacement de 3. 5400RPM (11.1ms par rotation)
Exemple (2) Lire un fichier de 1MB divisé en 2048 secteurs de 512 octets. On suppose que le fichier est sur 8 pistes contiguës. Première piste: 9.5 + 11.1/2 + 3 x 11.1 = 48.4 ms 7 autres pistes: 2.2 + 11.1/2 + 3 x 11.1 = 41.1 ms. Total: 48.4 + 7 * 41.1 = 335.7ms
Exemple (3) Lire un fichier de 1MB divisé en 2048 secteurs de 512 octets. On suppose que les groupes sont réparties aléatoirement sur le disque. 256 groupes. Temps de lecture d’un groupe est (3 x 8)/256 rotation. Ce qui donne 1 ms. 256(9.5 + 11.1/2 + 1) = 4108.8 ms. C’est-à-dire plus de 4 secondes. This is MUCH worse than the previous example.
Combien d’octets doit-on lire? Temps pour lire une piste: 9.5 + 11.1/2 + 3 x 11.1 = 48.4ms. Temps pour lire un secteur: 9.5 + 11.1/2 + (1/256)11.1 = 15.1ms. Temps pour lire un octet: 9.5 + 11.1/2 + (1/(256*512))11.1= 15.05 ms. La plupart des lecteurs de disque lisent 1 secteur à la fois.
Mémoire tampon L’information d’un secteur est mise dans un tampon ou cache. Si le prochain accès est dans le même tampon alors on a pas besoin de faire un accès disque. En général, il y a plus d’une mémoire tampon pour la lecture et pour l’écriture.
Point de vu du programmeur Vision logique des fichiers: Un tableau d’octets. Un pointeur de fichier indique la position courante. 3 opérations fondamentales: Lire n octets à partir de la position courante (déplacer le pointeur de fichier) Écrire n octets à partir de la position courante (déplacer le pointeur de fichier) Déplacer le pointeur de fichier à une position donnée.
stdio.h #include <stdio.h> FILE* fopen(char* fichier, char *mode); mode r pour lecture, le fichier doit exister w pour écriture, détruit les fichiers existants a pour ajout à la fin r+ pour lecture et écriture, le fichier doit exister int fclose(FILE* fp);
stdio.h int feof(FILE* fp); int fseek(FILE* fp, long deplacement, int origine) origine SEEK_CUR position courante SEEK_END fin du fichier SEEK_SET début du fichier
stdio.h size_t fread(void* tampon, size_t taille, size_t nombre, FILE* fp); size_t fwrite(void* tampon, size_t taille, int fprintf(FILE* fp, char* format[, parametres]); int fscanf(FILE* fp, char* format[, parametres]);
fstream.h #include <fstream.h> void fstream::open(char* name, openmode mode); Example: ios::in | ios::binary void fstream::close(); fstream::read(char* ptr, int numbytes); fstream::write(char* ptr, int numbtyes); fstream::seekp(int pos); fstream::seekp(int incr,int pos); pos= ios::curr où ios::deb où ios::end