Записать системный вызов записывает данные на диск напрямую? - PullRequest
4 голосов
/ 07 декабря 2011

Я прочитал пару вопросов ( здесь ), связанных с этим, но у меня все еще есть некоторая путаница.

Насколько я понимаю, системный вызов write помещает данные в Buffered Cache (кэши ОС, как указано в этом вопросе). Когда Buffered Cache заполняется, он записывается на диск.

Буферизованный ввод-вывод - это дальнейшая оптимизация. Он кэшируется в C RTL buffers, а когда они заполняются, выдается системный вызов write для перемещения содержимого в Buffered Cache. Если я использую fflush, то на диск отправляются данные, относящиеся к этому конкретному файлу, который присутствует в C RTL buffers, а также Buffered Cache.

Правильно ли мое понимание?

1 Ответ

3 голосов
/ 07 декабря 2011

Как очищаются буферы stdio, зависит от используемой вами стандартной библиотеки C.Цитата со страницы руководства Linux :

Обратите внимание, что fflush () очищает только буферы пользовательского пространства, предоставляемые библиотекой C.Чтобы гарантировать, что данные физически хранятся на диске, буферы ядра тоже должны быть сброшены, например, с помощью sync (2) или fsync (2).

Это означает, что в системе Linux, используяfflush или переполнение буфера вызовет функцию write.Но операционная система может хранить внутренние буферы и не записывать данные на устройство.Чтобы убедиться, что данные действительно записаны на устройство, используйте fflush и низкоуровневый fsync.

Редактировать: Ответ перефразирован.

...