Введение

Операционная система мэйнфрейма

MCP (Master Control Program) – операционная система компьютеров Burroughs B5000/B5500/B5700 и B6500 и их преемников, включая системы Unisys Clearpath/MCP. Изначально MCP был разработан в 1961 году на языке ESPOL (Executive Systems Problem Oriented Language). В 1970-х годах MCP был переведен на NEWP, который представлял собой более структурированную, надежную и безопасную форму ESPOL. MCP был пионером во многих областях, в том числе: первая операционная система, способная управлять несколькими процессорами, первая коммерческая реализация виртуальной памяти и первая ОС, полностью написанная на языке высокого уровня.

История

В 1961 году MCP стала первой ОС, написанной исключительно на языке высокого уровня (HLL). Комплекс Burroughs Large System (B5000 и последующие модели) был уникален тем, что при его разработке предполагалось, что все программное обеспечение, включая системное, будет написано на HLL, а не на языке ассемблера. Такой подход был новаторским и неслыханным в 1961 году. В отличие от IBM, столкнувшейся с конкуренцией в области аппаратного обеспечения после ухода Джина Амдала, программное обеспечение Burroughs работало исключительно на аппаратном обеспечении Burroughs из-за отсутствия совместимого оборудования от сторонних производителей. Благодаря этому Burroughs имела возможность распространять исходный код всего продаваемого программного обеспечения, включая MCP, который изначально разрабатывался с учетом принципов открытости. Например, для обновления системы пользователю требовалось перекомпилировать системное программное обеспечение и применить необходимые локальные исправления. В то время это было обычной практикой, поскольку клиенты (особенно крупные, такие как Федеральная резервная система) часто модифицировали программу для соответствия своим специфическим потребностям. В результате была создана Группа пользователей Burroughs, которая проводила ежегодные встречи, позволяя пользователям обмениваться собственными расширениями для ОС и других компонентов системного программного обеспечения. Многие из этих расширений со временем были включены в базовый код ОС и стали доступны всем клиентам. Таким образом, MCP можно считать одним из первых проектов с открытым исходным кодом. Компания Burroughs не была первым производителем, распространявшим исходный код, и относительно поздно вошла на рынок электронных вычислений (по сравнению с традиционными конкурентами NCR, IBM и Univac). В настоящее время, когда MCP работает на стандартном оборудовании, некоторые компоненты программного обеспечения на базе MCP больше не предоставляются Unisys в исходном коде. MCP стала первой коммерческой ОС, реализовавшей виртуальную память, поддержка которой заложена в архитектуре крупных систем Burroughs с момента ее создания. Эта схема уникальна в отрасли, поскольку она хранит и извлекает объекты, определенные компилятором, а не страницы памяти фиксированного размера, что является следствием не-фон-неймановской и унифицированной стековой архитектуры. Компания Unisys прекратила производство аппаратного обеспечения в начале 2010-х годов, и в настоящее время операционная система работает в среде эмуляции.

Файловая система

