Все свое время, здоровье и состояние я принес в жертву желанию завершить создание этих машин для вычислений.
Я отклонил также ряд предложений, суливших для меня большие личные выгоды. Однако, несмотря на мой отказ от всех этих выгод с целью совершенствования машины, обладающей почти интеллектуальной мощью, и после того как я истратил из моего собственного состояния больше денег, чем правительство Англии выделило на эту машину (причем только в начале работ), я не получил ни благодарности за мои труды, ни даже тех почестей и наград, которые, как правило, достаются людям, посвятившим себя чисто научным исследованиям...
Если бы работа, на которую я затратил так много времени и душевных сил, была только победой над обычными техническими трудностями или просто курьезом, или если бы были сомнения в целесообразности или полезности подобных машин, то можно было бы в какой-то мере понять и оправдать такое отношение; однако я позволю себе утверждать, что ни один достойный уважения мате тик никогда не рискнет публично выразить мнение, что подобная машина, если она будет сделана, окажется бесполезной,
— и что ни один человек, известный как грамотный инженер, не рискнет объявить построение подобных машин нецелесообразным.
Я считаю, что в то время, когда серьезным препятствием на пути прогресса физических наук становятся громадные объемы интеллектуального и ручного труда, необходимого для дальнейшего продвижения, а именно облегчить этот труд и призвана аналитическая машина, применение машин как помощников в выполнении наиболее сложных и трудоемких вычислений нельзя более полагать проблемой, недостойной внимания страны. И действительно, нет никаких причин, не позволяющих экономить труд умственный, подобно физическому, благодаря использованию машин.
Чарльз Бэббидж Отрывок из книги «Жизнь философа»
Элементы, из которых строятся компьютеры, становятся все более малыми, они выходят за границы возможностей обычных микроскопов
— в бесконечные пространства мира молекул.
Кристофер Эванс
Программы
— это посредники между пользователем и машиной.
Гарлен Д. Миллс
Микропрограммирование
— это реализация предположительно разумных систем путем интерпретации на неразумных машинах!
Р. Ф. Розин
Микропрограммирование неэффективного алгоритма не делает его эффективным,
Закон Роше
2.1 Введение
2.2 Аппаратура
2.2.1 Расслоение памяти
2.2.2 Регистр перемещения
2.2.3 Прерывания и опрос состояний
2.2.4 Буферизация
2.2.5 Периферийные устройства
2.2.6 Защита памяти
2.2.7 Таймеры и часы
2.2.8 Работа в режиме он-лайн и автономный режим (оф-лайн), периферийные процессоры
2.2.9 Каналы ввода-вывода
2.2.10 Захват цикла
2.2.11 Относительная адресация
2.2.12 Режим задачи, режим супервизора, привилегированные команды
2.2.13 Виртуальная память
2.2.14 Мультипроцессорная обработка
2.2.15 Прямой доступ к памяти
2.2.16 Конвейеризация
2.2.17 Иерархия памяти
2.3 Программное обеспечение
2.3.1 Программирование на машинном языке
2.3.2 Ассемблеры и макропроцессоры
2.3.3 Компиляторы
2.3.4 Системы управления вводом-выводом (IOCS)
2.3.5 Спулинг
2.3.6 Процедурно-ориентированные и проблемно-ориентированные языки
2.3.7 Быстрые компиляторы без оптимизации и оптимизирующие компиляторы
2.3.8 Интерпретаторы
2.3.9 Абсолютные и перемещающие загрузчики
2.3.10 Связывающие загрузчики и редакторы связей
2.4 Микропрограммы
2.4.1 Горизонтальный и вертикальный микрокод
2.4.2 Выбор функций для микропрограммной реализации
2.4.3 Эмуляция
2.4.4 Микродиагностика
2.4.5 Специализированные компьютеры
2.4.6 Микропрограммная поддержка
2.4.7 Микропрограммирование и операционные системы
2.4.8 Пример микропрограммирования
2.1 Введение
В данной главе мы кратко рассмотрим, что такое аппаратура, программное обеспечение и микропрограммы. Все они играют важную роль с точки зрения функционирования вычислительных машин и управления ими. Аппаратные средства
— это устройства вычислительной машины; ее процессоры, устройства памяти и устройства ввода-вывода, а также средства приема-передачи данных. Программное обеспечение
— это программы, содержащие команды на машинном языке и данные, которые соответствующим образом интерпретируются аппаратурой машины. В качестве примеров некоторых распространенных видов программных средств можно привести компиляторы, ассемблеры, загрузчики, редакторы связей, связывающие загрузчики, прикладные программы пользователя, системы управления базами данных, системы приема — передачи данных и операционные системы. Микропрограммы—
это микрокодированные программы, выполняемые непосредственно из управляющей памяти очень высокого быстродействия. Наиболее часто используемые объектные программы, занесенные в постоянную память (постоянные запоминающие устройства и программируемые ПЗУ), также иногда называют микропрограммным обеспечением. О микропрограммировании и его важной роли для современных машинных архитектур и операционных систем идет речь в последнем разделе настоящей главы.
2.2 Аппаратура
В нескольких следующих разделах рассматриваются различные виды аппаратных средств, которые имеют важное значение с точки зрения работы операционных систем. Читатель, которому требуются более подробные сведения об аппаратуре, может обратиться к таким книгам-учебникам по архитектуре компьютеров, как (Ва80), (1182) и (Le80).
2.2.1 Расслоение памяти
Метод расслоения памяти
(интерливинг) применяется для увеличения скорости доступа к основной (оперативной) памяти. В обычном случае во время обращения к какой-то одной из ячеек модуля основной памяти никакие другие обращения к памяти производиться не могут. При расслоении памяти соседние по адресам ячейки размещаются в различных модулях памяти, так что появляется возможность производить несколько обращений одновременно. Например, при расслоении на два направления ячейки с нечетными адресами оказываются в одном модуле памяти, а с четными — в другом. При простых последовательных обращениях к основной памяти ячейки выбираются поочередно. Таким образом, расслоение памяти позволяет обращаться сразу к нескольким ячейкам, поскольку они относятся к различным модулям памяти.
2.2.2 Регистр перемещения
Регистр перемещения
обеспечивает возможность динамического (перемещения программ в памяти. В регистр перемещения заносится базовый адрес программы, хранящейся в основной памяти. Содержимое регистра перемещения прибавляется к каждому указанному в выполняемой программе адресу. Благодаря этому пользователь может писать программу так, как если бы она начиналась с нулевой ячейки памяти. Во время выполнения программы все исполнительные адреса обращений формируются с использованием регистра перемещения — и благодаря этому программа может реально размещаться в памяти совсем не в тех местах, которые она должна была бы занимать согласно адресам, указанным при трансляции.
2.2.3 Прерывания и опрос состояний
Одним из способов, позволяющих некоторому устройству проверить состояние другого, независимо работающего устройства, является опрос;
например, первое устройство может периодически проверять, находится ли второе устройство в определенном состоянии, и если нет, то продолжать свою работу. Опрос может быть связан с высокими накладными расходами.
Прерывания дают возможность одному устройству немедленно привлечь внимание другого устройства, с тем чтобы первое могло сообщить об изменении своего состояния. Состояние
устройства, работа которого прерывается, должно быть сохранено, только после этого можно производить обработку данного прерывания. После завершения обработки прерывания состояние прерванного устройства восстанавливается, с тем чтобы можно было продолжить работу. Прерывания подробно обсуждаются в гл. 3.
2.2.4 Буферизация
Буфер
— это область основной памяти, предназначенная для промежуточного хранения данных при выполнении операций ввода-. вывода. Скорость выполнения операции ввода-вывода зависит от многих факторов, связанных с характеристиками аппаратуры ввода-вывода, однако в обычном случае ввод-вывод производится не синхронно с работой процессора. При вводе, например, данные помещаются в буфер средствами канала ввода-вывода; после занесения данных в буфер процессор получает возможность доступа к этим данным.
При вводе с простой буферизацией
канал помещает данные в буфер, процессор обрабатывает эти данные, канал помещает следующие данные и т. д. В то время, когда канал заносит данные, обработка этих данных производиться не может, а во время обработки данных нельзя заносить дополнительные данные. Метод двойной буферизации
позволяет совмещать выполнение операции ввода-вывода с обработкой данных; когда канал заносит данные в один буфер, процессор может обрабатывать данные другого буфера. А когда процессор заканчивает обработку данных одного буфера, канал будет заносить новые данные опять в первый буфер. Такое поочередное использование буферов иногда называют буферизацией с переключением («триггерной» буферизацией).
Обмен данными между каналами и процессорами будет рассмотрен ниже.
2.2.5 Периферийные устройства
Периферийные
(внешние запоминающие) устройства
позволяют /хранить громадные объемы информации вне основной памяти компьютера. Лентопротяжные устройства являются в принципе последовательными устройствами, которые предусматривают чтение и запись данных на длинной магнитной ленте. Ленты могут иметь длину до 1100 м при намотке на 30-см кассеты. Информация может фиксироваться на ленте с различными плотностями записи.
Для первых лентопротяжных устройств плотность записи составляла восемь символов на миллиметр длины ленты, затем стандартной стала плотность записи 22 симв/мм, затем 32 симв/мм, затем 64 симв/мм, а в настоящее время — 250 симв/мм. Устройства новых поколений безусловно будут иметь еще большие плотности записи.
Самым важным устройством внешней памяти с точки зрения операционных систем является, по-видимому, накопитель на магнитных дисках. Накопители на магнитных дисках — это устройства прямого доступа, они позволяют обращаться к отдельным элементам данных, не требуя последовательного просмотра всех элементов данных, хранящихся на диске. Первые дисковые накопители могли хранить по несколько миллионов символов. Емкость памяти каждого из современных накопителей может достигать миллиарда символов. В ближайшем будущем должны быть созданы накопители еще большей емкости. Работа дисковых накопителей и их роль для операционных систем описаны в гл. 12 и 13.
2.2.6 Защита памяти
Защита памяти
— важное условие для нормальной работы многоабонентских вычислительных систем (систем коллективного пользования). Защита памяти ограничивает диапазон адресов, к которым разрешается обращаться программе. Защиту памяти для программы, занимающей непрерывный блок ячеек памяти, можно реализовать при помощи так называемых граничных
регистров, где указываются старший и младший адреса этого блока памяти. При выполнении программы все адреса обращения к памяти контролируются, чтобы убедиться в том, что они находятся в промежутке между адресами, указанными в граничных регистрах. Защиту памяти можно реализовать также при помощи ключей защиты памяти,
относящихся к определенным областям основной памяти; программе разрешается обращение к ячейкам памяти только тех областей, ключи которых совпадают с ключом данной программы.
2.2.7 Таймеры и часы
Интервальный таймер
— эффективный способ предотвращения /монополизации процессора одним из пользователей в многоабонентских системах. По истечении заданного интервала времени таймер генерирует сигнал прерывания для привлечения внимания процессора; по этому сигналу процессор может переключиться на обслуживание другого пользователя.
Часы истинного времени
дают возможность компьютеру следить за реальным календарным временем
с точностью до миллионных долей секунды, а при необходимости даже точнее.
2.2.8 Работа в режиме он-лайн и автономный режим (оф-лайн), периферийные процессоры
Некоторые периферийные устройства обладают возможностью работать либо в режиме он-лайн,
когда они непосредственно связаны с центральным процессором, либо в автономном режиме (оф-лайн),
когда ими управляют контроллеры, не связанные с центральной вычислительной машиной. Автономные контроллеры
привлекательны тем, что они позволяют управлять периферийными устройствами, не загружая при этом непосредственно процессор. При помощи автономных устройств часто выполняются такие операции, как ввод данных с перфокарт на магнитную ленту, вывод данных с ленты на карты и с ленты на печать.
В 1959 г. фирма IBM анонсировала свою «малую» вычислительную машину 1401 (которая затем стала наиболее популярной вычислительной машиной своего времени). Модель 1401 была функционально законченной вычислительной системой, предусматривающей работу с обширным набором традиционных внешних устройств. Интересно отметить, что одним из наиболее известных применений модели 1401 явилось автономное выполнение операций ввода-вывода для более крупных машин. Компьютер, работающий в таком режиме, называется процессором ввода-вывода,
или автономным компьютером-сателлитом.
2.2.9 Каналы ввода-вывода
В первых компьютерах с ростом требуемых объемов вычислений, особенно в условиях обработки экономических данных, узким местом, как правило, оказывался ввод-вывод. Во время выполнения операций ввода-вывода процессоры были заняты управлением устройствами ввода-вывода. В некоторых машинах в каждый конкретный момент времени могла выполняться всего лишь одна операция ввода-вывода. Важным шагом для решения этой проблемы явилась разработка каналов ввода-вывода.
"Канал ввода-вывода — это специализированный процессор, предназначенный для управления вводом-выводом независимо от основного процессора вычислительной машины. Канал имеет возможность прямого доступа к основной памяти для записи или выборки информации.
В первых машинах взаимодействие между процессорами и каналами осуществлялось при помощи процессорных команд типа
· условный переход (если канал занят выполнением операции);
· ожидание (пока не закончится выполнение команды канала);
· запись (содержимого управляющих регистров канала в основную память для последующего опроса процессором).
В современных машинах с управлением по прерываниям процессор выполняет команду «начать ввод-вывод» (SIO), чтобы инициировать передачу данных ввода-вывода по каналу; после окончания операции ввода-вывода канал выдает сигнал прерывания
по завершению операции ввода-вывода, уведомляющий процессор об этом событии.
Истинное значение каналов состоит в том, что они позволяют значительно увеличить параллелизм работы аппаратуры компьютера и освобождают процессор от подавляющей части нагрузки, связанной с управлением вводом-выводом.
Для высокоскоростного обмена данными между внешними устройствами и основной памятью используется селекторный канал.
Селекторные каналы имеют только по одному подканалу
и могут обслуживать в каждый момент времени только одно устройство.
Мультиплексные каналы
имеют много подканалов; они могут работать сразу с многими потоками данных в режиме чередования. Байт-мультиплексный канал
обеспечивает режим чередования байтов при одновременном обслуживании ряда таких медленных внешних устройств, как терминалы, перфокарточные устройства ввода-вывода, принтеры, а также низкоскоростные линии передачи данных. Блок-мультиплексный канал
при обменах в режиме чередования блоков может обслуживать несколько таких высокоскоростных устройств, как лазерные принтеры и дисковые накопители.
2.2.10 Захват цикла
Узкое место, где может возникнуть конфликтная ситуация между каналами и процессором,— это доступ к основной памяти. Поскольку в каждый конкретный момент времени может осуществляться только одна операция обращения (к некоторому модулю основной памяти) и поскольку каналам и процессору может одновременно потребоваться обращение к основной памяти, в обычном случае приоритет здесь предоставляется каналам. Это называется захватом цикла памяти; канал буквально захватывает, или «крадет» циклы обращения к памяти у процессора. Каналам требуется лишь небольшой процент общего числа циклов памяти, а предоставление им приоритета в этом смысле позволяет обеспечить лучшее использование устройств ввода-вывода. Подобный подход принят и в современных операционных системах; планировщики, входящие в состав операционной системы, как правило, отдают приоритет программам с большим объемом ввода-вывода по отношению к программам с большим объемом вычислений.
2.2.11 Относительная адресация
Когда потребность в увеличении объемов основной памяти стала очевидной, архитектуры компьютеров были модифицированы для работы с очень большим диапазоном адресов. Машина, рассчитанная на работу с памятью емкостью 16 Мбайт (1 Мбайт — это 1 048 576 байт), должна иметь 24-разрядные адреса. Включение столь длинных адресов в формат каждой команды даже для машины с одноадресными командами стоило бы очень дорого, не говоря уже о машинах с многоадресными командами. Поэтому для обеспечения работы с очень большими адресными пространствами в машинах начали применять адресацию типа база + смещение,
или относительную адресацию,
при которой все адреса программы суммируются с содержимым базового регистра.
Подобное решение имеет то дополнительное преимущество, что программы становятся перемещаемыми,
или позиционно-независимыми;
это свойство программ имеет особенно важное значение для многоабонентских систем, в которых одну и ту же программу может оказаться необходимым размещать в различных местах основной памяти при каждой загрузке.
2.2.12 Режим задачи, режим супервизора, привилегированные команды
В вычислительных машинах, как правило, предусматривается несколько различных режимов работы.
Динамический выбор режима позволяет лучше организовать защиту программ и данных. В обычном случае, когда машина находится в конкретном режиме, работающая программа может выполнять только некоторое подмножество команд. В частности, если говорить о программах пользователя, то подмножество команд, которые пользователь может употреблять в режиме задачи, не позволяет, например, непосредственно производить операции ввода-вывода; если программе пользователя разрешить выполнение любых операций ввода-вывода, она могла бы вывести главный список паролей системы, распечатать информацию любого другого пользователя или вообще испортить операционную систему. Операционной системе обычно присваивается статус самого полномочного пользователя
и работает она в режиме супервизора;
она имеет доступ ко всем командам, предусмотренным в машине. Для большинства современных вычислительных машин подобного разделения на два режима — задачи и супервизора — вполне достаточно. Однако в случае машин с высокими требованиями по защите от несанкционированного доступа желательно иметь более двух режимов. Благодаря этому можно обеспечить более высокую степень детализации защиты.
Благодаря этому можно также предоставлять доступ по принципу минимума привилегий:
.каждому конкретному пользователю следует предоставлять минимально возможный приоритет и право доступа только к тем ресурсам, , которые ему действительно необходимы для выполнения предусмотренных задач.
Интересно отметить, что в процессе развития компьютерных архитектур выявилась тенденция к увеличению количества привилегированных команд,
т. е. команд, которые не могут выполняться в режиме задачи. Это служит свидетельством определенной тенденции к реализации большего числа функций операционных систем аппаратными средствами. Некоторые микропроцессоры уже имеют целые операционные системы, реализованные микропрограммно; во многих случаях значительная часть функций операционной системы реализуется в аппаратуре.
2.2.13 Виртуальная память
Системы виртуальной памяти дают возможность указывать в программах адреса, которым не обязательно соответствуют физические адреса основной памяти. Виртуальные адреса, выдаваемые работающими программами, при помощи аппаратных средств динамически (т. е. во время выполнения программы) преобразуются в адреса команд и данных, хранящихся в основной памяти. Системы виртуальной памяти позволяют программам работать с адресными пространствами гораздо большего размера, чем адресное пространство основной памяти. Они дают пользователям возможность создавать программы, независимые (большей частью) от ограничений основной памяти, и позволяют обеспечить работу многоабонентских t систем с общими ресурсами.
В системах виртуальной памяти применяются такие методы, как страничная организация
(предусматривающая обмен между основной и внешней памятью блоками данных фиксированного размера) и сегментация
(которая предусматривает разделение программ и данных на логические компоненты, называемые сегментами, что упрощает управление доступом и коллективное использование). Эти методы иногда реализуются порознь, а иногда в комбинации. Системы виртуальной памяти рассматриваются в гл. 8 и 9.
2.2.14 Мультипроцессорная обработка
В мультипроцессорных
машинах несколько процессоров работают с общей основной памятью и одной операционной системой. При мультипроцессорной работе возникает опасность конфликтных ситуаций определенных типов, которых не бывает в однопроцессорных машинах. Здесь необходимо обеспечить координированный упорядоченный
доступ к каждой общей ячейке памяти, с тем чтобы два процессора не могли изменять ее содержимое одновременно — и в результате, быть может, портить его. Подобная координация необходима также и в случае, когда один процессор пытается изменить содержимое ячейки, которую хочет прочитать другой процессор. Более подробно эти проблемы обсуждаются в гл. И. В гл.21 при описании операционной системы MVS, выбранной в качестве одного из примеров для иллюстрации, объясняется, каким образом реализуется мультипроцессорный режим в крупных машинах фирмы IBM. Упорядочение доступа необходимо также и для однопроцессорных машин. Подробно эта проблема рассматривается в гл. 3, 4 и 5.
2.2.15 Прямой доступ к памяти
Одним из способов достижения высокой производительности вычислительных машин является минимизация количества прерываний, происходящих в процессе выполнения программы. Разработанный для этого способ прямого доступа к памяти
(ПДП) требует лишь одного прерывания на каждый блок символов, передаваемых во время операции ввода-вывода. Благодаря этому обмен данными производится значительно быстрее, чем в случае, когда процессор прерывается при передаче каждого символа.
После начала операции ввода-вывода символы передаются в основную память по принципу захвата цикла — канал захватывает шину связи процессора с основной памятью на короткое время передачи одного символа, после чего процессор продолжает работу.
Когда внешнее устройство оказывается готовым к передаче очередного символа блока, оно «прерывает» процессор. Однако в случае ПДП состояние процессора запоминать не требуется, поскольку передача одного символа означает для процессора скорее задержку, или приостановку, чем обычное прерывание. Символ передается в основную память под управлением специальных аппаратных средств, а после завершения передачи процессор возобновляет работу.
ПДП—это способ повышения производительности, особенно необходимый для систем, в которых выполняются очень большие объемы операций ввода-вывода. Аппаратные средства, обеспечивающие захват циклов памяти и управление устройствами ввода-вывода в режиме ПДП, называются каналом прямого доступа к памяти.
2.2.16 Конвейеризация
Конвейеризация
— это аппаратный способ, применяемый в высокопроизводительных вычислительных машинах с целью использования определенных типов параллелизма для повышения эффективности обработки команд. Упрощенно структуру конвейерного процессора можно представить очень похожей на технологическую линию производственного предприятия; на конвейере процессора на различных стадиях выполнения одновременно могут находиться
несколько команд. Такое совмещение требует несколько большего объема аппаратуры, однако позволяет существенно сократить общее время выполнения последовательности команд.
2.2.17 Иерархия памяти
Современные вычислительные машины содержат несколько видов памяти, в том числе основную (первичную, оперативную), внешнюю (вторичную, массовую) и кэш-память. В основной памяти должны размещаться команды и данные, к которым будет обращаться работающая программа. Внешняя память — это магнитные ленты, диски, карты и другие носители, предназначенные для хранения информации, которая со временем будет записана в основную память. Кэш-память — это буферная память очень высокого быстродействия, предназначенная для повышения скорости выполнения работающих программ; для программ пользователя эта память, как правило, «прозрачна». В вычислительных машинах, оснащенных кэш-памятью, текущая часть программы помещается в кэшпамять, что позволяет выполнять ее гораздо быстрее, чем если бы она находилась в основной памяти. Все эти виды памяти создают единую иерархию памяти;
переход по уровням этой иерархии от кэш-памяти к основной и затем к внешней памяти сопровождается уменьшением стоимости и скорости и увеличением емкости памяти. Память, как правило, разделяется на байты (символы) или слова (состоящие из постоянного количества байтов). Каждая ячейка памяти имеет свой адрес; множество адресов, доступных программе, называется адресным пространством.
2.3 Программное обеспечение
Программное обеспечение
— это программы, которые содержат команды и данные и определяют для аппаратных средств алгоритмы решения задач. Существует очень много различных языков программирования.
2.3.1 Программирование на машинном языке
Машинный язык
— это язык программирования, непосредственно воспринимаемый компьютером. Каждая команда машинного языка интерпретируется аппаратурой, выполняющей указанные функции. Команды машинного языка в принципе являются довольно примитивными. Только соответствующее объединение этих команд в программы на машинном языке дает возможность описывать достаточно серьезные алгоритмы. Наборы команд машинного языка современных компьютеров зачастую включают некоторые очень эффективные возможности (см, например, описание миникомпьютеров VAX в гл. 19).
Говорят, что машинный язык является машинно-зависимым:
программа, написанная на машинном языке компьютера одного типа, как правило, не может выполняться на компьютере другого типа, если его машинный язык не идентичен машинному языку первого компьютера (или не является расширением по отношению к этому языку). Еще одним признаком машинной, или аппаратной, зависимости является характер самих команд: в командах машинного языка указываются наименования конкретных регистров компьютера и предусматривается обработка данных в той физической форме, в которой они существуют в этом компьютере. Большинство первых компьютеров программировались непосредственно на машинном языке, а в настоящее время на машинном языке пишется лишь очень небольшое число программ.
2.3.2 Ассемблеры и макропроцессоры
Программирование на машинном языке требует очень много времени и чревато ошибками. Поэтому были разработаны языки ассемблерного типа,
позволяющие повысить скорость процесса программирования и уменьшить количество ошибок кодирования. Вместо чисел, используемых при написании программ на машинных языках, в языках ассемблерного типа применяются содержательные мнемонические сокращения и слова естественного языка. Однако компьютеры не могут непосредственно воспринять программу на языке ассемблера, поэтому ее необходимо вначале перевести на машинный язык. Такой перевод осуществляется при помощи программы-транслятора, называемой ассемблером.
Языки ассемблерного типа также являются машинно-зависимыми. Их команды прямо и однозначно соответствуют командам программы на машинном языке. Чтобы ускорить процесс кодирования программы на языке ассемблера, были разработаны и включены в ассемблеры так называемые макропроцессоры.
Программист пишет макрокоманду
как указание необходимости выполнить действие, описываемое несколькими командами на языке ассемблера. Когда макропроцессор во время трансляции программы читает макрокоманду, он производит макрорасширение
— т. е. генерирует ряд команд языка ассемблера, соответствующих данной макрокоманде, Таким образом, процесс программирования значительно ускоряется, поскольку программисту приходится писать меньшее число команд для определения того же самого алгоритма.
2.3.3 Компиляторы
Тенденция к повышению вычислительной мощности команд привела к разработке некоторых очень эффективных макропроцессоров и макроязыков, упрощающих программирование на языке ассемблера. Однако развитие ассемблеров путем введения макропроцессоров не решает проблемы машинной зависимости. В связи с этим были разработаны языки высокого уровня.
Языки высокого уровня открывают возможность машинно-независимого
программирования. Большинству пользователей компьютер нужен только как средство реализации прикладных систем. Языки высокого уровня позволяют пользователям заниматься преимущественно задачами, специфичными для их конкретных прикладных областей, не вникая в особенности применяемых ими машин. Благодаря этому существенно повышается скорость процесса программирования, обеспечивается обмен программами между машинами различных типов, и у людей появляется возможность разрабатывать эффективные прикладные системы, не затрачивая времени и сил на полное изучение внутренней структуры машины.
Перевод с языков высокого уровня на машинный язык осуществляется при помощи программ, называемых компиляторами.
Компиляторы и ассемблеры имеют общее название «.трансляторы».
Написанная пользователем программа, которая в процессе трансляции поступает на вход транслятора, называется исходной программой;
программа на машинном языке, генерируемая транслятором, называется объектной программой,
или выходной (целевой) программой.
2.3.4 Система управления вводом-выводом (IOCS)
Подробные канальные программы, необходимые для управления вводом-выводом, и различные подпрограммы для координации работы каналов и процессоров являются достаточно сложными. Создание супервизорной программы, учитывающей все сложности выполнения операций ввода-вывода, освобождает прикладного программиста от необходимости самому писать подобные программы. Такая супервизорная программа носит название системы управления вводом-выводом (IOCS).
В 50-х годах пользователи обычно включали исходный код IOCS в свои программы на языке ассемблера. Пакет IOCS, уже написанный и отлаженный, фактически ассемблировался каждый раз заново как часть каждой индивидуальной программы, что приводило к значительному увеличению времени трансляции. Поэтому на многих машинах, как правило, использовались готовые, заранее ассемблированные программы IOCS.
Программист, работающий на языке ассемблера, писал операторы со ссылками на места расположения ключевых программ в готовом коде IOCS.
Еще одна проблема использования концепции IOCS была связана с тем, что полный пакет программ IOCS зачастую занимал значительную долю основной памяти, оставляя мало места для кода прикладных программ пользователя. Поэтому некоторые пользователи занимали в памяти место не нужных им модулей пакета IOCS своими программами. Другие пользователи разрабатывали свои собственные, более компактные пакеты. Однако в конце концов пользователи поняли, что самое рациональное — это предоставить системе IOCS возможность выполнять все функции по управлению вводом-выводом, и были просто вынуждены увеличивать объемы (дорогостоящей) основной памяти своих вычислительных машин. Такой подход стал по сути стандартным — и операционные системы начали включать все больше и больше машинно-ориентированных программ, так что разработчики прикладных систем смогли сконцентрировать свои усилия на создании программ прикладного характера. Это привело к тому, что операционным системам потребовались большие емкости основной памяти. К счастью, стоимость устройств основной памяти постоянно снижается.
2.3.5 Спулинг
При спулинге
(вводе-выводе с буферизацией) посредником между работающей программой и низкоскоростным устройством, осуществляющим ввод-вывод данных для этой программы, становится высокоскоростное устройство, например дисковый накопитель. Вместо вывода строк данных непосредственно, скажем, на построчно печатающее устройство программа записывает их на диск. Благодаря этому текущая программа может быстрее завершиться, с тем чтобы другие программы могли быстрее начать работать. А записанные на диск строки данных можно, распечатать позже, когда освободится принтер. Для этой процедуры название «спулинг» весьма подходит, поскольку она напоминает намотку нитки на катушку, с тем чтобы ее можно было при необходимости размотать.
2.3.6 Процедурно-ориентированные и проблемно-ориентированные языки
Языки высокого уровня бывают либо процедурно-ориентированными,
либо проблемно-ориентированными.
Процедурно-ориентированные языки высокого уровня — это универсальные языки программирования, которые можно использовать для решения самых разнообразных задач. Проблемно-ориентированные языки предназначаются специально для решения задач конкретных типов. Такие языки, как Паскаль, Кобол, Фортран, Бейсик и ПЛ/1 обычно считаются процедурно-ориентированными, а такие языки, как GPSS (язык моделирования) и SPSS (язык для выполнения статистических вычислений),— проблемно-ориентированными. 1)
2.3.7 Быстрые компиляторы без оптимизации и оптимизирующие компиляторы
Когда программы разрабатываются и отлаживаются, компиляции производятся часто, а выполняются программы обычно недолго — пока не обнаружится очередная ошибка. В этих условиях вполне приемлемы быстрые компиляторы без оптимизации.
Они позволяют быстро получить объектную программу, однако ее код может оказаться совершенно неэффективным с точки зрения как занимаемой памяти, так и скорости выполнения. После того как программа отлажена и готова для производственной эксплуатации, при помощи оптимизирующего компилятора
для нее генерируется эффективный машинный код. Оптимизирующий компилятор работает гораздо медленнее, однако обеспечивает получение объектного кода очень высокого качества.
В 70-х годах господствовало мнение о том, что хороший программист, работающий на языке ассемблера, может создать гораздо лучший код программы, чем оптимизирующий компилятор, В настоящее время оптимизирующие компиляторы настолько эффективны, что генерируемый ими код по качеству не уступает или даже превосходит код, созданный высококвалифицированным программистом на языке ассемблера. Благодаря этому программы, которые должны быть исключительно эффективными (например, операционные системы), больше не приходится писать на языке ассемблера. Сегодня крупные операционные системы в большинстве случаев пишутся на языках высокого уровня и при помощи оптимизирующих компиляторов очень высокого качества транслируются в эффективный машинный код.
2.3.8 Интерпретаторы
Существует один интересный и распространенный вид трансляторов, интерпретаторы,
которые не генерируют объектную программу, а фактически обеспечивают непосредственное выполнение исходной программы. Интерпретаторы особенно распространены в системах проектирования программ, где программы идут, как правило, лишь небольшое время до момента обнаружения очередной ошибки. Интерпретаторы распространены также в сфере персональных компьютеров. Они свободны от накладных затрат, свойственных ассемблированию или компиляции. Однако выполнение программы в режиме интерпретации идет медленно по сравнению с компилированным кодом, поскольку интерпретаторам надо транслировать каждую команду при каждом ее выполнении.
2.3.9 Абсолютные и перемещающие загрузчики
Программы для выполнения должны размещаться в основной памяти. Распределение команд и элементов данных по конкретным ячейкам основной памяти является исключительно важной задачей. Решение этой задачи иногда осуществляет сам пользователь, иногда транслятор, иногда системная программа, называемая загрузчиком,
а иногда — операционная система. Сопоставление команд и элементов данных с конкретными ячейками памяти называется привязкой к памяти.
При программировании на машинном языке привязка к памяти производится в момент кодирования. Уже давно наблюдается тенденция откладывать привязку программы к памяти на как можно более поздний срок, и в современных системах виртуальной памяти привязка осуществляется динамически в процессе выполнения программы. Отсрочка привязки программы к памяти обеспечивает увеличение гибкости как для пользователя, так и для системы, однако это связано с существенным повышением сложности трансляторов, загрузчиков, аппаратных средств и операционных систем.
Загрузчик — это системная программа, которая размещает команды и данные программы в ячейках основной памяти. Абсолютный загрузчик
размещает эти элементы именно в те ячейки, адреса которых указаны в программе на машинном языке. Перемещающий загрузчик
может загружать программу в различные места основной памяти в зависимости, например, от наличия свободного участка основной памяти в момент загрузки (называемое временем загрузки).
2.3.10 Связывающие загрузчики и редакторы связей
В первых вычислительных машинах программист писал на машинном языке программу, которая содержала все команды, необходимые для решения конкретной задачи. Даже сложные и в определенном смысле опасные процедуры управления вводом-выводом в каждой программе на машинном языке приходилось кодировать вручную.
В настоящее время программы пользователя зачастую содержат лишь незначительную часть команд и данных, необходимых для решения поставленной задачи. В составе системного программного обеспечения поставляются большие библиотеки подпрограмм,
так что программист, которому необходимо выполнять определенные стандартные операции, может воспользоваться для этого готовыми подпрограммами. В частности, операции ввода-вывода обычно выполняются подпрограммами, находящимися вне программы пользователя. Поэтому программу на машинном языке, полученную в результате трансляции, приходится, как правило, комбинировать с другими программами на машинном языке, чтобы сформировать необходимый выполняемый модуль. Эту процедуру объединения программ
выполняют связывающие загрузчики
и редакторы связей
до начала выполнения программы.
Связывающий загрузчик во время загрузки объединяет необходимые программы и загружает их непосредственно в основную память. Редактор связей также осуществляет подобное объединение программ, однако он создает загрузочный модуль,
который записывается во внешнюю память для будущего использования. Редактор связей играет особенно важную роль для производственных систем; когда программу необходимо выполнять, ее загрузочный модуль, сформированный при помощи редактора связей, может быть загружен немедленно — без накладных затрат времени (часто весьма больших) на повторное объединение отдельных частей программы.
2.4 Микропрограммы
Принято считать, что автором концепции микропрограммирования является профессор Морис Уилкс. В своей статье в 1951 г. (Wi 51) он предложил принципы, которые легли в основу современных методов микропрограммирования. Однако начало реального внедрения микропрограммирования связано с появлением System/360 в середине 60-х годов. В течение 60-х годов изготовители компьютеров применяли микропрограммирование для реализации наборов команд машинного языка (Ни 70).
В конце 60-х — начале 70-х годов появилось динамическое микропрограммирование,
предусматривающее возможность легкой загрузки новых микропрограммных модулей в управляющую память, служащу
Микропрограммирование
вводит дополнительный уровень средств программирования, нижележащий по отношению к машинному языку компьютера, и тем самым оно позволяет определять конкретные команды машинного языка. Подобные возможности являются неотъемлемой частью архитектуры современных компьютеров и имеют громадное значение с точки зрения обеспечения высоких скоростных характеристик и защиты операционных систем.
Микропрограммы размещаются в специальной управляющей памяти очень высокого быстродействия. Они состоят из индивидуальных микрокоманд, которые гораздо более элементарны по своей природе и более рассредоточены по функциям, чем обычные команды машинного языка. В компьютерах, где набор команд машинного языка реализуется при помощи микропрограммирования, каждой команде машинного языка соответствует целая и, .быть может, большая микропрограмма,/Тем самым сразу же становится очевидным, что микропрограммирование окажется эффективным только в том случае, если управляющая память будет обладать гораздо большим быстродействием; чем основная.
2.4.1 Горизонтальный и вертикальный микрокод
Команды микрокода можно разделить на горизонтальные
и вертикальные.
Выполнение вертикальных микрокоманд очень похоже на выполнение обычных команд машинного языка. Типичная вертикальная микрокоманда задает пересылку одного или нескольких элементов данных между регистрами.
Горизонтальный микрокод действует совсем по-другому. Каждая его команда содержит гораздо большее число бит, поскольку может задавать параллельную операцию пересылки данных для многих или даже всех регистров данных устройства управления. Горизонтальные микрокоманды являются более мощными, чем вертикальные, однако может оказаться, что соответствующие микропрограммы гораздо сложнее кодировать и отлаживать.
2.4.2 Выбор функций для микропрограммной реализации
Для разработчика очень важно правильно решить, какие именно функции вычислительной машины реализовать при помощи микрокода. Микрокод предоставляет реальную возможность повысить быстродействие вычислительной машины. Реализуя часто используемые последовательности команд микропрограммно, а не обычным программным способом, разработчики добиваются существенного повышения показателей быстродействия. Читателям, которые будут знакомиться с функциями операционных систем по мере проработки настоящей книги, рекомендуется тщательно анализировать, для реализации каких из этих функций может быть эффективно использован микрокод.
2.4.3 Эмуляция
Эмуляция
— метод, позволяющий сделать одну вычислительную машину функциональным эквивалентом другой. Набор команд машинного языка эмулируемого компьютера микропрограммируется на эмулирующем компьютере
— и благодаря этому программы, представленные на машинном языке первого компьютера, могут непосредственно выполняться на втором. Фирмы-разработчики компьютеров широко применяют эмуляцию при внедрении новых машин, и пользователи, привязанные к старым компьютерам, получают, например, возможность без всяких изменений выполнять свои ранее отлаженные программы на новых машинах. Тем самым процесс перехода с машины на машину становится менее сложным и болезненным.
2.4.4 Микродиагностика
Микропрограммы значительно теснее связаны с аппаратурой, чем программы, написанные на машинном языке. Благодаря этому появляется возможность в гораздо более широких масштабах осуществлять контроль и исправление ошибок, причем выполнять эти операции с большей степенью детализации. В некоторые машины вводятся средства микродиагностики, «переплетающиеся» с командами программ на машинном языке. Это позволяет избежать многих потенциальных проблем и повысить надежность работы машины.
2.4.5 Специализированные компьютеры
Поскольку разработка, производство и организация сбыта вычислительной машины обходится дорого, фирмы-изготовители сосредотачивают свои усилия обычно на выпуске машин общего назначения. Громадные капитальные вложения, без которых невозможно создание новой машины, требуют больших объемов сбыта, поскольку только в этом случае можно будет возместить затраты и получить необходимые прибыли. Поэтому промышленные фирмы обычно стараются не изготавливать специализированных, единственных в своем роде машин; этим занимаются университеты, в которых подобные машины создаются главным образом для выполнения научных исследований.
В связи с этим пользователям компьютеров приходится решать проблему специализации своих машин применительно к собственным конкретным требованиям; такая специализация традиционно осуществляется при помощи соответствующего программного обеспечения. Аппаратура машины представляет собой некую универсальную среду для выполнения системных программ, при помощи которых машина приспосабливается к конкретным требованиям пользователей.
В некоторых машинах подобную специализацию пользователи могут осуществлять при помощи микрокода. При этом они могут либо применить микрокод, поставляемый фирмой-изготовителем, либо написать собственный микрокод; сейчас широко распространены оба этих подхода.
2.4.6 Микропрограммная поддержка
Фирмы-изготовители зачастую по отдельному заказу поставляют факультативные микрокодовые средства, обеспечивающие повышение производительности вычислительных машин. Фирме IBM удалось довольно успешно сделать это для своих компьютеров семейства System/370 в рамках операционной системы VM (см. гл. 22). Как будет показано при описании этой операционной системы в гл. 22, она реализует концепцию многих виртуальных машин благодаря эффективному использованию механизма прерываний. Для этого ряд наиболее часто используемых программ обработки прерываний реализуется микрокодом; такая микропрограммная поддержка
позволяет достигнуть существенного повышения скоростных характеристик.
2.4.7 Микропрограммирование и операционные системы
К числу наиболее часто выполняемых последовательностей команд в большинстве вычислительных машин относятся определенные части операционной системы. Например, в системе с диалоговой обработкой транзакций имеется механизм диспетчирования, обеспечивающий выбор очередной единицы работы, которую должен будет выполнять процессор; поскольку подобный механизм диспетчирования может действовать сотни раз в секунду, он должен работать очень эффективно, и одним из способов сделать его более высокоскоростным и эффективным является именно микрокодовая реализация.
К числу функций, чаще всего реализуемых при помощи микрокода, относятся следующие:
· обработка прерываний;
· управление различными типами структур данных;
· примитивы синхронизации, координирующие доступ к общим данным и другим ресурсам;
· операции обработки частей слова, позволяющие эффективно выполнять манипуляции с битами;
· переключения контекста, т. е. быстрые переключения процессора с программы на программу в многоабонентской системе;
· последовательности вызова процедур и возврата.
Реализация функций операционных систем при помощи микрокода позволяет повысить эффективность и скоростные характеристики, снизить затраты на разработку программ и обеспечить более надежную защиту систем (см. гл. 17).
Читателям, желающим более подробно познакомиться с применением микропрограммирования в операционных системах, рекомендуется обратиться к работам (Br77), (Bu81) и (So75).
2.4.8 Пример микропрограммирования
В настоящем разделе рассматривается небольшая гипотетическая микропрограммируемая вычислительная машина. Наша цель заключается в том, чтобы попытаться передать определенные нюансы микропрограммирования и, в частности, показать, каким образом оно может использоваться для реализации набора команд машинного языка компьютера. В основу настоящего раздела положен пример, который представили Роше и Адаме в своей отличной статье для изучающих микропрограммирование (Ra80).
Простой гипотетический небольшой компьютер ITSIAC имеет набор команд машинного языка, показанный на рис. 2.1.
Компьютер ITSIAC имеет накапливающий регистр-аккумулятор АКК, который участвует в выполнении всех арифметических операций. Каждая команда машинного языка содержит два поля
Команда | Описание |
ADD (Сложить) | АКК ( АКК + (А) |
SUB (Вычесть) | АКК ( АКК - (А) |
LOAD (Загрузить) | АКК ( (А) |
STORE (Записать) | (А) ( АКК |
BRANCH (Переход) | Переход на А |
COND BRANCH (Условный переход) | Если АКК=0, то переход на А |
по 8 бит — код операции (КОП) и адрес памяти А. В состав процессора входит арифметико-логическое устройство (АЛУ) для выполнения некоторых арифметических действий. Регистры компьютера ITSIAC и их функции показаны на рис. 2.2.
Регистр | Функция |
АКК | Аккумулятор. Этот накапливающий регистр участвует в выполнении всех арифметических операций. При выполнении каждой арифметической операции один из операндов должен находиться в аккумуляторе, а другой — в основной памяти. |
РАКОП | Регистр адреса команды основной памяти. Этот регистр указывает ячейку основной памяти, где находится следующая команда машинного языка, подлежащая выполнению. |
РАП | Регистр адреса памяти. Этот регистр участвует во всех обращениях к основной памяти. Он содержит адрес ячейки памяти, к которой производится обращение для чтения или записи. |
РДП | Регистр данных памяти. Этот регистр также участвует во всех обращениях к основной памяти. Он содержит данные, которые записываются, или принимает данные, которые считываются из ячейки основной памяти, указанной в РАП. |
РР | Рабочий регистр. Этот регистр используется для выделения поля адреса (8 бит справа) машинной команды, хранящейся в регистре РДП, чтобы его можно было поместить в РАП (в машине прямая пересылка данных из РДП в РАП невозможна). |
РАКУП | Регистр адреса команд управляющей памяти. Этот регистр указывает адрес следующей микрокоманды (в управляющей памяти), подлежащей выполнению. |
РМК | Регистр микрокоманды. Этот регистр содержит текущую выполняемую микрокоманду. |
Машина ITSIAC работает следующим образом. Прежде всего в управляющую память загружается микропрограмма. Команда машинного языка декодируется, и управление передается соответствующей подпрограмме микропрограммы для ее интерпретации. Каждая команда микропрограммы занимает одну ячейку управляющей памяти. Регистр адреса команды управляющей памяти РАКУП указывает на следующую выполняемую микрокоманду. Эта микрокоманда выбирается из управляющей памяти и помещается в регистр микрокоманд РМК.
Затем содержимое регистра РАКУП увеличивается на 1 (теперь он указывает на следующую выполняемую микрокоманду), и весь процесс повторяется. Микропрограмма принимает из регистра адреса команды основной памяти РАКОП адрес ячейки, где хранится следующая команда машинного языка, подлежащая интерпретации. После интерпретации очередной команды машинного языка микропрограмма меняет содержимое регистра РАКОП — теперь он указывает на ячейку основной памяти, где хранится следующая выполняемая команда машинного языка.
Декодированные микрокоманды непосредственно соответствуют тем элементарным операциям, которые могут выполняться аппаратными средствами; они гораздо проще, чем команды машинного я зыка
Межрегистровые передачи (РЕГ — это АКК, РАКОП или РР): |
РДП ¬ РЕГ РЕГ ¬ РДП РАП ¬ РДП |
Операции с основной памятью: |
READ (чтение ячейки основной памяти в РДП) WRITE (запись РДП в ячейку основной памяти) |
Операции управления последовательностью: |
РАКУП ¬ РАКУП+1 (обычный случай) РАКУП ¬ декодированный РДП РАКУП ¬ константа SKIP (перескок, т. е. прибавление 2 к РАКУП, если АКК = 0; в противном случае прибавляется 1) |
Операции с участием аккумулятора: |
АКК ¬ АКК + РЕГ АКК ¬ АКК – РЕГ АКК ¬ РЕГ РЕГ ¬ АКК АКК ¬ РЕГ + 1 |
Из перечисленных микроопераций составляются последовательности, которые реализуют команды машинного языка нашей простой машины. Микропрограмма, выполняющая команды машинного языка, показана на рис. 2.4. Выполнение микропрограммы начинается с ячейки 00, с подпрограммы, которая выбирает следующую выполняемую команду машинного языка.
Рассматриваемая машина с микропрограммным управлением работает следующим образом. Вначале регистр РАКУП устанавливается в нуль и тем самым указывает на микрокод подпрограммы, осуществляющей выборку команды машинного языка. Следующая команда машинного языка для выполнения выбирается из ячейки, адрес которой находится в РАКОП. Загрузка этой команды из основной
Выбор команды: |
(00) РАП ¬ РАКОП (01) READ (02) РАКУП ¬ декодированный РДП |
ADD: |
(10) АКК ¬ РАКОП 4- 1 (11) РАКОП ¬ АКК (12) РР ¬ РДП (13) РАП ¬ РР (14) READ (15) РР ¬ РДП (16) АКК ¬ АКК + РР (17) РАКУП ¬ 0 |
SUB: |
(20) АКК ¬ РАКОП + 1 (21) РАКОП ¬ АКК (22) РР ¬ РДП (23) РАП ¬ РР (24) READ (25) РР ¬ РДП (26) АКК ¬ АКК - РР (27) РАКУП ¬ 0 |
LOAD: |
(30) АКК ¬ РАКОП + 1 (31) РАКОП ¬ АКК (32) РР ¬ РДП (33) РАП ¬ РР (34) READ (35) РР ¬ РДП (36) АКК ¬ РР (37) РАКУП ¬ 0 |
STORE: |
(40) АКК ¬ РАКОП + 1 (41) РАКОП ¬ АКК (42) РР ¬ РДП (43) РАП ¬ РР (44) РДП ¬ АКК (45) WRITE (46) РАКУП ¬ 0 |
BRANCH: |
(50) РАКОП ¬ РДП (51) РАКУП ¬ 0 |
COND BRANCH: |
(60) SKIP (61) РАКУП ¬ 0 (62) РАКОП ¬ РДП (63) РАКУП ¬ 0 |
памяти в регистр РДП осуществляется по команде чтения READ. Команда
РАКУП ( декодированный РДП
устанавливает в РАКУП адрес соответствующей микрокодированной подпрограммы управляющей памяти для интерпретации данной команды машинного языка; при этом просто анализируется код операции и осуществляется как бы табличный поиск с использованием кода операции в качестве ключа поиска. Следующий микрокомандный цикл вызывает передачу управления на микрокод подпрограммы.
Если, например, интерпретируемая машинная команда имеет вид
ADD 50
то нужно содержимое ячейки 50 основной памяти сложить с содержимым аккумулятора. Рассмотрим микрокод, который выполняет эту операцию.
(10) АКК ¬ РАКОП + 1
(11) РАКОП ¬ АКК
(12) РР ¬ РДП
(13) РАП ¬ РР
(14) READ
(15) РР ¬ РДП
(16) АКК ¬ АКК + РР
(17) РАКУП ¬ 0
Микрокоманды (10) и (11) обеспечивают установку в РАКОП адреса следующей по порядку ячейки основной памяти. Микрокоманды (12) и (13) выделяют адрес основной памяти команды, находящейся в РДП, и передают его в РАП. (Две микрокоманды с использованием РР для этого необходимы опять-таки потому, что машина не позволяет производить непосредственную передачу содержимого РДП в РАП.) После выполнения микрокоманды (13) в РАП оказывается адрес ячейки 50. Команда чтения READ (14) вызывает загрузку содержимого ячейки, указанной в РАП, в регистр РДП. По команде (15) эти данные заносятся в РР, а по команде (16) — суммируются с содержимым аккумулятора. Команда (17) устанавливает в РАКУП нулевой адрес подпрограммы выборки микрокоманд, так что следующий микрокомандный цикл начнет процесс выборки следующей команды машинного языка для выполнения.
Заключение
Аппаратура — это устройства вычислительной машины. Программное обеспечение составляют команды, интерпретируемые аппаратурой, а микропрограммы включают микрокодированные команды, размещаемые в высокоскоростной управляющей памяти.
Расслоение памяти обеспечивает возможность одновременного доступа к последовательным ячейкам основной памяти, поскольку ячейки с соседними адресами размещаются к различных модулях памяти. Механизм прерываний играет важную роль для режимов работы, при которых много операций могут выполняться асинхронно, но в определенных случаях требуют синхронизации. Буферизация с несколькими буферами позволяет эффективно совмещать операции ввода-вывода с вычислениями.
Спулинг (ввод-вывод с буферизацией) позволяет отделить работающую программу от низкоскоростных устройств ввода-вывода, таких, как принтеры и устройства ввода данных с перфокарт. При спулинге ввод-вывод данных для программы осуществляется при посредстве высокоскоростного внешнего запоминающего устройства, например накопителя на магнитных дисках, а фактическое чтение или распечатка данных производится в то время, когда устройства ввода перфокарт и принтеры свободны. Для изоляции пользователей друг от друга в многоабонентских системах необходимо предусматривать защиту памяти; защиту можно реализовывать несколькими различными способами, в том числе при помощи граничных регистров или ключей защиты.
Применение стандартного интерфейса ввода-вывода существенно упрощает подключение к машине новых внешних устройств. Внешние устройства могут работать под непосредственным управлением центрального процессора в режиме он-лайн, или автономно (оф-лайн), под управлением отдельных контроллеров, независимых от процессора. Функционально законченные вычислительные машины, которые выполняют операции ввода данных с перфокарт на магнитную ленту, вывода данных с магнитной ленты на печать и т. д. для более крупных машин, называются процессорами ввода-вывода, или компьютерами-сателлитами.
Канал — специализированная вычислительная машина для выполнения операций ввода-вывода без участия центрального процессора. Для координации взаимодействия между центральным процессором и каналом применяется, как правило, способ регулярного опроса или механизм прерываний. Наиболее известные типы каналов — это селекторные, байт-мультиплексные и блок-мультиплексные каналы.
Система управления вводом-выводом (IOCS) — это пакет программ, назначение которого заключается в том, чтобы освободить пользователя от необходимости детального управления вводом-выводом. Пакеты IOCS являются важной частью современных операционных систем.
Метод относительной адресации дает возможность работать с очень большим адресным пространством без необходимости увеличивать размер машинного слова; во время выполнения программы все адреса формируются путем прибавления смещения к содержимому базового регистра. Благодаря этому упрощается также перемещение программ по памяти.
Наличие в машине нескольких режимов работы обеспечивает защиту программ и данных. В режиме супервизора могут выполняться любые команды (включая привилегированные), а в режиме задачи — только непривилегированные. Эти режимы определяют
границу между возможностями пользователя и возможностями операционной системы. В некоторых машинах предусматриваются более двух подобных режимов работы.
Системы виртуальной памяти в обычном случае дают возможность программам работать с гораздо более широким диапазоном адресов, чем адресное пространство имеющейся основной памяти. Это позволяет освободить программиста от ограничений, связанных с емкостью основной памяти.
Метод прямого доступа к памяти исключает необходимость прерывать работу центрального процессора при передаче каждого байта блока данных во время выполнения операций ввода-вывода — в этом случае требуется только один сигнал прерывания, вырабатываемый при завершении передачи всего блока. Каждый символ записывается в основную память и читается из нее с захватом цикла памяти — здесь каналу предоставляется приоритет, поскольку центральный процессор может и подождать.
В архитектурах компьютеров высокого быстродействия применяются конвейеры, которые позволяют совмещать работу нескольких команд, в каждый конкретный момент времени находящихся на различных стадиях выполнения.
В современных вычислительных машинах реализуется иерархическая структура памяти, включающая кэш-память, основную (первичную, оперативную) память и внешнюю (вторичную, массовую) память; при переходе с уровня на уровень иерархии в указанном порядке емкости памяти увеличиваются, а стоимость в расчете на байт уменьшается.
Программное обеспечение — это программы, состоящие из команд, которые интерпретируются аппаратными средствами; команды определяют алгоритмы, обеспечивающие решение задач. Программы для компьютера можно писать на машинном языке, языке ассемблера или языках высокого уровня. Программисты редко работают непосредственно на машинных языках — программы в машинных кодах генерируются при помощи ассемблеров и компиляторов. Макропроцессоры дают возможность программистам, работающим на языке ассемблера, писать макрокоманды, которые порождают много команд на языке ассемблера. Компиляторы обеспечивают трансляцию программ, написанных на языках высокого уровня, на машинный язык. Интерпретаторы непосредственно выполняют исходные программы, не генерируя при этом объектные модули.
Процедурно-ориентированные языки являются универсальными, а проблемно-ориентированные языки специализируются для эффективного решения задач определенных классов. Компиляторы без оптимизации работают быстро, однако генерируют- относительно неэффективные коды; оптимизирующие компиляторы позволяют получать эффективные коды, но работают гораздо медленнее, чем без оптимизации.
Абсолютные загрузчики осуществляют загрузку программ в конкретные ячейки, адреса которых указываются при компиляции; перемещающие загрузчики могут размещать программы в различных свободных участках памяти. Привязка программы к памяти по абсолютным адресам осуществляется во время трансляции, а привязка перемещаемых программ — во время загрузки или даже во время выполнения.
Связывающие загрузчики объединяют отдельные блоки программы, создавая единый модуль, готовый к выполнению; этот выполняемый модуль размещается в основной памяти. Редакторы связей также осуществляют объединение программ, однако сформированный ими готовый к выполнению модуль записывается во внешнюю память для последующего использования.
Микропрограммирование — это написание программ, которые управляют элементарными операциями аппаратуры; микропрограммирование играет исключительно важную роль в современных архитектурах компьютеров и операционных системах. Динамическое микропрограммирование предусматривает возможность простой загрузки новых микропрограмм в управляющую память для непосредственного выполнения.
Команды вертикального микрокода очень похожи на команды машинного языка; типичная вертикальная микрокоманда указывает, что необходимо выполнить определенную операцию с определенными данными. Горизонтальный микрокод содержит команды с более широкими возможностями — они позволяют задавать одновременное выполнение многих операций над многими элементами данных.
Микропрограммирование зачастую применяется при эмуляции, позволяя сделать один компьютер функциональным эквивалентом другого компьютера. Эмуляция особенно необходима и полезна в тех случаях, когда пользователям приходится переводить свои программы с машины на машину.
Микропрограммирование позволяет реализовать микродиагностику, т. е. контроль ошибок с гораздо большей степенью детализации, чем это возможно для команд машинного языка.
Благодаря микропрограммированию можно специализировать компьютер применительно к требованиям конкретных пользователей. Поставщики компьютеров обычно предлагают факультативные средства микропрограммной поддержки, позволяющие повысить скоростные характеристики; реализация часто выполняемых последовательностей команд при помощи микрокода сокращает время их выполнения. Многие функции операционных систем в современных вычислительных машинах реализуются не обычными программами, а микропрограммами, и благодаря этому, как правило, обеспечивается более высокая скорость выполнения и более надежная защита.
Терминология
абсолютный загрузчик (absolute loader)
автономный режим (оф-лайн) (off-line)
адресное пространство (диапазон адресов) (address space)
аппаратура, аппаратные средства (hardware)
ассемблер (assembler)
базовый регистр, регистр базы (base register)
байт-мультиплексныйканал (byte-multiplex or channel)
библиотекаподпрограмм (subroutine library)
блок-мультиплексныйканал (block-multiplexor channel)
быстрыйкомпиляторбезоптимизации (quick-and-dirty compiler)
буфер (buffer)
буферизация с переключением («триггерная» буферизация) (flip-flop buffering)
вертикальный микрокод (vertical microcode)
виртуальная память (virtual storage)
внешняя (вторичная, массовая)
память (secondary storage)
время загрузки (load time)
входной, фронтальный процессор (front end processor)
выходная, целевая программа (target program)
горизонтальный микрокод (horizontal microcode)
готовая, заранее ассемблированная IOCS (preassembled IOCS)
граничные регистры (bounds registers)
двойная буферизация (double buffering)
двухадресныекоманды (two-address instructions)
загрузочный модуль, модуль загрузки (load module)
загрузчик (loader)
захват цикла (памяти) (cycle stealing)
защитапамяти (storage protection)
иерархияпамяти (storage hierarchy)
интервальныйтаймер (interval timer)
интерпретатор (interpreter)
интерфейс ввода-вывода (I/O interface)
исходная программа (source program)
канал (channel)
канал прямого доступа к памяти (DMA channel)
ключизащитыпамяти (storage protect keys)
компиляторы (compilers)
конвейеризация (pipelining)
контроллерустройствввода-вывода (I/O device controller)
координированный (упорядоченный) доступ (sequentialization of access)
кэш-память (cache storage)
макрокоманда (macro instruction)
макропроцессор (macro processor)
макрорасширение (macro expansion)
машинно-зависимый (machine-dependent)
машинно-независимый (machine-independent)
машинныйязык (machine language)
микродиагностика (microdiagnostics)
микрокод (microcode)
микрокоманда (microinstruction)
микропрограмма (microprogram)
микропрограммирование (microprogramming)
микропрограммнаяподдержка (microcode assists)
микропрограммноеобеспечение (firmware)
мультиплексныеканалы (multiplexor channels)
мультипроцессорнаяобработка (multiprocessing)
объединениепрограмм (program combination)
объектнаяпрограмма (object program)
одноадресныекоманды (single-address instructions)
опрос (регулярный, упорядоченный) (polling)
оптимизирующий компилятор (optimizing compiler)
основная (первичная, оперативная) память (primary storage)
относительная адресация, адресация «база + смещение» (base-plus-displacement addressing)
перемещаемая (позиционно-независимая) программа (location-independent program)
перемещающий загрузчик (relocating loader)
плотность записи (recording density)
подканал (subchannel)
последовательное внешнее запоминающее устройство (sequential device)
прерывание по завершению (операции) ввода-вывода (I/O completion interrupt)
прерывания (interrupts)
привилегированныекоманды (privileged instructions)
привязка (программы к памяти) (binding)
принцип минимума привилегий (при предоставлении доступа к ресурсам и информации) (principle of least privilege)
проблемно-ориентированный (problem-oriented)
программное обеспечение (software)
простая (одиночная) буферизация (single buffering)
процедурно-ориентированный (procedure-oriented)
процессор ввода-вывода (stand-alone processor)
процессор-сателлит (satellite processor)
прямой доступ к памяти (ПДП) (Direct Memory Access, DMA)
расслоение памяти (интерливинг) (storage interleaving)
регистрперемещения (relocation register)
редакторсвязей (linkage editor)
режим задачи (пользователя) (problem state)
режим выполнения программ (execution states)
режим супервизора (supervisor state)
режим он-лайн (on-line)
связывающий загрузчик (linking loader)
сегментация (segmentation)
селекторныйканал (selector channel)
спулинг (ввод-вывод с буферизацией) (spooling)
стандартный интерфейс ввода-вывода (standard I/O interface)
степень (глубина) детализации защиты (granularity of protection)
страничная организация памяти (paging)
система управления вводом-выводом (input-output control system IOCS)
транслятор (translator)
трехадресныекоманды (three-address instruction)
управляющая память (control storage)
устройство прямого (непосредственного) доступа (direct access device)
часы истинного (реального, календарного) времени (time-of-day clock)
эмулятор (emulator)
эмуляция (emulation)
язык ассемблера, язык ассемблерного типа (assembly language)
DMA
IOCS
Упражнения
2.1
Укажите различия между аппаратурой, программным обеспечением и микропрограммами.
2.2
Объясните, в чем заключается концепция расслоения памяти.
2.3
Что такое двойная буферизация? Подробно опишите, каким образом могла бы работать схема тройной буферизации. При каких условиях могла бы быть целесообразной тройная буферизация?
2.4
Что такое спулинг? Как должна работать система входного спулинга, предназначенная для чтения перфокарт с устройства ввода?
2.5
Объясните, что такое «прямой доступ к памяти» и «захват цикла».
2.6
Опишите несколько способов реализации защиты памяти.
2.7
Опишите два различных способа организации взаимодействия между центральным процессором и каналом.
2.8
Приведите несколько причин, обусловивших появление концепции относительной адресации.
2.9
Сопоставьте принцип минимума привилегий с такими концепциями, как режим задачи, режим супервизора и привилегированные команды.
2.10
Укажите различия между селекторными, байт-мультиплексными и блок-мультиплексными каналами.
2.11
Укажите различия между машинным языком, языком ассемблера и языками высокого уровня.
2.12
Что такое макропроцессор?
2.13
Укажите различия между проблемно-ориентированными и процедурно-ориентированными языками.
2.14
При каких обстоятельствах целесообразно использовать быстрый компилятор без оптимизации? Когда следует применять оптимизирующий компилятор?
2.15
Чем интерпретаторы отличаются от ассемблеров и компиляторов? Когда более целесообразно использовать интерпретатор, чем компилятор?
2.16
Укажите сходства и различия абсолютных загрузчиков и перемещающих загрузчиков.
2.17
Что такое «привязка программы к памяти»? Почему и у пользователя и у системы появляются более гибкие возможности, если привязку программ к памяти выполнять как можно позднее?
2.18
Чем редакторы связей отличаются от связывающих загрузчиков?
2.19
Что такое микропрограммирование? Почему термин «микропрограммное обеспечение» уместен для обозначения микрокода, резидентно размещающегося в управляющей памяти?
2.20
Укажите различия между горизонтальным и вертикальным микрокодом.
2.21
Какие факторы могут повлиять на решение разработчика выбрать те или иные функции для реализации при помощи микрокода?
2.22
Что такое эмуляция? Почему микропрограммирование играет особенно важную роль при построении эмуляторов?
2.23
Объясните, каким образом может быть использовано микропрограммирование для специализации компьютера. Почему это может обеспечить высокую эффективность?
2.24
Объясните, почему понимание особенностей микропрограммирования имеет столь большое значение для разработчиков операционных систем.
Упражнения для примера микропрограммирования (п. 2.4.8)
2.25
Напишите для компьютера ITSIAC программу на машинном языке, которая будет суммировать числа, хранящиеся в ячейках с 50 по 99, и помещать результат в ячейку 100. Проследите выполнение этой программы в режиме интерпретации при помощи микропрограммы компьютера ITSIAC, приведенной в тексте.
2.26
Напишите на языке высокого уровня программу для моделирования работы компьютера ITSIAC. Для моделирования основной памяти используйте матрицу из 256 элементов. Каждое слово памяти имеет длину 16 бит. Различные регистры, в том числе АКК, РАКОП, РАП, РДП, РР, РАКУП и РМК, представьте при помощи переменных. Для реализации каждой микрооперации используйте операторы языка высокого уровня. Например, сложение содержимого рабочего регистра РР и аккумулятора АКК можно осуществить при помощи оператора на языке Паскаль
АКК := АКК + РР
Введите дополнительную команду останова HALT, обеспечивающую распечатку содержимого всех регистров и всех ячеек памяти компьютера ITSIAC, а затем завершающего сообщения «EOJ» (конец задания). На своей модели компьютера ITSIAC выполните программу, которую вы написали в упр. 2.25.
Литература
(Ва80) | Baer J. b., Computer Systems Architecture,
Rockville, Md.i Computer Science Press, 1980. |
(Be81) | Belady L. A., Parmelee R. P., Scalzi C. A., "The IBM History of Memory Management Technology", IBM J. Res.
Develop., Vol. 25, No 5, September 1981, pp. 491—503. |
(Br77) | Brown G. E., et al., "Operating System Enhancement through Firmware". SIGMICRO Newsletter,
Vol. 8, September 1977, pp. 119—133. |
(Bs81) | Bashe C. J., Buchholtz W., Hawkins G. V., Ingram J. J., Rochester N., "The Architecture of IBM's Early Computers", IBM J. Res.
Develop., Vol. 25, No. 5, September 1981, pp. 363—375. |
(Bu81) | Bucci G., Neri G., Baldassarri F., "MP80: A Microprogrammed CPU with a Microcoded Operating System Kernel", Computer,
October 1981, pp. 81—90. |
(Ca80) | Campbell- Kelley M., "Programming the EDSAC". Annals of the History of Computing,
Vol. 2, 1980, pp. 7—36. |
(Da78) | Davidson S., Shriver B. D., "An Overview of Firmware Engineering", Computer,
May 1978, pp. 21—31. |
(1182) | Iliffe J. K-, Advanced Computer Design,
Englewood Cliffs, N. J.s Prentice-Hall, 1982. |
(Ka73) | Kaplan K. R-, Winder R. O., "Cache-Based Computer Systems", Computer.
Vol. 6, No. 3, 1973, pp. 30—36. |
(Ko77) | Kogge P. M., "The Microprogramming of Pipelined Processors", Proa, Fourth Annual Symposium on Computer Architecture,
March 1977, pp. 63-69. |
(Le80) | Levy H. M., Eckhouse R. H., Jr., Computer Programming and Architecture: The VAX-ll,
Bedford, Mass.: Digital Press, Digital Equipment Corporation, 1980. |
(Lo80) | Love H. H., Jr. "The Highly Parallel Supercomputers: Definitions, Applications, and Predictions", Proc.
NCC, 1980, pp. 181—190. |
(Ma75) | Mallach E. G., "Emulator Architecture", Computer,
Vol. 8, August 1975, pp. 24—32. |
(Pa81) | Padegs A, "System/360 and Beyond", IBM J. Res. Develop.,
Vol. 25, No. 5, September 1981, pp. 377—390. |
(Ph80) | Phelps В. Е., "Early Electronic Computer Developments at IBM", Annals of the History of Computing,
Vol. 2, 1980, pp. 253—267. |
(Po81) | Pohm A. V., Smay T. A., "Computer Memory Systems", Computer,
October 1981, pp. 93—110. |
(Ra76) | Rauscher T. G., Agrawala A. K., "Developing Application-Oriented Computer Architectures on General-Purpose Microprogrammable Machines", Proc. of
1976 NCC, Montvale, N. J.: AFIPS Press, pp. 715—722. |
(Ra78) | Rauscher T. G., Agrawala A. K., "Dynamic Problem-Oriented Redefinition of Computer Architecture via Microprogramming", IEEE Trans, on Computers,
Vol. C-27, November 1978, pp. 1006—1014. |
(Ra80) | Rauscher T. G., Adams P. N., "Microprogramming: A Tutorial and Survey of Recent Developments", IEEE Trans, on Computers,
Vol. C-29, No. 1, January 1980, pp. 2—20. |
(So75) | Sockut G. H., "Firmware/Hardware Support for Operating Systems; Principles and Selected History", SIGMICRO Newsletter,
Vol. 6, December 1975, pp. 17—26. |
(St81) | Stankovic J. A., "The Types and Interactions of Vertical Migrations of Functions m a Multilevel Interpretive System", IEEE Trans, on Com.' puters,
Vol. C-30, No. 7, July 1981, pp. 505—513. |
(Tu65) | Tucker S. G., "Emulation of Large Systems", С
ACM, Vol. 8, 1965, pp. 753—761. |
(Wi51) | Wilkes M. V., The Best Way to Design on Automatic Calculating Machine,
Report of the Manchester University Computer Inaugural Conference, Electrical Engineering Department of Manchester University, Manchester, England, July, 1951, pp. 16 — 18. Reprinted in Earl E. Swartzlander, 'Jr. (ed.), Computer Design Development — Principal Papers, Rochelle Park, N.J.: Hayden Book Co., 1976, pp. 266—270. |
(Wi69) | Wilkes M. V., "The Growth of Interest in Microprogramming: A Literature Survey", Comput.
Surveys, Vol. 1, No. 3, September 1969, pp. 139— 145. |