Введение

Высокопроизводительная архитектура ввода/вывода
В вычислительной технике, канальная организация ввода/вывода (I/O) — это высокопроизводительная архитектура ввода/вывода (I/O), реализованная в различных формах на ряде компьютерных архитектур, особенно на мейнфреймах. Ранее каналы обычно реализовывались с помощью специализированных устройств, которые могли называться каналом, процессором ввода-вывода, контроллером ввода-вывода, синхронизатором ввода-вывода или контроллером прямого доступа к памяти (DMA).

Обзор

Многие задачи ввода/вывода могут быть сложными и требуют применения логики к данным для преобразования форматов и выполнения подобных операций. В таких ситуациях самым простым решением является передача логики на обработку центральному процессору, но поскольку устройства ввода/вывода относительно медленные, процессор может терять время в ожидании данных от устройства. Эта ситуация называется "I/O bound" (ограниченность вводом/выводом). Архитектура каналов позволяет избежать этой проблемы, обрабатывая часть или всю задачу ввода/вывода без участия процессора, перенося обработку на специализированную логику. Каналы логически самодостаточны, обладают достаточной логикой и рабочей памятью для обработки задач ввода/вывода. Некоторые из них достаточно мощные или гибкие, чтобы функционировать как самостоятельные компьютеры и могут рассматриваться как разновидность сопроцессора, например, канал данных 7909 в IBM 7090 или IBM 7094; однако, большинство из них таковыми не являются. В некоторых системах каналы используют память или регистры, адресуемые центральным процессором, в качестве рабочей памяти, а в других системах она реализована непосредственно в аппаратном обеспечении канала. Обычно существуют стандартные интерфейсы между каналами и внешними периферийными устройствами, и несколько каналов могут работать параллельно. Центральный процессор обычно выделяет блок памяти или отправляет на канал относительно небольшую каналную программу для обработки задач ввода/вывода, которые канал и контроллер во многих случаях могут выполнить без дальнейшего вмешательства процессора (исключение составляют каналные программы, использующие "программно-управляемые прерывания", PCI, для облегчения загрузки программ, подкачки страниц и других важных системных задач). Когда передача ввода/вывода завершена или обнаружена ошибка, контроллер обычно сообщает об этом центральному процессору через канал с помощью прерывания. Поскольку канал обычно имеет прямой доступ к основной памяти, его также часто называют контроллером прямого доступа к памяти (DMA). В современных реализациях каналная программа инициируется, и процессор канала выполняет всю необходимую обработку до наступления завершающего условия или программного прерывания (PCI). Это значительно снижает взаимодействие между центральным процессором и каналом и существенно повышает общую производительность системы. Канал может сообщать о различных типах завершающих условий, которые могут быть однозначно нормальными, однозначно указывать на ошибку или чье значение может зависеть от контекста и результатов последующей операции запроса состояния. В некоторых системах контроллер ввода/вывода может запросить автоматическую повторную попытку выполнения определенных операций без вмешательства процессора. В более ранних реализациях любая ошибка, даже незначительная, требовала вмешательства процессора, что приводило к значительно большим накладным расходам. Программно-управляемые прерывания (PCI) все еще используются в некоторых устаревших операциях, но наблюдается тенденция к отказу от них, за исключением случаев, когда это неизбежно.

История

