Сделай Сам Свою Работу на 5

Буферизация : ПРОЧИТАТЬ и ЗАПИСАТЬ

 

Записи считываются во входной буфер, обрабатываются в рабочей области и записываются из выходного буфера. Рабочая область обычно содержит одну запись. Каждый буфер содержит блок данных, который может быть одной записью или несколькими, в зависимости от того, имеет место блокирование или нет. Команда, которая используется для первоначального заполнения буфера данными, как правило, называется ПРОЧИТАТЬ (READ), а для освобождения выходного буфера - ЗАПИСАТЬ (WRITE).

Первоначально при буферизации использовался один входной и один выходной буфер. Когда обработка записи в рабочей области завершалась, запись копировалась в выходной буфер, и выдавалась команда ЗАПИСАТЬ. Затем следующая запись переписывалась из входного буфера в рабочую область, а для получения следующей записи выполнялась команда ПРОЧИТАТЬ. Доступ к входному буферу являлся критическим интервалом по отношению к команде ПРОЧИТАТЬ и копированию записи в рабочую область. Аналогично, критическим интервалом являлся доступ к выходному буферу. Реализация взаимного исключения могла вызвать задержки, возникающие из-за разных относительных скоростей обработки данных и исполнения ввода-вывода. Взаимное исключение без больших задержек гораздо легче реализовать, если имеются два входных и два выходных буфера; эта форма буферизации называется двойной (или бу­феризацией с копированием), и она встречается наиболее часто. Пока заполняется один буфер, записи для обработки выбираются из второго. Когда в нем больше нет записей, эти два буфера меняются ролями. Аналогичное чередование применимо и для двух выходных буферов. Двойная буферизация показана на рис. 6.4.

 

 

Рис. 6.4. Двойная буферизация

До сих пор подразумевалось, что входные и выходные записи имеют один и тот же размер, а входные и выходные файлы соответствуют друг другу. Однако так бывает не всегда. Программа может использовать несколько входных и несколько выходных файлов, каждый из которых связан с парой буферов соответствующего размера. Размер рабочей области может зависеть от того, какое количество записей из каждого файла необходимо одновременно для обработки. Тем не менее во многих применениях, требующих корректировки файлов, входной буфер, рабочая область и выходной буфер действительно имеют один и тот же размер записи.



Можно избежать копирования записей из входного буфера в рабочую область и затем в выходной буфер, используя косвенную адресацию. Данная область оперативной памяти сначала служит входным буфером, потом рабочей областью, наконец, выходным буфером, после чего она снова используется как входной буфер. Если размеры входного буфера, рабочей области и выходного буфера неодинаковы, часть памяти будет тратиться впустую. Каждая буферная область определяется указателем, установленным на ее начало, и вместо копирования записей система переустанавливает указатели. Этот подход, называемый “обменной буферизацией”, более уместно назвать косвенной буферизацией (см. рис. 6.5). Отметим наличие одного или нескольких запасных буферов, которые можно использовать в том случае, когда некоторый буфер ввода полный или буфер вывода пустой.

Одним из вариантов косвенной буферизации является циклическая буферизация. Она используется, когда ввод, обработка и вывод достаточно хорошо синхронизованы. При циклической буферизации функции ввода, обработки и вывода выполняются последовательно и синхронно над некоторым множеством буферов. На рис.6.6 показаны три последовательные стадии использования циклических буферов. Верхний буфер служит сначала для ввода, затем для обработки и, наконец, для вывода, после чего цикл повторяется, начиная с состояния k+3. Вращающийся круг не является реальным устройством, а используется для наглядности. В каждом из его трех секторов указывается функция соответствующего буфера. Когда ввод, обработка и вывод в одном состоянии завершены, то круг поворачивается на одну тр­еть против часовой стрелки. Можно также считать, что поворачиваются буфера и исполняют разные обязанности.

Если процесс обрабатывает несколько файлов, а интенсивность их использования меняется со временем, то нет необходимости выделять под буфера память, размер которой равен сумме максимального числа буферов, необходимых для обработки каждого файла. Вместо этого можно использовать множество буферов, а программы обработки файлов должны выделять или отнимать буфер по мере надобности. Память для буферов может также совместно использоваться несколькими процессами, каждый из которых получает буфер из некоторой единой области памяти и возвращает его обра­тно.

 

 

 

Рис. 6.5. Косвенная буферизация

 



©2015- 2019 stydopedia.ru Все материалы защищены законодательством РФ.