2010-02-08 5 views
3

Comment puis-je écrire quelque chose dans un fichier C++ sans utiliser le cache système et le cache du lecteur? Je veux juste écrire exactement sur le disque dur indépendamment de tous les paramètres du cache du système.Écrire un fichier sans cache système et hdd

+3

Ceci est spécifique au système d'exploitation. – Christopher

+3

Il serait probablement utile si vous avez expliqué * pourquoi * vous pourriez vouloir faire cela. En d'autres termes, qu'est-ce que vous essayez vraiment d'accomplir? –

+0

J'ai entendu dire que certaines bases de données fonctionnent comme ceci (donc elles sont sûres que toutes les données sont écrites sur le disque) et je suis juste curieux de savoir si cela peut être fait en pur C++. –

Répondre

3

Sauf si vous écrivez un pilote de périphérique de disque, vous ne pouvez pas garantir qu'il n'y aura aucun cache ou traitement effectué avec votre écriture. La bibliothèque d'exécution C expose fflush(FILE *) pour cela. Windows a FlushFileBuffers ainsi qu'un drapeau que vous pouvez passer à CreateFile (FILE_FLAG_NO_BUFFERING) (qui lui-même ajoute des restrictions sur ce que vous pouvez faire). Une alternative à essayer de contourner la mise en cache d'écriture consiste à rendre vos structures de données résilientes à une défaillance partielle. Pour les fichiers, une technique courante consiste à écrire l'en-tête du fichier après l'écriture du reste du fichier. En supposant Murphy et non un comportement machiavélique, cela devrait suffire.

Ou utilisez les fonctions de remplacement ou de transaction de fichier fournies par le système d'exploitation (voir ReplaceFile et Transactional NTFS pour Windows).

+1

En fait, cela ne protège même pas contre Murphy. Le réordonnancement commun des écritures entraînera le réordonnement des écritures dans l'ordre physique. Même si l'en-tête est fourni au système d'exploitation en dernier lieu, il se peut que le disque dur soit le premier s'il y a suffisamment de mémoire tampon disponible. Notez que les disques modernes peuvent se réorganiser eux-mêmes, en dehors du système d'exploitation. (SATA NCQ) – MSalters

1

Sur Linux, vous pouvez passer de O_DIRECT à open(2) afin d'essayer d'éviter le cache du système d'exploitation, mais vous n'avez pas le même niveau de contrôle sur le cache du disque.

2

Cela dépend fortement du système d'exploitation. Sous Windows, vous pouvez spécifier FILE_FLAG_NO_BUFFERING lorsque vous ouvrez le fichier avec CreateFile pour désactiver la mise en cache du système. Vous n'allez pas contourner la mise en cache du disque dur.

+1

Si vous passez à la fois 'FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING', Windows indiquera au disque de contourner sa mise en cache aussi. – MSalters

Questions connexes