Первое использование каналов ввода-вывода было с IBM 709 на вакуумных лампах, чей Модель 766 Синхронизатор данных был первым контроллером канала в 1957 году. Его транзисторный преемник, IBM 7090, имел от двух до восьми 6-битных каналов (7607) и мультиплексор канала (7606), который мог управлять до восьми каналов. 7090 и 7094 также могли иметь до восьми 8-битных каналов с 7909. В то время как IBM использовала команды каналов данных на некоторых своих компьютерах и допускала цепочку команд, например, на 7090, большинство других производителей использовали каналы, работавшие с отдельными записями. Однако некоторые системы, например, серия GE 600, имели более сложную архитектуру ввода-вывода. Позже, семейства компьютеров IBM System/360 и System/370 предлагали каналы ввода-вывода на всех моделях. Для моделей System/360 начального уровня 50 и ниже, а также System/370 Model 158 и ниже, каналы были реализованы в микрокоде процессора, а сам процессор работал в одном из двух режимов: "Режим процессора" или "Режим канала", при этом режим канала "перехватывал" циклы у режима процессора. Для более крупных компьютеров IBM System/360 и System/370 каналы по-прежнему были громоздкими и дорогими отдельными компонентами, такими как канал IBM 2860 Selector (от одного до трех каналов селектора в одном корпусе), канал IBM 2870 Byte multiplexor (один канал мультиплексора и, опционально, один подканал селектора в одном корпусе) и канал IBM 2880 Block multiplexor (один или два канала блочного мультиплексора в одном корпусе). В процессорных комплексах 303x каналы были реализованы в независимых директорах каналов в том же шкафу, что и процессор, причем каждый директор канала управлял группой каналов. Позже каналы были реализованы в виде бортового процессора, расположенного в том же корпусе, что и процессор, обычно называемого "канальным процессором", который обычно был процессором RISC, но мог быть микропроцессором System/390 со специальным микрокодом, как в мейнфреймах IBM CMOS. Аппаратная реализация каналов, совместимых с System/370, компанией Amdahl Corporation была совершенно иной. Одно внутреннее устройство, называемое "C-устройство", поддерживало до шестнадцати каналов, используя одно и то же оборудование для всех поддерживаемых каналов. Были возможны два внутренних "C-устройства", поддерживающих до 32 каналов. Каждое "C-устройство" самостоятельно выполняло процесс, обычно называемый "процессором смены состояния канала" (тип процессора с бочкой), который реализовывал специализированный конечный автомат (FSM). С каждым циклом процессора, каждые 32 наносекунды в 470V/6 и /5 и каждые 26 наносекунд в 470V/7 и /8, "C-устройство" считывало полное состояние следующего канала в последовательности приоритетов и его теги I/O канала. Выполнялись необходимые действия, определяемые последним состоянием этого канала и его тегами: данные считывались или записывались в основную память, программа операционной системы прерывалась, если такое прерывание было указано флагом прерывания по управлению программой программы канала, и "C-устройство" наконец сохраняло следующее состояние этого канала и устанавливало его выходные теги I/O канала, а затем переходило к следующему каналу с более низким приоритетом. В некоторых случаях возможна была прерывистость. В "C-устройстве" было предусмотрено достаточное FIFO-хранилище для всех каналов, которые эмулировались этим FSM. Каналы можно было легко переконфигурировать в соответствии с выбором заказчика (селектор, байтовый мультиплексор или блочный мультиплексор) без каких-либо существенных ограничений с помощью команд консоли обслуживания. Также поддерживался "двухбайтовый интерфейс", а также "Ввод/вывод данных" и другие высокопроизводительные опции каналов IBM. Предлагались встроенные адаптеры от канала к каналу, называемые CCA в терминологии Amdahl, но CTC или CTCA в терминологии IBM. Это стало настоящим прорывом и вынудило IBM перепроектировать свои мейнфреймы, чтобы обеспечить аналогичные возможности и гибкость канала. Первым ответом IBM было включение урезанных моделей 158, работающих только в "Режиме канала", в качестве модулей канала модели 303x. В Amdahl "C-устройстве" любой канал мог быть любого типа – селектора, байтового мультиплексора или блочного мультиплексора – без резервирования каналов 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 использовало синхронные инструкции для передачи данных между каналом и либо регистром A, либо памятью PP. SCSI, представленный в 1981 году как недорогой эквивалент каналу IBM Block Multiplexer Channel, теперь широко распространен в форме Fibre Channel и Serial Attached SCSI. Современные компьютеры могут иметь каналы в виде устройств шины, выполняющих функции мастера, таких как устройства PCI с прямым доступом к памяти (DMA). Обоснование этих устройств такое же, как и для первоначальных контроллеров каналов, а именно – разгрузка передачи, прерываний и переключения контекста с основного процессора. Контроллеры каналов были сделаны настолько компактными, что представляют собой одночиповые конструкции с несколькими каналами на них, например, в компьютерах NeXT.

Описание

