ОтИнтерфейс программирования Linux:
(Я прочитал соответствующие разделы. Я вставил эту сводную диаграмму просто для иллюстрации.)
Я знаю, что для прямого ввода-вывода, который использует read
и write
системные вызовы, есть 2 уровня буферизации. read/write buffer
+ kernel buffer
.
При использовании stdio
библиотечных вызовов, которые построены поверх прямых системных вызовов ввода-вывода,
stdio buffer
+read/write buffer
+kernel buffer
, 3 уровня буферизации,
или
stdio
иwrite/read
используют один и тот же буфер, 2 уровня буферизации
stdio calls
<---> user buffer
<-----> read/write
+kernel buffer
?
(Я думаю, что это 2 уровня буферизации, но я хочу быть уверен.)
решение1
В общем случае есть два уровня. Буфер в пользовательском пространстве выделяется библиотекой stdio, и вызовы puts/printf/fprintf и т. д. помещают символы в этот буфер. На каком-то этапе (например, буфер заполнен или записана новая строка, а поток находится в режиме буферизации строк) библиотека stdio вызывает write
ядро, чтобы попросить его записать буфер. Ядро обычно копирует буфер в буфер ядра, запускает все необходимое для передачи данных в пункт назначения и возвращается. Затем пользовательское пространство может свободно использовать буфер пользовательского пространства так, как ему хочется.
Возможны (но нетипичны) различные реализации stdio, которые делают это по-разному.сфиоимеет слой совместимости stdio. Были предложены различные схемы для zero copy
и т. д. Суть в том, что это stdio
говорит вам, какой эффект, а не как это делается.