Аппаратура, программное обеспечение и микропрограммы

Аппаратура,программное обеспечение и микропрограммы
Всесвое время, здоровье и состояние я принес в жертву желанию завершить созданиеэтих машин для вычислений. Я отклонил также ряд предложений, суливших для менябольшие личные выгоды. Однако, несмотря на мой отказ от всех этих выгод с цельюсовершенствования машины, обладающей почти интеллектуальной мощью, и после тогокак я истратил из моего собственного состояния больше денег, чем правительствоАнглии выделило на эту машину (причем только в начале работ), я не получил ниблагодарности за мои труды, ни даже тех почестей и наград, которые, какправило, достаются людям, посвятившим себя чисто научным исследованиям…
Еслибы работа, на которую я затратил так много времени и душевных сил, была толькопобедой над обычными техническими трудностями или просто курьезом, или если быбыли сомнения в целесообразности или полезности подобных машин, то можно былобы в какой-то мере понять и оправдать такое отношение; однако я позволю себеутверждать, что ни один достойный уважения мате тик никогда не рискнет публичновыразить мнение, что подобная машина, если она будет сделана, окажетсябесполезной,— и что ни один человек, известный как грамотный инженер, нерискнет объявить построение подобных машин нецелесообразным.
Ясчитаю, что в то время, когда серьезным препятствием на пути прогрессафизических наук становятся громадные объемы интеллектуального и ручного труда,необходимого для дальнейшего продвижения, а именно облегчить этот труд ипризвана аналитическая машина, применение машин как помощников в выполнениинаиболее сложных и трудоемких вычислений нельзя более полагать проблемой,недостойной внимания страны. И действительно, нет никаких причин, непозволяющих экономить труд умственный, подобно физическому, благодаряиспользованию машин.
Чарльз Бэббидж Отрывок из книги «Жизнь философа»
Элементы,из которых строятся компьютеры, становятся все более малыми, они выходят заграницы возможностей обычных микроскопов — в бесконечные пространства мирамолекул.
Кристофер Эванс
Программы— этопосредники между пользователем и машиной.
Гарлен Д. Миллс
Микропрограммирование— этореализация предположительно разумных систем путем интерпретации на неразумныхмашинах!
Р. Ф. Розин
Микропрограммированиенеэффективного алгоритма не делает его эффективным,
Закон Роше

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 048576 байт), должна иметь 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)
библиотека подпрограмм (subroutinelibrary)
блок-мультиплексный канал(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-addressinstructions)
загрузочныймодуль, модуль загрузки (load module)
загрузчик(loader)
захватцикла (памяти) (cycle stealing)
защита памяти (storageprotection)
иерархия памяти (storagehierarchy)
интервальный таймер (intervaltimer)
интерпретатор (interpreter)
интерфейсввода-вывода (I/O interface)
исходнаяпрограмма (source program)
канал(channel)
каналпрямого доступа к памяти (DMA channel)
ключи защиты памяти (storageprotect keys)
компиляторы (compilers)
конвейеризация (pipelining)
контроллер устройств ввода-вывода (I/O devicecontroller)
координированный (упорядоченный) доступ(sequentialization of access)
кэш-память (cachestorage)
макрокоманда (macroinstruction)
макропроцессор (macroprocessor)
макрорасширение (macroexpansion)
машинно-зависимый(machine-dependent)
машинно-независимый(machine-independent)
машинный язык (machinelanguage)
микродиагностика(microdiagnostics)
микрокод (microcode)
микрокоманда(microinstruction)
микропрограмма(microprogram)
микропрограммирование(microprogramming)
микропрограммная поддержка (microcodeassists)
микропрограммное обеспечение (firmware)
мультиплексные каналы (multiplexorchannels)
мультипроцессорная обработка(multiprocessing)
объединение программ (programcombination)
объектная программа (objectprogram)
одноадресные команды(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)
привилегированные команды (privilegedinstructions)
привязка(программы к памяти) (binding)
принципминимума привилегий (при предоставлении доступа к ресурсам и информации)(principle of least privilege)
проблемно-ориентированный(problem-oriented)
программноеобеспечение (software)
простая(одиночная) буферизация (single buffering)
процедурно-ориентированный(procedure-oriented)
процессорввода-вывода (stand-alone processor)
процессор-сателлит(satellite processor)
прямойдоступ к памяти (ПДП) (Direct Memory Access, DMA)
расслоениепамяти (интерливинг) (storage interleaving)
регистр перемещения (relocationregister)
редактор связей (linkageeditor)
режимзадачи (пользователя) (problem state)
режимвыполнения программ (execution states)
режимсупервизора (supervisor state)
режимон-лайн (on-line)
связывающийзагрузчик (linking loader)
сегментация(segmentation)
селекторный канал (selectorchannel)
спулинг(ввод-вывод с буферизацией) (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.