Имеет ли библиотека stdio 3 уровня буферизации или 2 уровня буферизации?

Имеет ли библиотека stdio 3 уровня буферизации или 2 уровня буферизации?

ОтИнтерфейс программирования Linux:
(Я прочитал соответствующие разделы. Я вставил эту сводную диаграмму просто для иллюстрации.) введите описание изображения здесь

Я знаю, что для прямого ввода-вывода, который использует readи writeсистемные вызовы, есть 2 уровня буферизации. read/write buffer+ kernel buffer.

При использовании stdioбиблиотечных вызовов, которые построены поверх прямых системных вызовов ввода-вывода,

  1. stdio buffer+ read/write buffer+ kernel buffer, 3 уровня буферизации,

или

  1. 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говорит вам, какой эффект, а не как это делается.

Связанный контент