Буферизация и кеширование в ОС — это использование некоторой области памяти компьютера для запоминания информации в процессе информационного обмена между двумя устройствами.
Введение
Буфером является определённая область памяти, которая предназначена для запоминания информации при осуществлении информационного обмена между парой устройств или процессов. Обмен информацией между парой процессов следует отнести к сфере кооперации процессов. Существуют следующие причины, ведущие к необходимости использования буферизации в базовой подсистеме ввода-вывода:
- Различное быстродействие при приёме и передаче информации, которым располагают обменивающиеся стороны.
- Различные объемы информационных данных, которые могут быть приняты или получены сторонами обмена единовременно.
- Необходимость копирования информации из приложений, которые осуществляют ввод и вывод, в буфер ядра операционной системы и в обратном направлении.
Буферизация и кеширование в ОС
Различные скорости могут быть, к примеру, при передаче набора данных от клавиатуры к модему. Скорость, с которой способна предоставлять информацию клавиатура, задаётся скоростью набора текста пользователем и, как правило, она значительно меньше скорости передачи данных модемом. Для того чтобы модем не простаивал в течение всего времени набора текста и был недоступным для иных процессов и устройств, имеет смысл накапливать введенную информацию в буфере или даже наборе буферов необходимого размера и отправлять её через модем после наполнения буферов.
Рассмотрим пример разного объема данных, которые могут быть отправлены или получены сторонами обмена одновременно. К примеру, информация передаётся модемом и должна быть сохранена на жестком диске. Помимо наличия различных скоростей выполнения операций, модем и жесткий диск являются устройствами различного типа. Модем считается символьным устройством и может выдавать данные байт за байтом, при этом жёсткий диск может быть блочным модулем и для осуществления операции записи для него необходимо выполнить накопление необходимого блока данных в буфере.
В этом случае также возможно применение более одного буфера. После наполнения первого буфера модем приступает к заполнению второго буфера, одновременно с выполнением записи информации из первого буфера на жесткий диск. Так как быстродействие жесткого диска в тысячи раз больше, чем быстродействие модема, то к моменту наполнения второго буфера операция записи из первого буфера будет уже завершена, и модем снова сможет наполнять первый буфер одновременно с процессом записи информации из второго буфера на диск.
При наличии необходимости копировать информацию из приложений, которые осуществляют ввод-вывод, в буфер ядра операционной системы и обратно может возникнуть следующая ситуация. Предположим, что какой-либо пользовательский процесс запрашивает вывод информации из своего адресного пространства на внешнее устройство. Для этого ему необходимо исполнить системный вызов, имеющий обобщенное название write, при котором осуществляется передача в качестве параметров адреса области памяти, где располагаются данные, и их объем. Если внешнее устройство оказывается занятым, то возможен вариант, что к моменту его освобождения содержимое нужной области памяти окажется испорченным (к примеру, при применении асинхронного формата системного вызова).
Для того, чтобы можно было избежать появления таких ситуаций, необходимо в начале обработки системного вызова выполнить копирование требуемых данных в буфер ядра операционной системы, который постоянно находится в оперативной памяти, и осуществлять вывод этих данных на устройство из этого буфера.
Термин кэш (cache, то есть «тайник, запас») означает область быстрой памяти, которая содержит копию данных, располагающихся где-то в более медленной области памяти, предназначенную для повышения быстродействия вычислительной системы. В базовой подсистеме ввода-вывода нельзя смешивать эти понятия, а именно, буферизацию и кэширование, хотя часто для осуществления этих функций может отводиться одна и та же зона памяти. Буфер зачастую может содержать единственный набор данных, имеющийся в системе, в то время как кэш по существу может содержать копию данных, присутствующих где-либо еще. К примеру, буфер, применяемый базовой подсистемой для копирования данных из пользовательского пространства процесса при выводе на диск, может в свою очередь использоваться как кэш для этих данных, если операции модификации и повторного прочтения этого блока должны исполнятся достаточно часто.
Функции буферизации и кэширования не всегда могут располагаться в базовой подсистеме ввода-вывода. Эти функции можно частично реализовать в драйверах и даже в контроллерах устройств, в скрытной форме по отношению к базовой подсистеме.
Понятие spooling обозначает механизм, который позволяет совместить реальные операции ввода-вывода одного задания с выполнением другого задания. Под словом spool следует понимать буфер, содержащий входные или выходные данные для устройства, на котором необходимо избегать чередования его применения разными процессами. Следует отметить, что в современных вычислительных системах spool для ввода данных фактически не применяется, а главным образом предназначен для накопления выходной информации.
Рассмотрим пример, где внешним устройством является принтер. Хотя принтер не способен печатать информацию, которая поступает одновременно от нескольких процессов, но может быть желательным разрешение процессам осуществлять вывод информации на принтер в параллельном режиме. Для этого операционная система вместо передачи информации напрямую на принтер должна накапливать выводимую информацию в буферах на диске, которые организованы в формате отдельного spool-файла для каждого процесса. По завершению некоторого процесса соответствующий ему spool-файл должен быть поставлен в очередь для реальной печати. Механизм, который обеспечивает подобное действие, и называется spooling.