Буферизованный и небуферизованный IO

Я узнал, что по умолчанию ввод / вывод в программах буферизуется, то есть они обслуживаются из временного хранилища в запрашивающую программу. Я понимаю, что буферизация улучшает производительность ввода-вывода (возможно, путем сокращения системных вызовов). Я видел примеры отключения буферизации, например setvbuf в C. В чем разница между двумя режимами и когда нужно использовать другую?

Вы хотите получать небуферизованный вывод, когда хотите убедиться, что вывод был записан до продолжения. Одним из примеров является стандартная ошибка в библиотеке времени выполнения C – это обычно небуферировано по умолчанию. Поскольку ошибки (надеюсь) нечасты, вы хотите узнать о них немедленно. С другой стороны, стандартный вывод буферизуется просто потому, что предполагается, что через него будет поступать гораздо больше данных.

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

Кроме того, это не просто системные вызовы, которые сведены к минимуму, но также и диск ввода-вывода. Скажем, программа читает файл по одному байту за раз. С небуферизованным входом вы выходите на (относительно очень медленный) диск для каждого байта, хотя он, вероятно, должен все равно читать в целом блоке (на самом аппарате диска могут быть буферы, но вы все равно выходите на controller диска который будет медленнее, чем доступ в памяти).

Буферизацией весь блок считывается в буфер сразу, а отдельные байты доставляются вам из (буферной) области буфера (в памяти, невероятно быстро).

Имейте в виду, что буферизация может принимать различные формы, например, в следующем примере:

 +-------------------+-------------------+ | Process A | Process B | +-------------------+-------------------+ | C runtime library | C runtime library | C RTL buffers +-------------------+-------------------+ | OS caches | Operating system buffers +---------------------------------------+ | Disk controller hardware cache | Disk hardware buffers +---------------------------------------+ | Disk | +---------------------------------------+ 

Вы хотите небуферизованный вывод, когда у вас уже есть большая последовательность байтов, готовых записать на диск, и хотите избежать дополнительной копии во второй буфер посередине.

Буферизованные выходные streamи будут накапливать результаты записи в промежуточный буфер, отправляя их в файловую систему ОС только при накоплении достаточного количества данных (или запрашивается flush() ). Это уменьшает количество вызовов файловой системы. Поскольку вызовы файловой системы могут быть дорогими на большинстве платформ (по сравнению с коротким memcpy ), буферизованный вывод является чистым выигрышем при выполнении большого количества небольших записей. Небуферизованный вывод обычно лучше, если у вас уже есть большие буферы для отправки – копирование в промежуточный буфер еще не уменьшит количество вызовов ОС и добавит дополнительную работу.

Небуферизованный вывод не имеет ничего общего с обеспечением доступа ваших данных к диску; эта функциональность обеспечивается flush() и работает как с буферизированными, так и с небуферизованными streamами. Небуферизованные записи ввода-вывода не гарантируют, что данные достигли физического диска – файловая система ОС может хранить данные вашей копии на неопределенный срок, не записывая их на диск, если захочет. Требуется только зафиксировать его на диске при вызове flush() . (Обратите внимание, что close() вызовет flush() от вашего имени).

  • Почему NaN не равен NaN?
  • Какой смысл ООП?
  • Почему переменные «i» и «j» используются для счетчиков?
  • Можете ли вы объяснить шаблон дизайна контекста?
  • Получение ближайшего соответствия строк
  • В каких ситуациях используется восьмеричная база?
  • Определите, перекрываются ли два диапазона дат
  • Генерация перетасованного диапазона с использованием PRNG, а не перетасовка
  • GOTO по-прежнему считается вредным?
  • Полезно ли использовать «goto» на языке, который поддерживает циклы и функции? Если да, то почему?
  • Должен ли я тестировать частные методы или только публичные?
  • Interesting Posts

    GRUB в MBR или раздел?

    Когда добавляется новая строка в базе данных, необходимо вызвать внешнюю программу командной строки

    ORA-00054: ресурс занят и приобретается с указанным NOWAIT или истечением времени ожидания

    Как я могу создавать тесты в Android Studio?

    Каков наилучший подход к classам имен?

    Неужели Yahoo внезапно прекратил свою финансовую загрузку API?

    Почему Firefox интерпретирует 100% -ное масштабирование по-разному для других браузеров?

    выход основной нити, другой выход тоже?

    Ошибка метатег-метаданных в Content-Security-Policy. Ошибка в приложении для телефонного разговора.

    Каковы различия между гибким основанием и шириной?

    Можно скопировать все свойства определенного элемента управления? (Формы windows C #)

    Как отсортировать HashMap в Java

    Вызовите нестатический метод на стороне сервера с клиентской стороны с помощью JavsScript

    Как преобразовать String в SecretKey

    swift Сделайте снимок и сохраните его в библиотеке фотографий

    Давайте будем гением компьютера.