Аналогичным образом при выполнении операций ввода операционная система получает данные от активных устройств ввода (клавиатуры, дисковода, сетевого адаптера) и записывает их во входной буфер, находящийся в памяти. Данные остаются во входном буфере до тех пор, пока в программе не будет вызван оператор или функция read, после чего они будут скопированы из буфера операционной системы в пространство памяти, соответствующее переменной в программе.
Преимущества буферизации являются очень значительными, особенно если программа выполняет ввод-вывод неравномерно, т.е. выполняет многочисленные операции чтения и записи данных непредсказуемого объема через произвольные моменты времени. Вместо ожидания выполнения каждой операции на аппаратном уровне, данные надежно буферизуются в операционной системе и “сбрасываются” на устройство вывода, когда аппаратные средства могут их принять.
Буферы по принципу действия представляют собой циклические очереди FIFO (сокращение от first in first out). После заполнения буфера операционная система просто продолжает записывать новые данные с его начала. Операционная система ведет два указателя на каждый из своих буферов ввода-вывода. Указатель записи - это место, с которого выполняется ввод новых данных в буфер. Указатель чтения обозначает позицию, с которой выполняется перемещение данных из буфера в новое место назначения. Например, при операциях записи каждый выполненный вызов функции print добавляет данные к выходному буферу и продвигает вперед указатель записи. Операционная система считывает уже записанные данные, начиная с указателя чтения, и копирует их в аппаратное устройство низкого уровня.