Под буфером обычно понимается некоторая область памяти для
запоминания информации при обмене данных между двумя устройствами,
двумя процессами или процессом и устройством. Обмен информацией
между двумя процессами относится к области кооперации процессов, и
мы подробно рассмотрели его организацию в соответствующей лекции.
Здесь нас будет интересовать использование буферов в том случае,
когда одним из участников обмена является внешнее устройство.
Существует три причины, приводящие к использованию буферов в
базовой подсистеме ввода-вывода.
Первая причина буферизации – это разные скорости приема и передачи
информации, которыми обладают участники обмена. Рассмотрим,
например, случай передачи потока данных от клавиатуры к модему.
Скорость, с которой поставляет информацию клавиатура, определяется
скоростью набора текста человеком и обычно существенно меньше
скорости передачи данных модемом. Для того чтобы не занимать модем
на все время набора текста, делая его недоступным для других
процессов и устройств, целесообразно накапливать введенную
информацию в буфере или нескольких буферах достаточного размера и
отсылать ее через модем после заполнения буферов. Вторая причина
буферизации – это разные объемы данных, которые могут быть приняты
или получены участниками обмена единовременно. Возьмем другой
пример. Пусть информация поставляется модемом и записывается на
жесткий диск. Помимо обладания разными скоростями совершения
операций, модем и жесткий диск представляют собой устройства
разного типа. Модем является символьным устройством и выдает данные
байт за байтом, в то время как диск является блочным устройством и
для проведения операции записи для него требуется накопить
необходимый блок данных в буфере. Здесь также можно применять более
одного буфера. После заполнения первого буфера модем начинает
заполнять второй, одновременно с записью первого на жесткий диск.
Поскольку скорость работы жесткого диска в тысячи раз больше, чем
скорость работы модема, к моменту заполнения второго буфера
операция записи первого будет завершена, и модем снова сможет
заполнять первый буфер одновременно с записью второго на диск.
Третья причина буферизации связана с необходимостью копирования
информации из приложений, осуществляющих ввод-вывод, в буфер ядра
операционной системы и обратно. Допустим, что некоторый
пользовательский процесс пожелал вывести информацию из своего
адресного пространства на внешнее устройство. Для этого он должен
выполнить системный вызов с обобщенным названием write, передав в
качестве параметров адрес области памяти, где расположены данные, и
их объем. Если внешнее устройство временно занято, то возможна
ситуация, когда к моменту его освобождения содержимое нужной
области окажется испорченным (например, при использовании
асинхронной формы системного вызова). Чтобы избежать возникновения
подобных ситуаций, проще всего в начале работы системного вызова
скопировать необходимые данные в буфер ядра операционной системы,
постоянно находящийся в оперативной памяти, и выводить их на
устройство из этого буфера. Под словом кэш (cache – "тайник,
запас"), этимологию которого мы не будем здесь рассматривать,
обычно понимают область быстрой памяти, содержащую копию данных,
расположенных где-либо в более медленной памяти, предназначенную
для ускорения работы вычислительной системы. Мы с вами сталкивались
с этим понятием при рассмотрении иерархии памяти. В базовой
подсистеме ввода-вывода не следует смешивать два понятия,
буферизацию и кэширование, хотя зачастую для выполнения этих
функций отводится одна и та же область памяти. Буфер часто содержит
единственный набор данных, существующий в системе, в то время как
кэш по определению содержит копию данных, существующих где-нибудь
еще. Например, буфер, используемый базовой подсистемой для
копирования данных из пользовательского пространства процесса при
выводе на диск, может в свою очередь применяться как кэш для этих
данных, если операции модификации и повторного чтения данного блока
выполняются достаточно часто.
Функции буферизации и кэширования не обязательно должны быть
локализованы в базовой подсистеме ввода-вывода. Они могут быть
частично реализованы в драйверах и даже в контроллерах устройств,
скрытно по отношению к базовой подсистеме.
Буферизация и кэширование
78
0
2 минуты
Темы:
Понравилась работу? Лайкни ее и оставь свой комментарий!
Для автора это очень важно, это стимулирует его на новое творчество!