Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Буферизация данных в устройствах



Каждое устройство имеет свою специфику характера обмена данными, опреде­ляемую природой его внешней (по отношению к компьютеру) стороны. По ха­рактеру обмена устройства можно разделить на три основных типа:

♦ Блочные устройства, например дисковые накопители. Обмен с ними возмо­
жен только блоками фиксированного размера — секторами. При обмене
с физическим диском (например, через контроллер НГМД) нельзя останав­
ливаться посреди передачи блока.

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

♦ Регистро-ориентированные устройства, как правило, не являются источни­
ками или приемниками больших объемов данных. Программам обычно тре­
буется знать текущее состояние данных устройств или/и формировать те­
кущие управляющие воздействия. Пример регистро-ориентированного
устройства — джойстик: программа в определенные моменты опрашивает те­
кущее состояние кнопок и координатных датчиков. Регистро-ориентирован-
ными, как правило, являются различные устройства сопряжения с техноло­
гическим оборудованием, компьютеризованные измерительные комплексы
и т. п.

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

Для того чтобы обеспечить некоторую свободу программам, обслуживающим устройства, относительно процессов формирования (потребления) данных устройствами, применяют различные способы буферизации данных внутри уст­ройств или их контроллеров. Буфер представляет собой набор внутренних яче­ек памяти с определенными правилами доступа как со стороны устройства, так и со стороны компьютерного «центра». Размер буфера и дисциплина его обслу­живания выбираются исходя из технических (скорость и объем информации, допустимые задержки) и экономических (цена) соображений.

Для блочных устройств обычно применяют буфер, минимальный размер кото­рого равен размеру блока. Так, первые устройства IDE/ATA имели буфер объе­мом 512 байт на один сектор диска. Буфер поначалу был однопортовым: при чтении с диска встроенный контроллер сначала заполнял буфер данными сек­тора, и только после этого данные из буфера могли считываться в память ком­пьютера. Позже размер буфера увеличили до объема нескольких секторов и стали применять двухпортовый буфер, допускающий практически одновре­менное обращение с двух сторон (портов) — со стороны устройства (обмен с носителем) и со стороны интерфейса (обмен по шине АТА). При считывании последовательности секторов как только очередной сектор целиком попадает в буфер и схемы контроля сообщают об отсутствии ошибок, контроллер диска может выдавать данные этого сектора на внешний интерфейс, а сам тем време­нем продолжать считывание последующих секторов в оставшуюся часть буфе­ра. Более хитрый контроллер может использовать кольцевой буфер, продолжая считывание секторов с носителя в освободившееся (считанное по внешнему ин­терфейсу) начало буфера. Однопортовый буфер большого размера оказывается неэффективным, поскольку при длинных операциях он вносит большую за­держку в доставку данных. Двухпортовость позволяет уменьшить задержку, а кольцевая организация делает буфер практически безразмерным (при усло­вии своевременного освобождения).

Адаптеры локальных сетей тяготеют к блочным устройствам — они передают данные целыми пакетами, которые должны приниматься и посылаться с опре­деленной скоростью (10, 100 или 1000 Мбит/с для трех поколений Ethernet). Для них объем и организация буфера зависят от скорости передачи данных в среде и производительности интерфейса (шины расширения), к которому они подключены. Максимальный размер пакета (кадра) для Ethernet — около 1,5 Кбайт (для технологий TokenRing и FDDI гораздо больше). Сетевые карты Ethernet на 10 Мбит/с для шин ISA/EISA имели буфер по крайней мере на один кадр, а полнодуплексные — на два. Значительно более эффективными были карты с большим объемом буфера (так, карты ЗС509В были гораздо «шустрее», чем ЗС509). Эти буферы могли также быть однопортовыми или двухпортовы­ми со всеми вышеописанными свойствами. Однопортовые буферы приводят к задержкам передачи на время приема целого кадра, что находит отражение в увеличении времени отклика сети. Для 100-мегабитных (Fast Ethernet) карт PCI с прямым управлением шиной оказалось возможным использование всего двух 64-байтных буферов (по одному на прием и передачу, что обеспечивает поддержку полного дуплекса). Каждый буфер поделен пополам, и половинки чередуются (ping-pong buffer): при приеме пакета из сети сначала заполняется первая половина, затем вторая. Как только первая половина заполнится, карта запрашивает управление шиной, и как только его получает, сама выгружает данные из этой половинки в память. Как только заполнится вторая половина, карта переключается на заполнение первой (уже свободной) и делает следую­щий запрос на управление для выгрузки второй половины. По мере приема кадра эта «игра в пинг-понг» продолжается; передача кадра выглядит аналощч-но. Такое упрощение организации (это технически проще реализации двухпор-тотвого доступа к локальной памяти) стало возможным благодаря высокой пропускной способности шины и гарантированному времени предоставления доступа к шине (см. 14.2). Однако для карт Gigabit Ethernet этот вариант уже не проходит, и на них устанавливают буферы на полный кадр.

