Выполнение команд

в начало

Рассмотрим процесс на шине SCSI на примере одиночной команды чтения Read. ИУ имеет активный набор указателей и несколько сохраненных наборов, по одному на каждый из допустимого числа одновременных конкурирующих процессов. ИУ восстанавливает указатели процесса в активный набор и, выиграв арбитраж, выбирает ЦУ. Как только ЦУ выбрано, оно берет на себя управление процессом. В фазе Selection ИУ вводит сигнал ATN#, сообщая о намерении послать сообщение Identify с указанием адресуемого ЛУ. Таким образом устанавливается связь I_T_L с данным процессом и его набором указателей. ЦУ переходит в фазу Command и принимает блок дескриптора команды Read. Интерпретировав команду, ЦУ переходит в фазу Data IN, передает данные, затем переводится в фазу Status и посылает состояние Good. Затем в фазе Message IN устройство посылает сообщение Command Complete, после чего освобождает шину (фаза Bus Free). Процесс завершен.

Рассмотрим тот же пример, но с использованием отключения от шины (Disconnect) в процессе выполнения команды. Если устройство определит, что для получения затребованных данных потребуется много времени, получив команду Read, оно освобождает шину, послав сообщение Disconnect. Как только требуемые данные готовы в ЦУ, оно, выиграв арбитраж, выберет ИУ (в фазе Reselect) и в фазе Message IN пошлет ему сообщение Identify. По определенной этим сообщением связи I_T_L ИУ восстановит соответствующий набор указателей в активный и продолжит выполнение процесса, как описано выше. Если ЦУ хочет отсоединиться, когда часть данных уже передана (например, головка дошла до конца цилиндра и требуется время на позиционирование), оно посылает сообщение Save Data Pointer, а затем Disconnect. После повторного соединения передача данных возобновится с точки, определенной последним сохраненным значением указателя. Если произошла ошибка или исключение, ЦУ может повторить обмен данными, послав сообщение Restore Pointers или отсоединившись без сообщения Save Data Pointers.

Теперь рассмотрим процесс с цепочкой связанных команд. По успешному завершению каждой команды цепочки ЦУ автоматически переходит к исполнению следующей. Все команды цепочки адресуются к одной и той же связи I_Т_х и являются частью одного процесса. Команды не являются полностью независимыми: при использовании бита относительной адресации последний блок, адресованный предыдущей командой, доступен для следующей. Так, например, можно исполнить команду Search Data, по которой на диске будет найден блок, содержащий информацию, совпадающую с эталоном поиска. Связав с ней команду чтения Read, можно прочитать этот блок или блок с указанным смещением относительно найденного. По выполнении связанных команд ЦУ посылает сообщения Linked Command Complete (возможно, с флагом), а ИУ обновляет набор сохраненных указателей так, что они указывают на очередную команду цепочки. Команды в цепочке выполняются как одиночные, но с возможностью относительной адресации.

Команды могут исполняться с использованием очередей. ЦУ могут поддерживать немаркированные и маркированные очереди. Поддержка немаркированных очередей, определенная еще в SCSI-1, позволяет любому ЛУ (LUN) или целевой программе (TRN), занятым процессом от одного ИУ, принимать команды (начинать процесс) с другими ИУ. При этом каждый процесс идентифицируется связью I_Т_х, где х - LUN или TRN.

Маркированные очереди (Tagged Queue) определены в SCSI-2 для ЛУ (LUN, но не TRN). Для каждой связи I_T_L существует своя очередь размером до 256 процессов (немаркированные очереди можно считать вырожденным случаем маркированных с одноместными очередями). Каждый процесс, использующий маркированные очереди, идентифицируется связью I_T_L_Q, где Q - однобайтный тег очереди (Queue Tag). Теги процессам назначаются ИУ, их значения на порядок выполнения операций не влияют. Повторное использование тега возможно лишь по завершении процесса с этим тегом. Постановка в очередь выполняется через механизм сообщений, при этом очередной процесс можно поставить в очередь "по-честному", а можно пропихнуть вне очереди процесс, поставленный в очередь с сообщением Head Of Queue Tag, будет выполняться сразу после завершения текущего активного процесса. Процессы, поставленные в очередь с сообщением Simple Queue Tag, исполняются ЦУ в порядке, который оно сочтет оптимальным. Процесс, поставленный в очередь с сообщением Ordered Queue Tag, будет исполняться последним. ИУ может удалить процесс из очереди, сославшись на него по тегу. Изменение порядка выполнения команд ЦУ не касается порядка команд в цепочке, поскольку цепочка принадлежит одному процессу, а в очередь ставятся именно процессы.

***************

В фазе Bus Free шина находится в состоянии покоя - нет никаких процессов обмена; она готова к арбитражу. Признаком является пассивное состояние линий BSY# и SEL#.

В фазе Arbitration устройство может получить право на управление шиной. Дождавшись покоя шины (Bus Free), устройство вводит сигнал BSY# и свой идентификатор SCSI ID. Если идентификаторы выставили несколько устройств одновременно, то право на управление шиной получает устройство с наибольшим адресом, а остальные устройства отключаются до следующего освобождения шины. Устройство, выигравшее арбитраж, вводит сигнал SEL# и переходит в фазу Selection или Reselection.

В фазе Selection ИУ, выигравшее арбитраж, вводит на шину данных результат логической функции ИЛИ от пары идентификаторов - своего и ЦУ, - сопровождая его битом паритета. Установкой сигнала ATN# ИУ указывает, что следующей фазой будет Message OUT. ИУ снимает сигнал BSY#. Отсутствие сигнала I/0# отличает данную фазу от Reselection. Адресованное ЦУ отвечает сигналом BSY#, если паритет корректный и на шине данных присутствует только пара идентификаторов (его и ИУ). На некорректные значения данных устройства отвечать не должны. Если за заданное время ЦУ не ответило, срабатывает тайм-аут, ИУ освобождает шину или вводит сигнал сброса RST#.

Фаза Reselection аналогична предыдущей, но ее вводит ЦУ. Фаза появляется в том случае, когда ЦУ на время исполнения команды отключалось от шины. По завершении внутренней операции это устройство, выиграв арбитраж, будет вызывать ИУ, которое ранее породило исполнение операции. ЦУ снимает сигнал BSY#, активность сигнала I/0# отличает данную фазу от фазы Selection. Адресованное ИУ отвечает сигналом BSY#, условия ответа и тайм-аут аналогичны предыдущей.

В фазах Command, Data, Status и Message по шине данных передается информация, фазы идентифицируются сигналами MSG#, C/D# и I/0# (табл. 1.3), которыми управляет ЦУ. ИУ может потребовать посылки сообщения (фаза Message OUT) введением сигнала ATN#, а ЦУ может освободить шину, сняв сигналы MSG#, C/D#, I/0# и BSY#.

В фазе Command ЦУ запрашивает от ИУ команду. В фазе Status ЦУ делает запрос на передачу ИУ информации о своем состоянии. В фазах Data IN и Data OUT ЦУ делает запросы на передачу данных к ИУ и от него соответственно. Фазы Message IN и Message OUT служат для передачи сообщений. Фазу Message OUT ЦУ вводит в ответ на условие Attention, порождаемое ИУ сигналом ATN#, когда оно нуждается в посылке сообщения ЦУ. Фазу Message IN ЦУ вводит при необходимости посылки сообщения ИУ.