В вычислительной технике канальный ввод-вывод — это высокопроизводительная архитектура ввода-вывода (I/O), которая реализована в различных формах на ряде компьютерных архитектур, особенно на мэйнфреймах . В прошлом каналы обычно [a] реализовывались с помощью специальных устройств, называемых по-разному: канал , процессор ввода-вывода , контроллер ввода-вывода , синхронизатор ввода-вывода или контроллер DMA .
Многие задачи ввода-вывода могут быть сложными и требуют применения логики к данным для преобразования форматов и других подобных задач. В таких ситуациях самым простым решением будет попросить ЦП обработать логику, но поскольку устройства ввода-вывода относительно медленные, ЦП может тратить время в ожидании данных от устройства. Такая ситуация называется «I/O bound».
Архитектура канала позволяет избежать этой проблемы, обрабатывая часть или все задачи ввода-вывода без помощи ЦП, перекладывая работу на выделенную логику. Каналы логически [a] самодостаточны, с достаточной логикой и рабочей памятью для обработки задач ввода-вывода. Некоторые из них достаточно мощные или гибкие, чтобы использоваться как компьютер самостоятельно, и могут рассматриваться как форма сопроцессора , например, канал данных 7909 на IBM 7090 или IBM 7094 ; однако большинство из них таковыми не являются. В некоторых системах каналы используют память или регистры, адресуемые центральным процессором, в качестве своей рабочей памяти, в то время как в других системах они присутствуют в аппаратном обеспечении канала. Обычно существуют стандартные интерфейсы [b] между каналами и внешними периферийными устройствами, и несколько каналов могут работать одновременно.
ЦП обычно назначает блок памяти или отправляет в канал относительно небольшую канальную программу для обработки задач ввода-вывода, которые канал и контроллер во многих случаях могут выполнить без дальнейшего вмешательства со стороны ЦП (исключение: те канальные программы, которые используют «программно-управляемые прерывания», PCI, для облегчения загрузки программ, подкачки страниц по требованию и других важных системных задач).
Когда передача ввода-вывода завершена или обнаружена ошибка, контроллер обычно связывается с ЦП через канал, используя прерывание . Поскольку канал обычно имеет прямой доступ к основной памяти, его также часто называют контроллером прямого доступа к памяти (DMA).
В самых последних реализациях программа канала инициируется, и процессор канала выполняет всю необходимую обработку до тех пор, пока не наступит условие завершения или прерывание, управляемое программой (PCI). Это устраняет большую часть взаимодействия ЦП и канала и значительно повышает общую производительность системы. Канал может сообщать о нескольких различных типах условий завершения, которые могут быть однозначно нормальными, могут однозначно указывать на ошибку или значение которых может зависеть от контекста и результатов последующей операции считывания. В некоторых системах контроллер ввода-вывода может запрашивать автоматический повтор некоторых операций без вмешательства ЦП. В более ранних реализациях любая ошибка, независимо от ее размера, требовала вмешательства ЦП, и накладные расходы, следовательно, были намного выше. Программно-управляемое прерывание (PCI) все еще используется некоторыми устаревшими операциями, но тенденция заключается в том, чтобы отходить от таких PCI, за исключением случаев, когда это неизбежно.
Первое использование канального ввода-вывода было в 1957 году в мэйнфрейме IBM 709 [2] , чей синхронизатор данных Model 766 был первым контроллером канала. Транзисторный преемник 709, IBM 7090 [ 3], имел от двух до восьми 6-битных каналов (7607) и канальный мультиплексор (7606), который мог управлять до восьми каналов. 7090 и 7094 также могли иметь до восьми 8-битных каналов с 7909.
В то время как IBM использовала команды канала данных на некоторых своих компьютерах и допускала цепочку команд, например, на 7090, большинство других поставщиков использовали каналы, которые работали с отдельными записями. Однако некоторые системы, например, серии GE-600 , имели более сложную архитектуру ввода-вывода.
Позже компьютерные семейства IBM System/360 и System/370 предлагали канальный ввод-вывод на всех моделях. Для младших моделей System/360 50 и ниже и System/370 158 и ниже каналы были реализованы в микрокоде на ЦП, а сам ЦП работал в одном из двух режимов: «Режим ЦП» или «Режим канала», при этом режим канала «крал» циклы у режима ЦП. Для более крупных компьютеров IBM System/360 и System/370 каналы по-прежнему были громоздкими и дорогими отдельными компонентами, такими как канал селектора IBM 2860 (от одного до трех каналов селектора в одном корпусе), канал байтового мультиплексора IBM 2870 (один канал мультиплексора и, опционально, один подканал селектора в одном корпусе) и канал блочного мультиплексора IBM 2880 (один или два канала блочного мультиплексора в одном корпусе). В процессорных комплексах 303x каналы были реализованы в независимых управляющих каналах в том же шкафу, что и ЦП, причем каждый управляющий каналом реализовывал группу каналов. [4]
Гораздо позже каналы были реализованы в виде встроенного процессора, находящегося в том же корпусе, что и центральный процессор, обычно называемого «канальным процессором», который обычно представлял собой RISC -процессор, но мог быть и микропроцессором System/390 со специальным микрокодом, как в мэйнфреймах IBM CMOS .
Аппаратная реализация Amdahl Corporation совместимых с System/370 каналов была совершенно иной. Один внутренний блок, называемый «C-Unit», поддерживал до шестнадцати каналов, используя одно и то же оборудование для всех поддерживаемых каналов. Было возможно два внутренних «C-Unit», поддерживающих до 32 каналов в общей сложности. Каждый «C-Unit» независимо выполнял процесс, обычно называемый «сдвигом состояния канала процессора» (тип баррельного процессора ), который реализовал специализированный конечный автомат (FSM). В каждом цикле ЦП, каждые 32 наносекунды в 470V/6 и /5 и каждые 26 наносекунд в 470V/7 и /8, «C-unit» считывал полное состояние следующего канала в приоритетной последовательности и его входные теги канала ввода-вывода . Необходимые действия, определяемые последним состоянием этого канала и его входными тегами, выполнялись: данные считывались из или записывались в основную память, программа операционной системы прерывалась, если такое прерывание было указано флагом прерывания управления программой канала, и "C-Unit" наконец сохранял следующее состояние этого канала и устанавливал его выходные теги канала ввода-вывода , а затем переходил к следующему каналу с более низким приоритетом. В некоторых случаях было возможно прерывание. В "C-Unit" было предоставлено достаточное хранилище FIFO для всех каналов, которые эмулировались этим FSM. Каналы можно было легко перенастроить на выбор клиента селектора, байтового мультиплексора) или блочного мультиплексора без каких-либо существенных ограничений с помощью команд консоли обслуживания. Также поддерживался "двухбайтовый интерфейс", как и "Data-In/Data-Out" и другие высокопроизводительные опции каналов IBM. Также предлагались встроенные адаптеры канал-канал , называемые CCA на языке Amdahl, но называемые CTC или CTCA на языке IBM. Настоящий переломный момент, и это заставило IBM перепроектировать свои мэйнфреймы, чтобы обеспечить схожие возможности и гибкость каналов. Первоначальным ответом IBM было включение урезанных моделей 158, работающих только в «режиме канала», в качестве канальных блоков модели 303x. В «C-блоке» Amdahl любой канал мог быть любого типа, селектором, байтовым мультиплексором или блочным мультиплексором, без резервирования каналов 0 и 4 для байтовых мультиплексоров, как в некоторых моделях IBM.
Некоторые из самых ранних коммерческих канальных систем, разработанных не IBM, были на UNIVAC 490 , CDC 1604 , Burroughs B5000 , UNIVAC 1107 и GE 635. С тех пор канальные контроллеры стали стандартной частью большинства конструкций мэйнфреймов и основным преимуществом мэйнфреймов по сравнению с меньшими, но быстрыми персональными компьютерами и сетевыми вычислениями.
Суперкомпьютер CDC 6600 1965 года использовал 10 логически независимых компьютеров, называемых периферийными процессорами (PP), и 12 простых каналов ввода-вывода для этой роли. PP были модифицированной версией первых персональных компьютеров CDC, 12-битных CDC 160 и 160A. Первоначально операционная система находилась и выполнялась в PP0. Каналы не имели прямого доступа к памяти и не могли вызывать прерывания; программное обеспечение на PP использовало синхронные инструкции [c] для передачи данных между каналом и либо регистром A, либо памятью PP.
SCSI, представленный в 1981 году как недорогой канал, эквивалентный каналу IBM Block Multiplexer Channel [5], в настоящее время широко распространен в форме протокола Fibre Channel и последовательного интерфейса SCSI .
Современные компьютеры могут иметь каналы в форме периферийных устройств управления шиной , таких как устройства прямого доступа к памяти (DMA) PCI . Обоснование для этих устройств такое же, как и для исходных контроллеров каналов, а именно разгрузка передачи, прерываний и переключения контекста от основного ЦП.
Контроллеры каналов были созданы в небольших размерах, в виде однокристальных конструкций с несколькими каналами на них, используемых, например, в компьютерах NeXT .
Базовой реализацией канального ввода-вывода является семейство мэйнфреймов IBM System/360 и его последователей, но аналогичные реализации были приняты IBM на других линейках, например, 1410 и 7010 , 7030 , а также другими поставщиками мэйнфреймов, такими как Control Data , Bull ( General Electric / Honeywell ) и Unisys .
Компьютерные системы, использующие канальный ввод-вывод, имеют специальные аппаратные компоненты, которые обрабатывают все операции ввода-вывода в полном объеме независимо от центрального процессора(ов) системы. Центральный процессор системы, использующей канальный ввод-вывод, обычно имеет в своем репертуаре только одну машинную инструкцию для ввода и вывода; эта инструкция используется для передачи команд ввода-вывода специализированному оборудованию ввода-вывода в форме канальных программ . После этого ввод-вывод выполняется без вмешательства центрального процессора до тех пор, пока не произойдет событие, требующее уведомления операционной системы, после чего оборудование ввода-вывода подает сигнал прерывания центральному процессору.
Канал — это независимый аппаратный компонент, который координирует все операции ввода-вывода с набором контроллеров или устройств. Это не просто средство связи, несмотря на название; это программируемое устройство, которое обрабатывает все детали операций ввода-вывода после получения списка операций ввода-вывода для выполнения (программа канала).
Каждый канал может поддерживать один или несколько контроллеров и/или устройств, но каждая канальная программа может быть направлена только на одно из этих подключенных устройств. Канальная программа содержит списки команд для самого канала и для контроллера и устройства, на которые она направлена. После того, как операционная система подготовила полный список команд канала, она выполняет одну машинную инструкцию ввода-вывода для инициирования канальной программы; после этого канал берет на себя управление операциями ввода-вывода до их завершения.
Можно разрабатывать очень сложные программы каналов, включая тестирование данных и условные переходы в рамках этой программы канала. Такая гибкость освобождает ЦП от накладных расходов на запуск, мониторинг и управление отдельными операциями ввода-вывода. Специализированное аппаратное обеспечение канала, в свою очередь, предназначено для ввода-вывода и может выполнять его более эффективно, чем ЦП (и полностью параллельно с ЦП). Канальный ввод-вывод мало чем отличается от прямого доступа к памяти (DMA) микрокомпьютеров, только более сложный и продвинутый.
В больших мэйнфреймовых компьютерных системах ЦП являются лишь одним из нескольких мощных аппаратных компонентов, работающих параллельно. Специальные контроллеры ввода-вывода (точные названия которых различаются у разных производителей) обрабатывают исключительно ввод-вывод, а они, в свою очередь, подключены к аппаратным каналам, которые также предназначены для ввода и вывода. Может быть несколько ЦП и несколько процессоров ввода-вывода. Общая архитектура оптимизирует производительность ввода-вывода без ухудшения чистой производительности ЦП. Поскольку большинство реальных приложений мэйнфреймовых систем являются бизнес-приложениями с высокой интенсивностью ввода-вывода, эта архитектура помогает обеспечить очень высокий уровень пропускной способности , который отличает мэйнфреймы от других типов компьютеров.
В терминологии IBM ESA/390 канал — это параллельное соединение данных внутри древовидной или иерархически организованной подсистемы ввода-вывода. В корзинах ввода-вывода System/390 каналы либо напрямую подключаются к устройствам, которые установлены внутри корзины (адаптеры связи, такие как ESCON , FICON , Open Systems Adapter ), либо проходят снаружи корзины, под фальшполом, как кабели толщиной с большой палец, и напрямую подключаются к интерфейсам каналов на более крупных устройствах, таких как ленточные подсистемы, устройства хранения данных с прямым доступом (DASD), терминальные концентраторы и другие системы ESA/390.
Каналы различаются по количеству и типу поддерживаемых ими параллельных операций ввода-вывода. В терминологии IBM канал мультиплексора поддерживает несколько параллельных чередующихся медленноскоростных операций, каждая из которых передает один байт с устройства за раз. Канал селектора поддерживает одну высокоскоростную операцию, передавая блок данных за раз. Блочный мультиплексор поддерживает несколько логически параллельных программ канала, но только одну высокоскоростную передачу данных за раз.
Каналы также могут различаться по тому, как они связывают периферийные устройства с буферами хранения. В терминологии UNIVAC канал может быть либо внутренне указанным индексом (ISI), с одним буфером и устройством, активным в каждый момент времени, либо внешне указанным индексом (ESI), с устройством, выбирающим, какой буфер использовать.
В IBM System/360 и последующих архитектурах программа канала представляет собой последовательность командных слов канала (CCW), которые выполняются подсистемой канала ввода-вывода. Программа канала состоит из одного или нескольких командных слов канала. Операционная система подает сигнал подсистеме канала ввода-вывода о начале выполнения программы канала с помощью инструкции SSCH (start sub-channel). Затем центральный процессор может свободно выполнять инструкции, не относящиеся к вводу-выводу, пока не будет прерван. Когда операции канала завершаются, канал прерывает работу центрального процессора прерыванием ввода-вывода. В более ранних моделях линейки мэйнфреймов IBM блок канала был идентифицируемым компонентом, по одному для каждого канала. В современных мэйнфреймах каналы реализованы с использованием независимого процессора RISC, канального процессора, одного для всех каналов. Расширенная архитектура IBM System/370 [6] и ее последователи заменили более ранние машинные инструкции SIO ( start I/O ) и SIOF ( start I/O fast release ) (System/360 и ранние System/370) на инструкцию SSCH ( start sub-channel ) (ESA/370 и последующие).
Канальный ввод-вывод обеспечивает значительную экономию ввода-вывода. Например, в Linux от IBM на IBM Z форматирование всей дорожки DASD требует только одной канальной программы (и, следовательно, только одной инструкции ввода-вывода), но нескольких командных слов канала (по одному на блок). Программа выполняется выделенным процессором ввода-вывода, в то время как процессор приложений (ЦП) свободен для другой работы.
Слово команды канала ( CCW ) — это инструкция специализированному процессору канала ввода-вывода, который по сути является конечным автоматом. Оно используется для инициирования операции ввода-вывода, такой как «чтение», «запись» или «считывание», на подключенном к каналу устройстве. В архитектурах систем, реализующих канальный ввод-вывод, обычно все устройства соединены каналами, и поэтому для всех операций ввода-вывода требуется использование CCW.
CCW организованы в канальные программы операционной системой и подпрограммой ввода-вывода, служебной программой или автономным программным обеспечением (таким как тестовые и диагностические программы). Ограниченная возможность «ветвления», следовательно, динамически программируемая возможность, доступна в таких канальных программах с использованием флага канала «модификатора состояния» и CCW «передачи в канале».
IBM CCW объединяются в цепочку для формирования программы канала. Биты в CCW указывают, что следующее местоположение в хранилище содержит CCW, который является частью той же программы канала. Программа канала обычно выполняет последовательные CCW до тех пор, пока не возникнет исключение, не будет выполнена CCW Transfer-in-Channel (TIC) или CCW не будет выполнена без указания цепочки. Цепочка команд сообщает каналу, что следующая CCW содержит новую команду. Цепочка данных указывает, что следующая CCW содержит адрес дополнительных данных для той же команды, что позволяет, например, записывать части одной записи из нескольких областей данных в хранилище или читать их в них (сбор-запись и разброс-чтение). [7]
Канальные программы могут изменять свою собственную работу во время выполнения на основе считанных данных. Например, самомодификация широко используется в OS/360 ISAM . [8]
Следующий пример [9] считывает запись с диска, идентифицированную записанным ключом . Дорожка, содержащая запись и требуемое значение ключа, известна. Блок управления устройством будет искать дорожку, чтобы найти запрошенную запись. В этом примере <> указывает, что программа канала содержит адрес хранения указанного поля.
SEEK <номер цилиндра/головки> ПОИСК КЛЮЧА РАВНО <значение ключа> TIC *-8 Вернуться к поиску, если не равно ЧИТАТЬ ДАННЫЕ <буфер>
TIC (передача в канале) заставит программу канала перейти к команде SEARCH до тех пор, пока не будет обнаружена запись с соответствующим ключом (или конец дорожки). Когда будет найдена запись с соответствующим ключом, контроллер DASD включит Status Modifier в статус канала, заставив канал пропустить TIC CCW; таким образом, программа канала не будет переходить, и канал выполнит команду READ.
Приведенный выше пример верен для незаблокированных записей (одна запись на блок). Для заблокированных записей (более одной записи на блок) записанный ключ должен совпадать с наивысшим ключом в этом блоке (и записи должны быть в ключевой последовательности), и будет использоваться следующая программа канала:
SEEK <номер цилиндра/головки> ПОИСК КЛЮЧА ВЫСОКИЙ ИЛИ РАВНЫЙ <значение ключа> TIC *-8 Вернуться к поиску, если не высокий или равный ЧИТАТЬ ДАННЫЕ <буфер>
Если набор данных выделен в дорожках и конец дорожки достигнут без нахождения запрошенной записи, программа канала завершается и возвращает статус "no record found" (запись не найдена). Аналогично, если набор данных выделен в цилиндрах и конец цилиндра достигнут без нахождения запрошенной записи, программа канала завершается и возвращает статус "no record found" (запись не найдена). В некоторых случаях системное программное обеспечение имеет возможность обновить номер дорожки или цилиндра и перезапустить операцию ввода-вывода без прерывания прикладной программы.
В большинстве систем каналы работают с использованием реальных (или физических) адресов , в то время как программы каналов создаются с использованием виртуальных адресов . [10] Операционная система отвечает за трансляцию этих программ каналов перед их выполнением, и для этой конкретной цели у диспетчера ввода-вывода (IOS) есть специальная функция быстрого исправления , которая была разработана в диспетчере ОС только для тех «исправлений», которые имеют относительно короткую продолжительность (т. е. значительно короче «времени настенных часов»). Страницы, содержащие данные, которые должны использоваться операцией ввода-вывода, блокируются в реальной памяти, или страница фиксируется . Программа канала копируется, и все виртуальные адреса заменяются реальными адресами до начала операции ввода-вывода. После завершения операции страницы отменяются.
Так как фиксация и отмена страниц — это ресурсоемкий процесс для ЦП, иногда используется долгосрочная фиксация страниц для снижения затрат ЦП. В этом случае виртуальная память фиксируется по страницам на весь срок службы приложения, а не фиксируется и освобождается вокруг каждой операции ввода-вывода. Примером программы, которая может использовать долгосрочную фиксацию страниц, является Db2 .
Альтернативой долгосрочному исправлению страниц является перемещение всего приложения, включая все его буферы данных, в предпочтительную область основного хранилища. Это достигается специальным SYSEVENT в операционных системах MVS/370 через z/OS, где приложение, во-первых, выгружается из того места, где оно может находиться, предположительно из непредпочтительной области, для подкачки и страничного внешнего хранилища, и, во-вторых, выгружается в предпочтительную область (SYSEVENT TRANSWAP). После этого приложение может быть помечено как не подкачиваемое другим специальным SYSEVENT (SYSEVENT DONTSWAP). Всякий раз, когда такое приложение завершается, будь то нормально или ненормально , операционная система неявно выдает еще один специальный SYSEVENT от имени приложения, если она еще этого не сделала (SYSEVENT OKSWAP).
Даже начальная загрузка системы, или начальная загрузка программы (IPL) в номенклатуре IBM, выполняется по каналам, хотя процесс частично моделируется ЦП через подразумеваемую инструкцию Start I/O (SIO), подразумеваемое слово адреса канала (CAW) в позиции 0 и подразумеваемое слово команды канала (CCW) с кодом операции Read IPL, также в позиции 0. Предполагается цепочка команд, поэтому подразумеваемое CCW в позиции 0 попадает в продолжение программы канала в позициях 8 и 16, и, возможно, в другом месте, если одно из этих CCW будет передачей в канале (TIC). [11]
Для загрузки системы подразумеваемый Read IPL CCW считывает первый блок выбранного устройства IPL в 24-байтовую область данных в месте 0, канал продолжается вторым и третьим двойными словами, которые являются CCW, и эта канальная программа загружает первую часть программного обеспечения загрузки системы в другом месте в основной памяти. Первое двойное слово содержит PSW, которое при извлечении в конце IPL заставляет ЦП выполнить IPL Text (загрузчик начальной загрузки), считанный CCW в месте 8. Затем IPL Text находит, загружает и передает управление ядру операционной системы. Ядро выполняет или инициирует любую необходимую инициализацию, а затем начинает обычные операции ОС.
Эта концепция IPL не зависит от устройства. Она способна выполнять IPL с карточной колоды, с магнитной ленты или с устройства хранения данных с прямым доступом (DASD), например, диска, барабана. Команда Read IPL (X'02'), которая имитируется ЦП, является командой чтения Read EBCDIC Select Stacker 1 на устройстве чтения карт и командой Read на ленточных носителях (которые по своей природе являются последовательным доступом), но специальной командой Read-IPL на DASD.
Контроллеры DASD принимают команду X'02', ищут цилиндр X'0000', головку X'0000', переходят к индексной точке (т. е. сразу за записью дескриптора дорожки (R0)) и затем обрабатывают команду Read IPL так, как если бы это была команда Read Data (X'06'). Без этого особого поведения контроллера DASD независимый от устройства IPL был бы невозможен. На DASD текст IPL содержится на цилиндре X'0000', дорожке X'0000' и записи X'01' (24 байта), а также на цилиндре X'0000', дорожке X'0000' и записи X'02' (довольно большой, определенно несколько больше 3000 байт). Метка тома всегда содержится на цилиндре X'0000', дорожке X'0000' и блоке X'03' (80 байт). Метка тома всегда указывает на VTOC с указателем в форме HHHH (то есть VTOC должен находиться в пределах первых 65 536 дорожек). Формат 4 DSCB VTOC определяет экстент (размер) VTOC, поэтому метке тома нужен только указатель на первую дорожку в экстенте VTOC, и поскольку формат 4 DSCB, который описывает VTOC, всегда является самым первым DSCB в VTOC, HHHH также указывает на формат 4 DSCB.
Если предпринимается попытка IPL с устройства, которое не было инициализировано с помощью IPL Text, система просто переходит в состояние ожидания. Программа инициализации DASD (устройство хранения данных с прямым доступом), IBCDASDI, или приложение инициализации DASD, ICKDSF, помещает состояние ожидания PSW и фиктивную строку CCW в 24 байта, если устройство предназначено только для данных, а не для IPL, после чего эти программы форматируют VTOC и выполняют другие функции инициализации жесткого диска.
Cycle-stealing — это форма прерывания, при которой компонент, которому необходим доступ к памяти или процессору, берет на себя управление всем машинным циклом.
* Сходства с мэйнфреймами, * System 360 Block Multiplexed Channel, * Тенденция к микрокомпьютерам