Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Олифер. Сетевые операционные системы.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
16.5 Mб
Скачать

Работа с буферами пакетов

Управление оперативной памятью в Cisco IOS происходит на двух уровнях: уровне пулов памяти и уровне буферов пакетов. На первом уровне управление памятью осуществляется менеджером памяти, на втором — менеджеров буферов. Пул памяти IOS — это непрерывная область памяти произвольного размера.

Пулы памяти управляются менеджером памяти и выделяются по запросу модулям IOS; в этом отношении функции IOS не отличаются от функций универсальной ОС.

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

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

Рис. 9.17. Буферы пакетов IOS

Такая организация очередей весьма экономична, так как при перемещении пакета из одной очереди в другую нет необходимости копировать данные пакета из ячейки в ячейку — достаточно просто изменить значения соответствующих указателей очередей. IOS поддерживает несколько типов буферов и связанных с ними очередей пакетов: кольца интерфейсов Tx-ring и Rx-ring, локальные и системные.

С каждым интерфейсом связаны две очереди Tx-ring и Rx-ring, предназначенные соответственно для передачи пакетов непосредственно в контроллер и приема пакетов от контроллера данного интерфейса. Отличие очередей этого типа состоит в том, что к их указателям имеет доступ не только процессор маршрутизатора, но и контроллер данного интерфейса. За счет этого экономится процессное время при перемещении пакетов между памятью контроллера и бу­ферами IOS. Например, когда пакет оказывается полностью принятым контроллером интерфейса, последний не инициирует прерывание, чтобы известить процессор о необходимости переписать биты пакета в буфер IOS, а выполняет эту операцию сам. Для этого контроллер читает значение указателя первой ячейки очереди Rx-ring, и если этот указатель имеет признак «свободен», то контроллер записывает пакет по адресу, хранящемуся в указателе. Структуры указателей очередей Tx-ring и Rx-ring зависят от типа интерфейса, размеры ячеек этих очередей также зависят от типа интерфейса — они выбираются таким образом, чтобы в ячейку мог поместиться кадр максимального для данного типа интерфейса размера. Например, ячейки интерфейсов Ethernet имеют размер 1524 байта, что позволяет поместить туда 1500 байт поля данных Ethernet-кадра (максимальная длина этого поля), а также все байты заголовка кадра.

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

Помимо очередей Tx-ring и Rx-ring, с каждым интерфейсом связана также пара очередей (входная и выходная), которые называются локальными очередями данного интерфейса, так как другие интерфейсы ими пользоваться не могут. Эти очереди контроллеру интерфейса недоступны, они доступны только кодам, выполняемым процессором маршрутизатора. Локальные очереди также включают ячейки фиксированного размера, зависящего от максимального размера кадра интерфейса. Как правило, количество буферов в очередях Tx-ring и Rx-ring невелико, локальные очереди содержат больше буферов, что позволяет маршрутизатору не терять пакеты даже при сравнительно длительных перегрузках. Локальные очереди, как и кольца Tx-ring и Rx-ring, состоят из фиксированного количества буферов, но это количество можно до определенного предела увеличивать администратору, используя команды конфигурирования маршрутизатора.

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

Так как системные очереди обслуживают интерфейсы различных типов, то они должны рационально хранить кадры различного размера. Cisco IOS решает эту проблему двумя способами. Для младших моделей маршрутизаторов Cisco организуется несколько системных очередей, каждая из которых поддерживает ячейки определенного размера. В этом случае в памяти ввода-вывода организу­ется семь очередей с размерами Из следующего ряда: 104, 600, 1524, 4520, 5024 и 18 024.

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

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

Код ядра IOS, вызываемый по этому прерыванию, пытается переместить ячейку с принятым кадром из очереди Tx-ring в локальную входную очередь интерфейса или же, если она полна, в одну из системных очередей. Для этого коду ядра сначала нужно вернуть свободную ячейку в очередь Tx-ring. Для этого код ядра просматривает локальную входную очередь данного интерфейса, а если в ней нет свободных ячеек, то и системную очередь. Если он находит в одной из этих очередей указатель на свободную ячейку, он копирует его зна­чение в указатель очереди Tx-ring, делая тем самым этот буфер свободным для приему кадра. После этого адрес ячейки с принятым кадром помещается в указатель на свободную ячейку локальной или, системной очереди. Таким образом, ячейка переходит из очереди в очередь без реального перемещения кадра в памяти, что значительно сокращает время этой операции.

В том случае, когда ни в локальной, ни в системной очередях нет указателей на свободные ячейки, кадр отбрасывается. Для этого признак указателя на ячейку, содержащую кадр, меняет своё значение с «заполненная ячейка» на «свободная ячейка».

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