MCP предоставляет файловую систему с иерархической структурой каталогов. В ранних реализациях MCP узлы каталогов представлялись отдельными файлами с записями каталогов, как это делалось в других системах. Однако, начиная примерно с 1970 года, MCP внутренне использует ‘FLAT’-каталог, содержащий перечень всех путей к файлам на томе. Это обусловлено тем, что открытие файлов путем последовательного посещения и открытия каждого каталога в пути к файлу было неэффективно, и для производственной среды оказалось предпочтительнее хранить все файлы в одном каталоге, несмотря на сохранение иерархической схемы именования. Программно это не имеет значения. Единственное отличие, видимое пользователям, заключается в том, что файл-объект может иметь такое же имя, как и каталог. Например, "A/B" и "A/B/C" могут существовать одновременно; "B" может быть как узлом файла, так и каталогом. Файлы хранятся на именованных томах, например, 'this/is/a/filename on myvol', где 'myvol' – имя тома. Это не зависит от конкретного устройства, поскольку диск, содержащий 'myvol', можно переместить или скопировать на различные физические накопители. Диски также могут быть объединены, чтобы один том мог быть установлен на нескольких накопителях, а также зеркалироваться для обеспечения возможности восстановления конфиденциальных данных. Для большей гибкости каждая программа может выполнять подстановку томов, заменяя имя тома на основное и вторичное альтернативное имя. Этот процесс называется ‘FAMILY’. Например, присвоение FAMILY DISK = USERPACK OTHERWISE SYSPACK сохраняет файлы, логически предназначенные для тома DISK, на томе USERPACK и сначала ищет файлы на томе USERPACK. Если поиск не дал результатов, выполняется поиск файла на томе SYSPACK. DISK является именем тома по умолчанию, если не указано иное. Каждый файл в системе имеет набор атрибутов файла. Эти атрибуты содержат различные метаданные о файле, в первую очередь его имя и тип (который указывает системе, как обрабатывать файл, подобно более ограниченному четырехсимвольному коду типа файла в Macintosh). Другие атрибуты включают размер записи файла (если он фиксирован для коммерческих приложений), размер блока (в единицах записей, который сообщает MCP, сколько записей читать и записывать за один физический ввод-вывод) и размер области в единицах блоков, определяющий размер дисковых областей, выделяемых по мере расширения файла. Тип файла указывает, содержит ли файл символьные данные, исходный код, написанный на определенных языках, бинарные данные или файлы кода. Файлы защищены обычными механизмами безопасности доступа, такими как общедоступный или частный, или файл может иметь защитный файл, в котором владелец может указать сложные правила безопасности. Другой механизм безопасности заключается в том, что файлы кода могут быть созданы только доверенными компиляторами. Злоумышленники не могут создать программу и назвать ее компилятором – программа может быть преобразована в компилятор только оператором с достаточными привилегиями с помощью команды оператора компилятора 'mc'. MCP реализует журналируемую файловую систему, обеспечивающую устойчивость к сбоям в случае отказа диска, потери питания и т.п. Повредить файловую систему невозможно (за исключением операционной системы или другого доверенного системного программного обеспечения с прямым доступом к ее нижним уровням). Файловая система не учитывает регистр символов, если вокруг имени не указаны кавычки, в этом случае она учитывает регистр и сохраняет его.

Управление процессами

