Анализ принципа работы БП адаптера связи ОП - Работка буферной памяти адаптера связи

Буферная память этопамять для промежуточного хранения данных. Применяется при обмене данными между двумя устройствами, обладающими различной скоростью обработки информации, чтобы работа "тихоходного" устройства не снижала их общую производительность. Характерным примером применения БП является выдача данных программой на принтер. Так как скорость передачи данных от программы к принтеру неизмеримо выше, чем скорость работы принтера, то, чтобы не замедлять работу программы на время выдачи данных, программа помещает данные в БП и продолжает свою работу, а принтер "самостоятельно" извлекает их со своей скоростью и печатает, не требуя прерывания работы программы. Многие внешние устройства имеют собственную Б. п., кроме того, в качестве БП может служить специально выделяемая операционной системой область оперативной памяти.

Буферная память имеет еще несколько назначений:

Целью механизма буферной памяти, является уменьшение потребляемых ресурсов объектом приемником, требующего сравнительно больших затрат, путем уменьшения частоты поступления потока данных в объект-приемник;

Целью механизма буферной памяти является создание участка оперативной памяти для отработки процессов памяти, и других процессов, время выполнения которых зависит от размеров памяти. Буферной памятью называется - объект памяти, которым владеют одновременно два объекта, не связанные между собой.

Обычно два объекта, владеющие буферной памятью, называются по типу их отношений с буфером, источник - приемник. Один объект источник помещает данные в буфер, а другой объект - приемник снимает их с буфера. Но сами эти объекты, не связаны между собой никакой архитектурной зависимостью кода. Между прочим, такая модель взаимодействия получила название прокси, когда существует система-посредник между двумя системами. То есть буфер иными словами является прокси-объектом, а источник - буфер - приемник - прокси-системой. Рабочий цикл буфера.

Буферная память имеет три основных состояния:

    -состояние сброса; -состояние наполнения; -состояние передачи.

Состояние сброса - это первоначальное состояние буфера, в котором весь буфер считается пустым.

Состоянием наполнения называется момент времени, в котором информация помещается в буфер.

Состоянием передачи называется процесс, когда информация из буфера перемещается в объект приемник.

Графическое изображение цикла работы буфера представлено на рисунке 1.

графическое изображение цикла работы буфера

Рисунок 1 - Графическое изображение цикла работы буфера

Состояние сброса является начальным состоянием буферной памяти, после того как она заказана и выделена. Буферную память, как правило, заказывает третье лицо, и назначает ее владельцам, источнику и приемнику. То есть источник, и приемник не подозревают, что они работают через буфер. Очень часто буферную память заказывает и объект приемник, который, по сути, управляет выходным хранилищем данных. В этом случае, он подключается к объекту источнику и передает ему буфер. Но никогда буферную память не заказывает объект источник. Можно считать, что объект источник должен быть сконструирован так, чтобы он не подозревал, что работает с буфером. Конечно, на любое правило есть исключения, но в большинстве случаев, такое утверждение указывает на не оптимальность управляющего алгоритма, либо на возможность потенциальной ошибки в нем. Объект источник помещает поток данных в буфер, при этом этот процесс передачи может быть организован двумя методами:

    -сегментами; -произвольно.

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

    -посессионное заполнение; -циклическое; -неупорядоченное.

В первом случае источник заполняет буфер во время специальных периодов, называемых сессиями, во втором случае буфер заполняет в каком-либо непрерывном цикле, и в третьем случае буфер заполняется в произвольный момент времени. И, наконец, по способу доступа источника и приемника: компьютер буферный адаптер нейронный

    -синхронный; -асинхронные.

От приведенной выше классификации зависят методы и способы построения рабочего цикла буфера. Главным моментом в жизни буфера является его переполнение, именно по возникновению этого события происходит процедура передачи и перевод буфера в состояние сброса. То как это происходит, зависит от схемы взаимодействия.

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

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

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

Выделение памяти буферу.

Вопрос создания буфера открывается в момент создания объекта приемника. И как нестранно такое утверждение - правило. Сколько же памяти следует отдавать на буфер? Вот довольно жесткий принцип:

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

В первой части определения разговор идет касательно так называемого первого назначения буфера. Обычно код организующий выделение памяти средствами ОС является <тяжелым кодом>, то есть он требует сравнительно много времени на выполнение. Предположим, если вы выполняете какие-то циклические действия над потоком ввода из файла, то было бы чрезвычайно расточительно обращаться к диску за каждым байтом. В этом случае, с диска считывается сразу дамп памяти, а некая операция выполняется над этим дампом. Данный пример, аналогичен, так же если вместо источника диска, подставить источник - некую функцию, конвертирующую данные, либо что-то еще.

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

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

Буферную память можно разместить как статически, то есть заранее расположенную в секции неинициализированных данных, так и динамически выделенную.

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

Буферную память целесообразно размещать в области виртуальной памяти, т. е. в файле подкачки. В любом случае размер буфера обязан быть кратен размеру страницы в данной системе. Однако гранулярность выделения памяти в Win32 является 64-bits, что создает жесткие ограничения на размер буфера. Поэтому стоит выделять некоторое пространство памяти для нескольких буферов, и давать им размеры и базовые адреса по размерам страниц.

Один буфер для многих и многоуровневая буферизация.

Широкий круг задач приходится выполнять жестко последовательно. Например, ввод с клавиатуры может быть направлен в данный момент времени только в один источник. Этим можно воспользоваться для организации одного буфера. Для использования многими, можно применить технологию ускользающих. В этом случае сброс буфера будет выполняться либо, когда он наполнен, либо, когда к буферу обращается другой объект-хозяин. Место под такой буфер можно зарезервировать в неинициализированном разделе, если он не превышает 8kb - 12kb оперативно памяти. Использование статических буферов является более эффективными по способу адресации, и тем эта эффективность выше, чем больше кода использует данный буфер. Статические буфера желательно использовать, где только это возможно, хотя это возможно далеко не везде. К счастью существует метод многоуровневой буферизации. Как следует из названия, этот метод представляет собой наличие объекта хозяина у буфера, где объект хозяин сам является буфером. Буфер, который <стоит> ближе к действительному источнику именуется первым, а все последующие по порядку. Обычно каждый последующий буфер имеет меньшую частоту сброса, а значит, занимает больше памяти. Метод многоуровневой буферизации позволяет комбинировать достоинства нескольких приемов размещения буферов. Например, первым буфером может являться буфер размещенный статически, а вторым - размещенный динамически. Примером использования многоуровневой системы буферизации может послужить API работы с файлами. Вы можете использовать кокой-то свой буфер для выполнения задач, когда система прозрачно для вас выполняет еще одну буферизацию. А если вспомнить про физический буфер, находящийся в самом жестком диске, то мы получим трех уровневую систему буферизации ввода.

Определенный интерес представляет использование, какой-либо памяти и буфера. Модель работы такой системы выглядит так:

    -объект источник помещает данные в область памяти не являющуюся буфером; - после всех операций данные направляются в буфер.

В качестве промежуточной памяти может выступать какой-либо ее блок, размещенный статически и работать по методике ускользающих. Такая система нашла широкое применение на практике. Важно отметить следующее, что в данной многоуровневой системе, первый объект-буфер не является либо совсем буфером, либо является буфером неполноценным, так как не отвечает одному из назначений буфера, или не имеет буферного цикла.

Похожие статьи




Анализ принципа работы БП адаптера связи ОП - Работка буферной памяти адаптера связи

Предыдущая | Следующая