Да, он вызывает std::basic_ostream::flush() который сбрасывает внутренний буфер потока на следующий уровень - в пространство ядра. Он аналогичен fflush() для буферизованного I/O в C. Но этого мало. Смотри, по сути у нас есть три буфера: буфер в std::basic_ostream (аналогичен буферу в fopen/fwrite/fclose из C), внутренние буферы ядра (в частности буфер ФС) и буфер устройства. На последний мы повлиять не можем (к сожалению), а вот на первые два - без проблем. С первым работает flush()/fflush(), со вторым работает sync()/fsync()/fdatasync(). sync() - это "удар по площадям". Он сбрасывает все дисковые буферы - тормоз тот еще. fsync() - это "точечный удар". Он сбрасывает только данные и метаданные относящиеся к указанному файловому дескриптору. fdatasync() - это тот-же fsync(), но он не трогает метаданные. Т.е. вся важная информация будет записана на устройство, а atime/mtime останутся в буфере. Он меньше "дергает" устройство и быстрее работает, и при этом дает достаточные гарантии по данным. Очень жаль только что из std::basic_ostream последние две функции недоступны. Что касается posix_fadvise то это уже из области внутренних оптимизаций ядра. Особого эффекта от него я не заметил, но почему бы и не сказать ядру что с этим файлом мы больше не собираемся работать.
Re: Тогда еще до кучи fdatasync и posix_fadvise с флагом POSIX_FADV_DONTNEED.
Смотри, по сути у нас есть три буфера: буфер в std::basic_ostream (аналогичен буферу в fopen/fwrite/fclose из C), внутренние буферы ядра (в частности буфер ФС) и буфер устройства. На последний мы повлиять не можем (к сожалению), а вот на первые два - без проблем. С первым работает flush()/fflush(), со вторым работает sync()/fsync()/fdatasync().
sync() - это "удар по площадям". Он сбрасывает все дисковые буферы - тормоз тот еще.
fsync() - это "точечный удар". Он сбрасывает только данные и метаданные относящиеся к указанному файловому дескриптору.
fdatasync() - это тот-же fsync(), но он не трогает метаданные. Т.е. вся важная информация будет записана на устройство, а atime/mtime останутся в буфере. Он меньше "дергает" устройство и быстрее работает, и при этом дает достаточные гарантии по данным.
Очень жаль только что из std::basic_ostream последние две функции недоступны.
Что касается posix_fadvise то это уже из области внутренних оптимизаций ядра. Особого эффекта от него я не заметил, но почему бы и не сказать ядру что с этим файлом мы больше не собираемся работать.