Процессы MCP называются "Заданиями" и "Задачами". Задание содержит одну или несколько задач. Задачи внутри задания могут выполняться последовательно или параллельно. Логика может быть реализована на уровне задания, как правило, на языке управления заданиями MCP WFL, для управления потоком задания. Как только все задачи в задании завершены, само задание также завершается. Процесс MCP проходит жизненный цикл с момента его входа в систему до момента его выхода. Начальное состояние для задания – "В очереди". Существует период времени, в течение которого задание находится в одной из нескольких определяемых пользователем очередей заданий. Следующее состояние – "Запланировано", когда задание перемещается из очереди в память. Задачи внутри задания не ожидают в очереди; вместо этого они переходят непосредственно в состояние "Запланировано" при запуске. После того, как задание или задача запущены, они могут переходить между состояниями "Активно", "Ожидание" и "Запланировано" по мере выполнения. Как только задание или задача завершены, они переходят в состояние "Завершено". Запущенные процессы – это те, которые используют ресурс процессора и помечены как "Запущенные". Процессы, готовые к назначению процессору, когда нет свободных процессоров, помещаются в очередь готовых. Процессам может быть присвоен приоритет "Объявленный" или "Видимый", обычно 50 по умолчанию, но может быть от 0 до 99 для пользовательских процессов. Системным процессам могут быть присвоены более высокие значения. Следует отметить, что этот числовой приоритет вторичен по отношению к общему приоритету, который основан на типе задачи. Процессы, которые непосредственно являются частью операционной системы, называемые Независимыми исполнителями, имеют наивысший приоритет независимо от числового значения приоритета. Далее следуют процессы, использующие блокировку MCP, затем системы управления сообщениями, такие как CANDE. Затем – завершенные процессы. Затем – задания языка рабочих потоков. И, наконец, – пользовательские процессы. На более низком уровне существует приоритет "Тонкий", предназначенный для повышения приоритета задач, которые не используют весь процессорный квант. Это позволяет задаче, связанной с вводом-выводом, получить процессорное время раньше задачи, связанной с процессором, при том же объявленном приоритете. Процессы, ожидающие другие ресурсы, такие как файл для чтения, ожидают структуру данных EVENT. Таким образом, все процессы, ожидающие один и тот же ресурс, ожидают одно и то же событие. Когда ресурс становится доступным, событие вызывается, что пробуждает все процессы, ожидающие его. Процессы могут ожидать несколько событий, чтобы произошло любое из них, включая тайм-аут. События полностью программируются пользователем, то есть пользователи могут создавать системы, использующие обобщенную систему событий, предоставляемую MCP. Процессы, которые завершились, помечаются как завершенные. Оперативно, статус всех задач в системе отображается оператору. Все запущенные и готовые процессы отображаются как "Активные" задачи (поскольку система реализует вытесняющую многозадачность, переход из состояния "Готов" в "Запущен" и обратно происходит настолько быстро, что различать готовые и запущенные задачи бессмысленно, поскольку все они получат квант процессора в течение секунды). Все активные задачи могут быть отображены с помощью команды "A". Завершенные задачи отображаются как завершенные задачи с указанием причины завершения: EOT для нормального "конца задачи" и DSed с указанием причины сбоя процесса. Всем процессам присваивается номер смешения, и операторы могут использовать этот номер для идентификации процесса, подлежащего управлению. Одной из таких команд является команда DS (которая означает либо "Удалить из расписания", "Прекратить", либо "Отправить на дно", в зависимости от влияния военно-морского персонала на ранние компьютерные проекты, в зависимости от того, с кем вы разговариваете). Задачи, завершенные оператором, отображаются в полных записях как O DS. Задачи также могут быть завершены из-за ошибок программы, отмеченных как F DS или P DS, для таких ошибок, как недействительный индекс, числовое переполнение и т. д. Завершенные записи могут быть перечислены оператором с помощью команды "C". Задачи, ожидающие ресурс, отображаются в записях ожидания с указанием причины ожидания. Все ожидающие задачи могут быть перечислены с помощью команды "W". Причина ожидания также указывается, и дополнительную информацию о задаче можно увидеть с помощью команды "Y". Возможно, что задача ожидает ввода оператора, который отправляется задаче с помощью команды accept "AX" (обратите внимание, что ввод оператора сильно отличается от пользовательского ввода, который будет вводом с сетевого устройства с графическим интерфейсом). Задачи, ожидающие пользовательского ввода или чтения файлов, обычно не отображаются в записях ожидания для привлечения внимания оператора. Другой причиной ожидания задачи является ожидание файла. Когда процесс открывает файл, и файл отсутствует, задача помещается в записи ожидания с указанием того, что она ожидает определенный файл. Оператор (или пользователь, которому принадлежит процесс) имеет возможность либо скопировать файл в ожидаемое место, либо перенаправить задачу на чтение файла из другого места, либо файл может быть даже создан независимым процессом, который еще не завершен. Если ресурс не может быть предоставлен оператором, оператор может завершить задачу (DS) в качестве крайней меры. Это отличается от других систем, которые автоматически завершают задачу, когда недоступен ресурс, такой как файл. MCP обеспечивает этот уровень восстановления задач оператором. Другие системы заставляют программистов добавлять код для проверки наличия файлов перед доступом к ним, и, следовательно, дополнительный код должен быть написан в каждом случае для обеспечения восстановления или синхронизации процессов. Такой код может быть написан в программе MCP, когда нежелательно, чтобы задача ожидала, но из-за возможности восстановления на уровне оператора это не является обязательным и, следовательно, упрощает программирование. В дополнение к возможности динамического переназначения запросов к файлам (или базам данных) другим файлам (или базам данных) до или во время выполнения программы, существует несколько механизмов, позволяющих программистам обнаруживать и восстанавливаться после ошибок. Один из способов, оператор "ON", существует уже много лет. Можно указать конкретные ошибки (например, деление на ноль) или использовать универсальный "anyfault". Оператор или блок, следующий за оператором "ON", распознается компилятором как код обработки ошибок. Во время выполнения, если произойдет восстанавливаемая ошибка в области действия оператора "on", стек будет сокращен, и управление будет передано оператору, следующему за ним. Одна из проблем с логикой обработки оператора "ON" заключалась в том, что он вызывался только для ошибок программы, а не для завершений программы по другим причинам. Со временем возросла потребность в гарантированной обработке ненормальных завершений. В частности, был необходим механизм, позволяющий программам вызывать плагины, написанные клиентами или третьими сторонами, без какого-либо риска, если плагин будет работать некорректно. В дополнение к общим механизмам плагинов, новая форма динамической связи библиотек (Connection Libraries) позволяет программам импортировать и экспортировать функции и данные, и, следовательно, одна программа выполняет код, предоставляемый другой. Для достижения такой повышенной защиты в середине 1990-х годов был введен более новый механизм. В ошибочной попытке совместимости он был назван в честь тогдашнего предлагаемого конструктора языка C++ с тем же именем. Поскольку синтаксис и поведение двух языков настолько сильно различаются, выбор одного и того же имени привел только к путанице и недопониманию. Синтаксически операторы "try" выглядят как операторы "if": "try", за которым следует оператор или блок, за которым следует "else" и другой оператор или блок. За первым "else" могут следовать дополнительные операторы "else". Во время выполнения, если в коде, следующем за оператором "try", произойдет какое-либо восстанавливаемое завершение, стек будет сокращен, если это необходимо, и управление перейдет к коду, следующему за первым оператором "else". Кроме того, устанавливаются атрибуты, позволяющие программе определить, что произошло и где (включая конкретный номер строки). Большинство событий, которые приводят к завершению задачи, восстанавливаются. Это включает переполнение стека, выход за границы массива, целочисленное переполнение/недополнение и т. д. Завершение (DS) оператором или пользователем не восстанавливается, за исключением привилегированных задач, использующих небезопасную форму try. Таким образом, MCP обеспечивает высоко отказоустойчивую среду, а не сбой и дамп памяти других систем. Как и в случае с файлами...

