Как буферизованный ввод-вывод снижает накладные расходы, которые возникли бы при использовании небуферизованного ввода-вывода?

Из этого руководства,

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

Чтобы уменьшить такие накладные расходы, платформа Java реализует буферизованные потоки ввода-вывода. Буферизованные входные потоки считывают данные из области памяти, известной как буфер; собственный API ввода вызывается только тогда, когда буфер пуст. Точно так же буферизованные потоки вывода записывают данные в буфер, а собственный API вывода вызывается только при заполнении буфера. сильный>

Я понимаю, что такие операции, как доступ к диску, сетевая активность и т. д., вызовут накладные расходы памяти или времени выполнения для базовой ОС.

Но вопрос в том, как программа, читающая/записывающая в определенную область памяти (буфер), уменьшает эти накладные расходы?

Я вижу это как добавление пары дополнительных шагов: сначала программа запрашивает ОС, например, прочитать данные из файла и записать их в буфер, а затем программа читает их из буфера.


person Solace    schedule 22.02.2016    source источник
comment
Что ж, моя оперативная память намного быстрее, чем мой жесткий диск, и имеет лучшее соединение с процессором, чем жесткий диск или твердотельный накопитель.   -  person Tom    schedule 22.02.2016
comment
В дополнение к ответу @Code-Apprententice вы можете проверить это stackoverflow.com/questions/9648811/   -  person Chad Dienhart    schedule 22.02.2016


Ответы (1)


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

person Code-Apprentice    schedule 22.02.2016
comment
Спасибо. Но означает ли это также, что последний абзац моего вопроса верен, т. Е. Использование буферизованных потоков по-прежнему требует от ОС запроса на получение данных, скажем, с диска, и их сохранение в нашем буфере; откуда наша программа собирается его прочитать. Я имею в виду, должен ли я вынести из этого, что буферы полезны, потому что после того, как данные были помещены туда в буфер (базовой ОС), наша программа может читать их снова и снова, несколько раз, не запрашивая ОС каждый раз . - person Solace; 22.02.2016
comment
@Solace Да, с помощью буферизации мы можем уменьшить количество запросов к ОС для выполнения операции ввода-вывода. Это полезно не только для повторного чтения одних и тех же данных, но и для чтения смежных данных, скажем, из файла или сети. - person Code-Apprentice; 22.02.2016