Mise en mémoire tampon du fichier

Cette rubrique aborde les différentes considérations relatives au contrôle d’application de la mise en mémoire tampon des fichiers, également appelée entrée/sortie de fichier sans débogage (E/S). La mise en mémoire tampon des fichiers est généralement gérée par le système en arrière-plan et est considérée comme faisant partie de la mise en cache des fichiers dans le système d’exploitation Windows, sauf indication contraire. Bien que les termes de mise en cache et de mise en mémoire tampon soient parfois utilisés indifféremment, cette rubrique utilise le terme mise en mémoire tampon spécifiquement dans le contexte d’expliquer comment interagir avec des données qui ne sont pas mises en cache (mises en mémoire tampon) par le système, où elles sont sinon largement hors du contrôle direct des applications en mode utilisateur.

Lors de l’ouverture ou de la création d’un fichier avec la fonction CreateFile , l’indicateur FILE_FLAG_NO_BUFFERING peut être spécifié pour désactiver la mise en cache système des données lues ou écrites dans le fichier. Bien que cela donne un contrôle total et direct sur la mise en mémoire tampon des E/S de données, dans le cas de fichiers et d’appareils similaires, il existe des exigences d’alignement des données qui doivent être prises en compte.

Notes

Ces informations d’alignement s’appliquent aux E/S sur les appareils tels que les fichiers qui prennent en charge la recherche et le concept de pointeurs de position de fichier (ou décalages). Pour les appareils qui ne recherchent pas, tels que les canaux nommés ou les périphériques de communication, la désactivation de la mise en mémoire tampon peut ne pas nécessiter un alignement particulier. Toutes les limitations ou les gains d’efficacité qui peuvent être obtenus par l’alignement dans ce cas dépendent de la technologie sous-jacente.

 

Dans un exemple simple, l’application ouvre un fichier pour l’accès en écriture avec l’indicateur FILE_FLAG_NO_BUFFERING , puis effectue un appel à la fonction WriteFile à l’aide d’une mémoire tampon de données définie dans l’application. Cette mémoire tampon locale est, dans ces circonstances, la seule mémoire tampon de fichier qui existe pour cette opération. En raison de la disposition de disque physique, de la disposition du stockage du système de fichiers et du suivi de la position des pointeurs de fichiers au niveau du système, cette opération d’écriture échoue, sauf si les mémoires tampons de données définies localement répondent à certains critères d’alignement, décrits dans la section suivante.

Notes

La discussion sur la mise en cache ne prend pas en compte la mise en cache matérielle sur le disque physique lui-même, qui ne peut en aucun cas être sous le contrôle direct du système. Cela n’a aucun effet sur les exigences spécifiées dans cette rubrique.

 

Pour plus d’informations sur la façon dont FILE_FLAG_NO_BUFFERING interagit avec d’autres indicateurs liés au cache, consultez CreateFile.

Alignement et exigences d’accès aux fichiers

Comme indiqué précédemment, une application doit répondre à certaines exigences lors de l’utilisation de fichiers ouverts avec FILE_FLAG_NO_BUFFERING. Les spécificités suivantes s’appliquent :

  • Les tailles d’accès aux fichiers, y compris le décalage de fichier facultatif dans la structure CHEVAUCHEMENT, si elles sont spécifiées, doivent être pour un nombre d’octets qui est un multiple entier de la taille du secteur du volume. Par exemple, si la taille de secteur est de 512 octets, une application peut demander des lectures et des écritures de 512, 1 024, 1 536 ou 2 048 octets, mais pas de 335, 981 ou 7 171 octets.
  • Les adresses de mémoire tampon d’accès aux fichiers pour les opérations de lecture et d’écriture doivent être alignées sur les secteurs physiques, ce qui signifie alignées sur les adresses en mémoire qui sont des multiples entiers de la taille du secteur physique du volume. Selon le disque, cette exigence peut ne pas être appliquée.

Les développeurs d’applications doivent prendre note des nouveaux types de périphériques de stockage introduits sur le marché avec une taille de secteur multimédia physique de 4 096 octets. Le nom du secteur de ces appareils est « Format avancé ». Comme il peut y avoir des problèmes de compatibilité avec l’introduction directe de 4 096 octets comme unité d’adressage pour le média, une solution de compatibilité temporaire consiste à introduire des appareils qui émulent un périphérique de stockage de secteur de 512 octets standard, mais rendent disponibles des informations sur la taille réelle du secteur via les commandes ATA et SCSI standard.

À la suite de cette émulation, il existe essentiellement deux tailles de secteur que les développeurs devront comprendre :

  • Secteur logique : unité utilisée pour l’adressage de blocs logiques pour le média. Nous pouvons également le considérer comme la plus petite unité d’écriture que le stockage peut accepter. Il s’agit de l’émulation.
  • Secteur physique : unité pour laquelle les opérations de lecture et d’écriture sur l’appareil sont effectuées en une seule opération. Il s’agit de l’unité d’écriture atomique, et sur laquelle les E/S non chiffrées doivent être alignées afin d’avoir des performances et des caractéristiques de fiabilité optimales.

La plupart des API Windows actuelles, telles que IOCTL_DISK_GET_DRIVE_GEOMETRY et GetDiskFreeSpace, retournent la taille du secteur logique, mais la taille de secteur physique peut être récupérée via le code de contrôle IOCTL_STORAGE_QUERY_PROPERTY , avec les informations pertinentes contenues dans le membre BytesPerPhysicalSector dans la structure STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR . Pour obtenir un exemple, consultez l’exemple de code à STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR. Microsoft recommande vivement aux développeurs d’aligner les E/S non déboguées sur la taille du secteur physique, comme indiqué par le code de contrôle IOCTL_STORAGE_QUERY_PROPERTY pour s’assurer que leurs applications sont préparées pour cette transition de taille de secteur.

Windows Server 2003 et Windows XP : La structure STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR n’est pas disponible. Il a été introduit avec Windows Vista et Windows Server 2008.

Étant donné que les adresses de mémoire tampon pour les opérations de lecture et d’écriture doivent être alignées sur les secteurs, l’application doit contrôler directement la façon dont ces mémoires tampons sont allouées. Une façon d’aligner les mémoires tampons sur un secteur consiste à utiliser la fonction VirtualAlloc pour allouer les mémoires tampons. Tenez compte des éléments suivants :

  • VirtualAlloc alloue de la mémoire alignée sur les adresses qui sont des multiples entiers de la taille de page du système. La taille de la page est de 4 096 octets sur x64 et x86 ou de 8 192 octets pour les systèmes Itanium. Pour plus d’informations, consultez la fonction GetSystemInfo .
  • La taille de secteur est généralement de 512 à 4 096 octets pour les périphériques de stockage en accès direct (disques durs) et de 2 048 octets pour les CD-ROMs.
  • Les tailles de page et de secteur ont une puissance de 2.

Par conséquent, dans la plupart des cas, la mémoire alignée sur les pages est également alignée sur un secteur, car le cas où la taille de secteur est supérieure à la taille de la page est rare.

Une autre façon d’obtenir des mémoires tampons alignées manuellement consiste à utiliser la fonction _aligned_malloc à partir de la bibliothèque C Run-Time. Pour obtenir un exemple de contrôle manuel de l’alignement de la mémoire tampon, consultez l’exemple de code de langage C++ dans la section Exemple de code de WriteFile.