Интерфейсы ПК

       

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


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

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

Рассмотрим процесс на шине SCSI на примере одиночной команды чтения Read. ИУ имеет активный набор указате- лей и несколько сохраненных наборов, по одному на каж- дый из допустимого числа одновременных конкурирующих процессов. ИУ восстанавливает указатели процесса в актив- ный набор и, выиграв арбитраж, выбирает ЦУ. Как только

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

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

Теперь рассмотрим процесс с цепочкой связанных команд. По успешному завершению каждой команды цепочки ЦУ авто- матически переходит к исполнению следующей. Все коман- ды цепочки адресуются к одной и той же связи 1_Т_х и яв- ляются частью одного процесса. Команды не являются полностью независимыми: при использовании бита относи- тельной адресации последний блок, адресованный предыду- щей командой, доступен для следующей. Так, например, мож- но исполнить команду Search Data, по которой на диске будет

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

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

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

цепочка принадлежит одному процессу, а в очередь ставят- ся именно процессы.


Содержание раздела