Референтная реализация канала I/O – это реализация семейства мейнфреймов IBM System/360 и их преемников, но аналогичные реализации были внедрены IBM и на других платформах, например, 1410 и 7010, 7030, а также другими производителями мейнфреймов, такими как Control Data, Bull (General Electric/Honeywell) и Unisys. Компьютерные системы, использующие канал I/O, оснащены специальными аппаратными компонентами, которые полностью обрабатывают все операции ввода/вывода независимо от процессоров системы. Процессор системы, использующей канал I/O, обычно имеет в своем наборе команд только одну машинную инструкцию для ввода и вывода; эта инструкция используется для передачи команд ввода/вывода специализированному аппаратному обеспечению I/O в виде программ канала. После этого ввод/вывод продолжается без участия процессора до тех пор, пока не произойдет событие, требующее уведомления операционной системы, после чего аппаратное обеспечение I/O генерирует прерывание для процессора. Канал – это независимый аппаратный компонент, координирующий весь ввод/вывод для набора контроллеров или устройств. Несмотря на название, это не просто средство связи, а программируемое устройство, которое обрабатывает все детали ввода/вывода после получения списка операций ввода/вывода (программы канала). Каждый канал может поддерживать один или несколько контроллеров и/или устройств, но каждая программа канала может быть адресована только одному из подключенных устройств. Программа канала содержит списки команд для самого канала, а также для контроллера и устройства, которым она адресована. После того как операционная система подготовит полный список команд канала, она выполнит одну машинную инструкцию I/O для запуска программы канала; после этого канал берет на себя управление операциями ввода/вывода до их завершения. Возможно создание очень сложных программ канала, включающих проверку данных и условное ветвление внутри программы. Такая гибкость освобождает процессор от накладных расходов на запуск, мониторинг и управление отдельными операциями ввода/вывода. Специализированное аппаратное обеспечение канала, в свою очередь, предназначено исключительно для ввода/вывода и может выполнять его более эффективно, чем процессор (и полностью параллельно с процессором). Канал I/O во многом схож с прямым доступом к памяти (DMA) в микрокомпьютерах, но является более сложным и продвинутым. В больших мейнфрейм-системах процессоры – лишь один из нескольких мощных аппаратных компонентов, работающих параллельно. Специальные контроллеры ввода/вывода (точные названия которых могут различаться у разных производителей) обрабатывают ввод/вывод исключительно, и они, в свою очередь, подключены к аппаратным каналам, также предназначенным для ввода и вывода. Может быть несколько процессоров и несколько процессоров ввода/вывода. Общая архитектура оптимизирует производительность ввода/вывода, не снижая производительность процессора. Поскольку большинство реальных приложений мейнфрейм-систем – это бизнес-приложения, интенсивно использующие ввод/вывод, эта архитектура обеспечивает очень высокую пропускную способность, которая отличает мейнфреймы от других типов компьютеров. В терминологии IBM ESA/390 канал – это параллельное соединение данных внутри древовидной или иерархически организованной подсистемы ввода/вывода. В системах System/390 каналы ввода/вывода либо напрямую подключаются к устройствам, установленным внутри корпуса (коммуникационные адаптеры, такие как ESCON, FICON, Open Systems Adapter), либо проходят за пределами корпуса, под приподнятым полом в виде кабелей толщиной в палец и напрямую подключаются к каналам интерфейсов на более крупных устройствах, таких как подсистемы магнитных лент, устройства хранения прямого доступа (DASD), концентраторы терминалов и другие системы ESA/390.

Типы каналов

Каналы различаются по количеству и типу поддерживаемых одновременных операций ввода-вывода. В терминологии IBM канал мультиплексора поддерживает несколько одновременных чередующихся операций с низкой скоростью, каждая из которых передает по одному байту от устройства за раз. Канал селектора поддерживает одну высокоскоростную операцию, передавая блок данных за один раз. Блок-мультиплексор поддерживает несколько логически одновременных канальных программ, но только одну высокоскоростную передачу данных одновременно. Каналы также могут различаться по способу сопоставления периферийных устройств с буферами памяти. В терминологии UNIVAC канал может быть либо с внутренним указанием индекса (ISI), с одним активным буфером и устройством одновременно, либо с внешним указанием индекса (ESI), когда устройство само выбирает, какой буфер использовать.

Программа канала

Каналная программа — это последовательность командных слов канала (CCW), которые выполняются подсистемой канала ввода-вывода в IBM System/360 и последующих архитектурах. Каналная программа состоит из одного или нескольких командных слов канала. Операционная система сигнализирует подсистеме канала ввода-вывода о начале выполнения программы канала с помощью инструкции SSCH (start sub channel). Центральный процессор затем свободен для выполнения не-I/O инструкций до момента прерывания. Когда операции канала завершены, канал прерывает центральный процессор посредством I/O прерывания. В ранних моделях линейки мейнфреймов IBM, блок канала являлся идентифицируемым компонентом, по одному на каждый канал. В современных мейнфреймах каналы реализуются с использованием независимого RISC-процессора, каналного процессора, общего для всех каналов. Архитектура IBM System/370 Extended и её преемники заменили более ранние машинные инструкции SIO (start I/O) и SIOF (start I/O fast release) (System/360 и ранние System/370) инструкцией SSCH (start sub channel) (ESA/370 и преемники). Канал ввода-вывода обеспечивает значительную экономию при операциях ввода-вывода. Например, в Linux на IBM Z для форматирования целого трека DASD требуется только одна программа канала (и, следовательно, только одна инструкция ввода-вывода), но несколько командных слов канала (по одному на блок). Программа выполняется выделенным процессором ввода-вывода, в то время как процессор приложений (ЦП) свободен для выполнения других задач.

Командные слова канала

