Детские центры логопед в рязани карандаши-клуб.рф.
Диспетчер изохронных ресурсов, IRM (Isochronous Resources Manager), — узел, ведающий распределением номеров каналов и полосы шины для изохронных передач. Диспетчер требуется, когда на шине появляется хоть одно устройство, способное к изохронной передаче. Диспетчер выбирается в процессе самоидентификации узлов из числа узлов, претендующих на эту роль. Претендентами являются узлы, которые сообщают в своем пакете самоидентификации единичные значения битов L (LINK активен) и C (Contender — участник состязания). Все узлы, интересующиеся диспетчерами, слушают пакеты самоидентификации и запоминают идентификатор победителя — претендента с наибольшим номером узла. Узел-претендент «сдается», если его идентификатор меньше запомненного идентификатора победителя. Победитель (единственный «не сдавшийся» узел) становится диспетчером изохронных ресурсов. Через него можно будет найти и диспетчера шины.
Победителем, скорее всего, станет корневой узел (если он способен к этой роли). На роль диспетчера изохронных ресурсов годится узел, удовлетворяющий следующему набору требований:
Специальные регистры диспетчера изохронных ресурсов находятся в области регистров последовательной шины начального пространства регистров узла.
При отсутствии диспетчера шины IRM отвечает за назначение мастера циклов: если текущий корень не исполняет эту роль, то IRM для этой цели выбирает иной узел (в том числе и себя). Механизм смены корня по этому поводу описан в предыдущем параграфе. При отсутствии диспетчера шины на IRM ложатся еще и минимальные обязанности по управлению питанием — отправка команды на включение LINK-уровня всем узлам. Отсутствие диспетчера шины IRM определяет по своему регистру Bus_Manager_ID (смещение 2C1h, используются только 6 младших бит): если через 625 мс после сброса его значение не отличается от 3Fh, значит, диспетчера шины нет.
После сброса устройства, нуждающиеся в изохронной передаче, запрашивают у диспетчера изохронных ресурсов выделение номера канала и полосы пропускания. Для распределения каналов служит 64-битный регистр CHANNEL_AVAILABLE (смещение 224h), представляющий собой битовую карту, в которой каждому возможному изохронному каналу ch# соответствует свой бит (ch0 — в младшем бите).
Единичное значение бита соответствует доступности (незанятости) данного канала. Начальное значение регистра — FFFF FFFFh (все каналы доступны). При запросе выделения канала бит сбрасывается, при освобождении — устанавливается.
Запрос и освобождение канала выполняются одинаково. Узел, запрашивающий выделение или освобождение канала, первым делом считывает значение регистра CHANNEL_AVAILABLE, чтобы определить текущую ситуацию, и формирует свое предложение по новому значению этого регистра. Далее, он обращается к регистру CHANNEL_AVAILABLE блокированной транзакцией compare_swap, в которой в качестве аргумента (arg_value) передает прежнее (считанное) значение, а в качестве значения (data_value) — свое новое предложение. Данная транзакция в случае совпадения текущего значения регистра с аргументом заменяет его значение на новое, то есть регистр CHANNEL_AVAILABLE принимает новое значение. При этом транзакция возвращает запрашивающему узлу значение регистра, считанное на момент начала выполнения блокированной транзакции. Если это значение совпадает с ранее считанным значением, значит, диспетчер принял новое назначение каналов — выделил узлу или освободил запрошенный канал (можно и группу каналов одновременно). Если совпадения нет, это значит, что какой-то другой узел между нашими двумя транзакциями успел изменить содержимое регистра — занять или освободить канал. В этом случае запрашивающий узел должен повторить попытку, при этом новое текущее значение регистра он уже знает.
Для распределения полосы пропускания служит регистр BW_AVAILABLE (смещение 220h), в котором младшие 13 бит (bw_remaining) содержат число единиц распределения полосы шины (bus allocation units), оставшееся доступным. Единица распределения соответствует времени передачи одного квадлета на скорости 1600 Мбит/с (20,345 нс). В 125-микросекундном цикле теоретически доступно 6144 единиц. Как минимум 25 мкс цикла резервируется под асинхронный трафик, поэтому суммарная распределяемая полоса изохронного трафика (начальное значение bw_remaining) по умолчанию составляет 4915 единиц. Сервисным запросом SB_CONTROL диспетчеру изохронных ресурсов (или диспетчеру шины) можно урезать полосу, выделяемую под изохронный обмен. Выделение полосы по времени учитывает возможность совместной работы устройств с различными скоростями — в одном цикле соседние пакеты могут передаваться на разных скоростях. Для цифрового видео, например, требуется полоса 30 Мбит/с (25 Мбит/с на видеоданные и 3–4 Мбит/с на аудиоданные, синхронизацию и заголовки пакетов). В S100 такие устройства цифрового видео запрашивают около 1800 единиц, в S200 — около 900. Запрашиваемая полоса должна учитывать не только передаваемые данные, но и накладные расходы на заголовок и на зазор арбитража. Выделение и освобождение полосы выполняется аналогично выделению и освобождению канала — с помощью чтения и блокированного обращения compare_swap к регистру BW_AVAILABLE. При сбросе шины передача трафика прекращается и все ресурсы освобождаются, так что узлы, вещавшие в изохронном режиме, должны снова запросить себе ресурсы. Для стабилизации работы шины узлы-новички, не вещавшие до сброса, задерживают свои запросы на 1 с — это позволит прежним вещателям не потерять ресурсы из-за появления новичков и не прерывать передачу.