Для потоковых устройств часто применяют буфер с дисциплиной обслуживания FIFO (First In, First Out — «первым вошел, первым вышел»). Размер такого бу­фера, как правило, невелик (например, 16 байт). Буфер ставится между «цен­тром» и устройством: с одной стороны он наполняется, с другой — опорожняет­ся. Опорожняющая сторона может извлекать данные из буфера, лишь когда наполняющая сторона их туда положит. Попытка извлечения данных из пусто­го буфера является ошибкой опустошения (underflow), попытка помещения в заполненный — ошибкой переполнения (overflow). Система управления буфе­ром следит за степенью его заполнения и сообщает «центру» о критических си­туациях. Когда «центр» (программа, исполняемая процессором) выводит дан­ные через FIFO, система управления буфером следит за снижением степени его заполнения ниже порога опустошения и в случае такового сигнализирует (обычно прерыванием) о необходимости вывода следующей порции данных. Система управления также препятствует переполнению, отвергая попытки за­писи лишних данных и немедленно сообщая об ошибке (обычно через соответ­ствующий программно-читаемый бит состояния). При вводе данных через бу­фер FIFO его система управления следит за наличием свободного места в буфере и при превышении порога заполнения также сигнализирует прерыва­нием. Аналогично, она не позволяет считать данные из пустого буфера и сооб­щает об этом соответствующим битом. Также система управления буфером должна позволять его очищать по инициативе процессора, сообщать о количе­стве (или хотя бы о наличии) данных в буфере по запросу процессора. Управ­ляемость порогов позволяет программе в зависимости от внешнего темпа обме­на данными, возможностей и текущей загруженности компьютера выбрать оптимальный режим обмена, позволяющий и «не суетиться по мелочам», и не допускать переполнения/опустошения буфера. У двунаправленных устройств, как правило, имеется пара буферов FIFO (в случае полного дуплекса), для сим­плексных устройств достаточно одного. Например, в контроллере НГМД (хотя это и блочное устройство, но медленное), имеется один переключаемый буфер. Буферы FIFO применяются в СОМ-портах, LPT-портах и ряде других потоко­вых узлов компьютера. Без буферов FIFO, например, невозможен фоновый об­мен данными с модемами на скоростях выше 19,2 Кбит/с. Буферная память прин­теров также является буфером FIFO, правда, не очень гибким и «общительным» (о степени своего заполнения по стандартному интерфейсу он не сообщает).

Буферы современных устройств внешней памяти имеют более сложную орга­низацию, обеспечивающую кэширование данных; однако и они используют вы­шеописанные принципы организации. Однопортовые буферы большого объема, как уже говорилось, могут вносить заметную задержку. Для потоковых приме­нений (например, для воспроизведения мультимедийных файлов) эта задержка обычно не очень существенна и на производительность не влияет. Однако для приложений «петлеобразного» характера, когда буфер оказывается в цепочке «запрос-ответ», его задержка может приводить к снижению производительно­сти. Так, передача данных по сети обычно представляет собой последователь­ность кадров данных, на каждый из которых передающая сторона ожидает кадр подтверждения. Если каждый кадр будет «просиживать» в буфере, естественно, производительность снизится. От этой беды спасает метод «скользящего окна», при котором передающая сторона допускает некоторое отставание приема под­тверждений. Примерно та же идея реализована в синхронном режиме передачи на шине SCSI (см. 20.4).

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.