Порт-файлы

Другой метод межпроцессного взаимодействия (IPC) – это портовые файлы. Они похожи на каналы Unix, но обобщены для обеспечения многосторонней и двунаправленной связи. Поскольку они на порядок медленнее других методов IPC, таких как библиотеки, предпочтительнее использовать другие методы для IPC между различными процессами на одном компьютере. Поэтому наиболее эффективное применение портовых файлов – для распределенного IPC. Портовые файлы были введены вместе с BNA (Burroughs Network Architecture), но с появлением стандартных сетевых технологий, таких как OSI и TCP/IP, их можно использовать и с этими сетями. Сервер, ожидающий входящие соединения, объявляет портовый файл (файл с атрибутом KIND, равным PORT). Каждое соединение, установленное клиентом, создает подфайл с индексом, поэтому каждый портовый файл представляет собой множество соединений с различными клиентами в сети. Серверный процесс получает запросы от клиентов из любой точки сети, выполняя операцию чтения из портового файла (подфайл = 0 для чтения из любого подфайла). Он отправляет ответ клиенту, который отправил запрос, выполняя операцию записи в конкретный подфайл, из которого был прочитан запрос.

Окружающая среда

MCP также предоставляет сложную, но при этом простую операторскую среду. Для крупных установок может потребоваться несколько операторов для обеспечения доступности физических ресурсов, таких как принтеры (загрузка бумаги, тонер-картриджей и т.п.). В средах начального уровня для небольших офисов или отдельных пользователей может потребоваться среда, не требующая оператора (особенно в случае реализации для ноутбуков). Крупные системы оснащены специализированными операторскими терминалами, называемыми ODT (Operator Display Terminals), которые обычно размещаются в защищенной среде. Для небольших систем управление машинами может осуществляться с любого терминала (при условии, что терминал и пользователь обладают достаточными правами) с помощью программы MARC (Menu Assisted Resource Control). Операторские команды также могут использоваться пользователями, знакомыми с ними. Операторские команды в основном состоят из двух букв (как в Unix), а некоторые – всего из одной. Это означает, что операторский интерфейс требует изучения, но он очень эффективен для опытных операторов, ежедневно работающих с крупной мэйнфрейм-системой. Команды не чувствительны к регистру. Задачи вводятся в программу 'mix' и идентифицируются номерами миксов, как и библиотеки. Для запуска программы операторы могут использовать команду 'EX' или 'RUN', за которой следует имя файла программы. ODT обычно работают в режиме ADM (Automatic Display Mode) – настраиваемом отображении состояния системы, обычно настроенном для отображения активных, ожидающих и завершенных записей миксов, а также системных сообщений для оператора, содержащих уведомления или информацию о ситуациях, требующих его вмешательства. Полный перечень этих отображений предоставляется командами 'A' (активные), 'W' (ожидающие), 'C' (завершенные) и 'MSG' (сообщения). Если задача переходит в состояние ожидания действия оператора, оператор может узнать, что требуется задаче, введя ее номер микса, за которым следует команда 'Y'. (Обратите внимание на объектно-ориентированный стиль команд: сначала выбирается объект, затем команда.) Например, '3456Y'. Оператор может перевести задачу в состояние ожидания с помощью команды остановки '3456ST' и снова активировать ее командой OK: '3456OK'. Команда OK также может использоваться, когда оператор предоставил ресурс для задачи, хотя чаще всего MCP самостоятельно обнаруживает, что ресурсы стали доступны, и генерирует событие, которого ожидали процессы, без дальнейшего вмешательства оператора. Для передачи текстовой информации от оператора программе можно использовать команду accept ‘3456AX MORE INFO’. Программы могут передавать информацию операторам с помощью механизма DISPLAY, который добавляет сообщения DISPLAY в отображение MSG. Помимо задач и процессов, операторы также контролируют файлы. Файлы можно просмотреть с помощью команды FILE, скопировать с помощью COPY, удалить с помощью REMOVE и переименовать. Операционная среда MCP мощная, но простая и обычно требует значительно меньше операторов, чем другие системы. Важной частью операционной среды является язык рабочего процесса высокого уровня.