Командное слово канала (CCW) — это инструкция для специализированного процессора канала ввода-вывода, который, по сути, является конечным автоматом. Оно используется для инициирования операции ввода-вывода, такой как "чтение", "запись" или "опрос", на устройстве, подключенном к каналу. В системных архитектурах, реализующих ввод-вывод через каналы, как правило, все устройства подключены через каналы, и поэтому для всех операций ввода-вывода требуется использование CCW. Операционная система, подпрограмма ввода-вывода, утилита или автономное программное обеспечение (например, тестовые и диагностические программы) организуют CCW в канальные программы. В таких канальных программах доступна ограниченная возможность "ветвления", а следовательно, и динамического программирования, с использованием флага канала "модификатор статуса" и CCW "передача в канале".

Цепление

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

Самомодифицирующие программы канала

Каналные программы могут изменять свою работу в процессе выполнения на основе прочитанных данных. Например, самомодификация широко используется в OS/360 ISAM.

Каналные программы в виртуальных системах хранения

В большинстве систем каналы работают с использованием реальных (или физических) адресов, в то время как канальные программы создаются с использованием виртуальных адресов. Операционная система отвечает за преобразование этих канальных программ перед их выполнением, и для этой конкретной цели ввод/вывод Supervisor (IOS) имеет специальную функцию быстрого исправления, разработанную в ОС Supervisor специально для "исправлений" относительно небольшой продолжительности (то есть значительно меньшей, чем реальное время). Страницы, содержащие данные, необходимые для операции ввода/вывода, блокируются в реальной памяти, или фиксируются. Канальная программа копируется, и все виртуальные адреса заменяются реальными адресами перед началом операции ввода/вывода. После завершения операции страницы разблокируются. Поскольку фиксирование и разблокирование страниц – ресурсоемкий процесс для ЦП, долгосрочное фиксирование страниц иногда используется для снижения нагрузки на ЦП. В этом случае виртуальная память фиксируется на весь жизненный цикл приложения, а не фиксируется и освобождается при каждой операции ввода/вывода. Db2 является примером программы, которая может использовать долгосрочное фиксирование страниц. Альтернативой долгосрочному фиксированию страниц является перемещение всего приложения, включая все его буферы данных, в предпочтительную область основной памяти. Это достигается с помощью специального SYSEVENT в операционных системах MVS/370 и z/OS, при котором приложение, во-первых, выгружается из текущего расположения (предположительно, из непредпочтительной области) во внешнюю память для подкачки и обмена, а во-вторых, загружается в предпочтительную область (SYSEVENT TRANSWAP). После этого приложение может быть помечено как не подлежащее выгрузке другим специальным SYSEVENT (SYSEVENT DONTSWAP). Всякий раз, когда такое приложение завершается, нормально или аварийно, операционная система неявно выдает еще один специальный SYSEVENT от имени приложения, если это еще не было сделано (SYSEVENT OKSWAP).

Загрузка с каналом ввода/вывода

Даже загрузка системы, или Initial Program Load (IPL) в терминологии IBM, осуществляется каналами, хотя процесс частично имитируется процессором посредством подразумеваемой инструкции Start I/O (SIO), подразумеваемого слова адреса канала (CAW) по адресу 0 и подразумеваемого командного слова канала (CCW) с кодом операции Read IPL, также по адресу 0. Предполагается цепочка команд, поэтому подразумеваемый CCW по адресу 0 переходит к продолжению программы канала по адресам 8 и 16, и, возможно, далее, если один из этих CCW является командой передачи в канале (TIC). Для загрузки системы подразумеваемый CCW Read IPL считывает первый блок выбранного устройства IPL в 24-байтовую область данных по адресу 0, канал продолжает работу со вторым и третьим двойным словом, которые являются CCW, и эта программа канала загружает первую часть программного обеспечения загрузки системы в другое место в основной памяти. Первое двойное слово содержит PSW, который, при выборке в конце IPL, заставляет процессор выполнить IPL Text (bootstrap loader), прочитанный 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 Text содержится на цилиндре 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 дорожек). DSCB формата 4 VTOC определяет размер VTOC, поэтому на метке тома требуется только указатель на первую дорожку в области VTOC, и поскольку DSCB формата 4, описывающий VTOC, всегда является первым DSCB в VTOC, HHHH также указывает на DSCB формата 4. Если предпринята попытка загрузки с устройства, которое не было инициализировано IPL Text, система просто переходит в состояние ожидания. Программа инициализации DASD, IBCDASDI, или приложение инициализации DASD, ICKDSF, помещает PSW в состоянии ожидания и фиктивную цепочку CCW в 24 байта, если устройство предназначено только для данных, а не для IPL, после чего эти программы форматируют VTOC и выполняют другие функции инициализации жесткого диска.