2010-02-08 2 views
3

Как я могу написать что-то в файл на C++ без использования системного кеша и кэша накопителя? Я просто хочу написать точно на hdd независимо от всех настроек системного кеша.Запись файла без кеша системы и hdd

+3

Это конкретная ОС. – Christopher

+3

Возможно, это поможет, если вы объясните * почему * вы можете это сделать. Другими словами, что вы * на самом деле пытаетесь достичь? –

+0

Я слышал, что некоторые базы данных работают так (поэтому они уверены, что все данные записаны на диск), и мне просто интересно, если это можно сделать в чистом C++. –

ответ

3

Если вы не пишете драйвер дискового устройства, вы не можете гарантировать, что не будет никакого кеша или обработки, выполненной с вашей записью.

Библиотека времени C предоставляет fflush(FILE *) для этого. Windows имеет FlushFileBuffers, а также флаг, который вы можете передать в CreateFile (FILE_FLAG_NO_BUFFERING) (который сам добавляет ограничений на то, что вы можете сделать).

Альтернативой попытке обойти кэширование записи является то, что ваши структуры данных устойчивы к частичной ошибке. Для файлов одним из популярных способов является запись заголовка файла после записи остальной части файла. Предполагая, что Мерфи, а не поведение Макиавелла, этого должно быть достаточно.

Или используйте функции замены или транзакции, предоставленные операционной системой (см. ReplaceFile и Transactional NTFS для Windows).

+1

На самом деле, это даже не защищает от Мерфи. Обычное переупорядочение записи приведет к переупорядочению записей в физическом порядке. Несмотря на то, что заголовок предоставляется последней ОС, он может быть первым, если имеется достаточный буфер. Обратите внимание, что современные диски могут делать это самостоятельно, вне операционной системы. (SATA NCQ) – MSalters

1

В Linux вы можете передать O_DIRECT на номер open(2), чтобы избежать кэширования ОС, но у вас нет такого же уровня контроля над кешем накопителя.

2

Это сильно зависит от операционной системы. В Windows вы можете указать FILE_FLAG_NO_BUFFERING, когда вы открываете файл с CreateFile, чтобы отключить системное кэширование. Однако вы не сможете обойти кэширование на жестком диске.

+1

Если вы передадите как 'FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING', Windows сообщит, что диск также будет обходить его кеширование. – MSalters

Смежные вопросы