Лесозаготовка

Все действия в системе протоколируются, например, все сообщения, отображаемые оператору, и все действия оператора. Все значимые действия программы могут быть протоколированы в системном журнале и журнале программы, например, BOJ для обозначения начала задания WFL, BOT – начала задачи в рамках задания WFL, EOT и EOJ – завершения задач и заданий. Также протоколируются все операции открытия и закрытия файлов и баз данных. Интенсивное протоколирование событий вносит вклад в кажущуюся медлительность операционной среды MCP по сравнению с системами, такими как Unix, поскольку все протоколируется с принудительной физической записью в журнал программы после каждой записи, чего системы, подобные Unix, не делают, хотя и они хранят множество данных в системных журналах. Журналы могут использоваться для проведения криминалистического анализа с целью выяснения причин сбоев программ или систем, а также для выявления попыток компрометации безопасности системы. Системные журналы автоматически закрываются по истечении периода времени, заданного в настройках системы, и открываются новые. Системные журналы содержат огромный объем информации, который можно фильтровать и анализировать с помощью программ, таких как LOGANALYZER. DUMPANALYZER анализирует дампы памяти, первоначально записанные на ленту. Поскольку все компиляторы добавляют LINEINFO в файлы кода, DUMPANALYZER способен точно определить, какая строка исходного кода выполнялась в момент возникновения ошибки. Кроме того, обычный дамп программы, содержащий информацию только об одной программе, включает данные о номере последовательности исходного кода и именах переменных. Оба анализатора являются важными диагностическими инструментами для решения широкого спектра задач.

Инновации

Помимо множества технических инноваций в архитектуре MCP, большие системы Burroughs содержали ряд управленческих инноваций, которые сейчас широко используются интернет-сообществом. Системное программное обеспечение поставлялось клиентам вместе с исходным кодом и всеми инструментами редактирования и компиляции, необходимыми для создания новых версий MCP. Многие клиенты приобрели глубокие знания о внутреннем устройстве MCP и часто присылали "патчи" (небольшие фрагменты исходного кода с номерами последовательности) в качестве предложений по добавлению новых функций или исправлению ошибок (отчеты о проблемах в эксплуатации FTR). Многие из предложенных патчей принимались разработчиками и включались в следующую версию MCP. Привлечение сообщества добровольных, самопровозглашенных экспертов к основной технической работе стало широко распространенной практикой и является основой концепции открытых инноваций. Эта управленческая инновация, основанная на развитии сообщества, берет свое начало в 1970-х годах.

Сборщик

В операционной системе Unisys MCP отсутствует ассемблер.

Резюме

MCP была первой ОС, разработанной исключительно на языке высокого уровня. За свою 50-летнюю историю она стала пионером во многих коммерческих реализациях, включая виртуальную память, симметричную многопроцессорность и язык управления заданиями высокого уровня (WFL). Она на протяжении долгого времени обладала множеством функций, которые только сейчас появляются в других широко распространенных операционных системах, а в сочетании с архитектурой больших систем Burroughs, MCP предоставляет высокопроизводительную, многозадачную среду для обработки транзакций.