Ответ 1
Вы хотите получать небуферизованный вывод, когда хотите убедиться, что вывод был записан до продолжения. Одним из примеров является стандартная ошибка в библиотеке времени выполнения C - это обычно небуферировано по умолчанию. Поскольку ошибки (надеюсь) нечасты, вы хотите узнать о них немедленно. С другой стороны, стандартный вывод буферизуется просто потому, что предполагается, что через него будет поступать гораздо больше данных.
Другим примером является библиотека протоколирования. Если ваши сообщения журнала хранятся в буферах в вашем процессе, а ядро процесса выгружается, есть очень хороший шанс, что вывод никогда не будет записан.
Кроме того, это не только системные вызовы, которые сведены к минимуму, но и операции ввода-вывода. Скажем, программа читает файл по одному байту за раз. С небуферизованным входом вы выходите на (относительно очень медленный) диск для каждого байта, хотя он, вероятно, должен все равно читать в целом блоке (на самом аппарате диска могут быть буферы, но вы все равно выходите на контроллер диска который будет медленнее, чем доступ в память).
Буферизацией, весь блок считывается в буфер сразу, а отдельные байты доставляются вам из (в памяти, невероятно быстро) буферной области.
Имейте в виду, что буферизация может принимать различные формы, например, в следующем примере:
+-------------------+-------------------+
| 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 |
+---------------------------------------+