В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования (1110549), страница 34
Текст из файла (страница 34)
После полного просмотра программы синтаксический анализатор построит таблицу имён, показанную на рис. 13.2.
Имя | Segment | Offset | Type | Value | ||
Data | ––– | ––– | 0 | I16=? | ||
A | Data | 0 | 2 | ––– | ||
B | Data | 2 | 1 | ––– | ||
Code | ––– | ––– | 0 | I16=? | ||
X | i16=? | i16=? | -2 | ––– | ||
R | ––– | ––– | 0 | -14 | ||
L | Code | 19 | -1 | ––– | ||
Рис. 13.2. Вид таблицы имён после анализа всей программы. |
На этапе синтаксического анализа выявляются все синтаксические ошибки в программе, например:
mov ax,bl; Несоответствие типов
add A,A+2; Несуществующий формат команды
sub cx; Мало операндов
и т.д. Используя таблицу имён, синтаксический анализатор легко обнаруживает ошибки следующего вида:
-
Неописанное имя. Имя встречается только в поле операндов и не встречается в поле метки.
-
Дважды описанное имя. Одно и то же имя дважды (или большее число раз) встретилось в поле метки.1
-
Описанное, но не используемое имя. Это предупредительное сообщение может выдаваться некоторыми "продвинутыми" Ассемблерами, если имя определено в поле метки, но ни разу не встретилось в поле операндов (видимо, программист что-то упустил).
Кроме того, синтаксический анализатор может обнаружить и ошибки, относящиеся к модулю в целом, например, превышение максимальной длины некоторого сегмента.
Итак, на втором проходе синтаксический анализатор может обнаружить все ошибки и однозначно определить формат каждой команды. Теперь можно приступать к последнему этапу работы транслятора – генерации объектного модуля. На этом этапе все числа преобразуются во внутреннее машинное представление, выписывается битовое представление всех команд, оформляется паспорт объектного модуля. Далее полученный объектный модуль записывается в библиотеку объектных модулей (обычно куда-нибудь в дисковую память).
На этом мы завершим наше краткое знакомство со схемой трансляции исходного модуля с языка Ассемблера на объектный язык.
14. Понятие о мультипрограммном режиме работы.
Архитектура машин фон Неймана предполагает, что последовательно выполняются не только команды текущей программы, но и также и сами программы. Другими словами, пока одна программа полностью не заканчивалась, следующая программа не загружалась в память и не начинала выполняться. Такой режим счёта программ называется пакетным режимом работы ЭВМ. Разумеется, такое название этому режиму было дано только после того, как появились и другие режимы работы ЭВМ.
Сейчас мы познакомимся с весьма сложным понятием – мультипрограммным (иногда говорят, многопрограммным) режимом работы ЭВМ. Мультипрограммный режим работы означает, что в оперативной памяти компьютера одновременно находится несколько независимых друг от друга и готовых к счёту программ.1 Особо следует подчеркнуть, что это могут быть и программы разных пользователей.
Мультипрограммный режим работы появился только на ЭВМ, начиная с 3-го поколения, на первых компьютерах его не было [3]. Сейчас нам сначала предстоит разобраться, для чего вообще нужно, чтобы в памяти одновременно находилось несколько программ. Этот вопрос вполне естественный, так как у подавляющего большинства компьютеров только один центральный процессор, так что одновременно может считаться только одна программа.
Частично мы уже обосновали необходимость присутствия в оперативной памяти нескольких программ, когда изучали систему прерываний. Как правило, при возникновении прерывания происходит автоматическое переключение на некоторую другую программы, которая тоже, конечно, должна находиться в оперативной памяти. Здесь, однако, можно возразить, что все программы, на которые производится автоматическое переключение при прерывании, являются системными программами (входят в операционную систему),2 а при определении мультипрограммного режима работы мы особо подчёркивали, что в оперативной памяти могут одновременно находиться несколько разных программ обычных пользователей.
Следует указать две основные причины, по которым может понадобиться мультипрограммный режим работы. Во-первых, может потребоваться одновременно выполнять несколько программ. Например, это могут быть программы, которые в диалоговом режиме работают с разными пользователями (программисты Вася и Петя одновременно с разных терминалов отлаживают свои программы, см. рис. 14.1).
Оперативная память | |||
Программа Васи | |||
Программа Пети | |||
. . . | |||
Программы операционой системы | |||
Рис. 14.1. Одновременное нахождение в памяти нескольких программ пользователей. |
Правда, здесь возникает следующая трудность: так как центральный процессор на компьютере один, то в каждый момент времени может выполняться или программа Васи, или программа Пети (ну, или служебная программа операционной системы). Эта трудность преодолевается введением специального режима работы ЭВМ – режима разделения времени, который является частным случаем мультипрограммного режима. В режиме разделения времени, используя сигналы прерывания от встроенных в компьютер часов (таймера), процедура-обработчик этого прерывания переключает центральный процессор с одной задачи пользователя на другую по истечению определённого кванта времени (обычно порядка нескольких единиц или десятков миллисекунд). В этом режиме и у Васи и у Пети создаётся иллюзия, что только его программа всё время считается на компьютере (правда, почему-то медленнее ☺).
Если отвлечься от несколько шутливого примера с Васей и Петей, то можно заметить, что потребность в таком псевдопараллельном счёте нескольких программ на компьютере с одним центральным процессором весьма распространена. Пусть, например, наш компьютер предназначен для управления несколькими различными химическими реакторами на каком-нибудь заводе, или обслуживает запросы сразу многих абонентов в библиотеке и т.д.
Другая причина широкого распространения мультипрограммного режима заключается в следующем. Наряду с главной частью – центральным процессором и оперативной памятью – в компьютере существует и большое количество так называемых периферийных (внешних) устройств, это диски, клавиатура, мышь, печатающие устройства, линии связи и т.д. (см. рис. 14.2). Все эти периферийные устройства работают значительно более медленно, чем центральный процессор и оперативная память. Имеется в виду, что все они значительно медленнее манипулируют данными. Например, за то время, за которое быстрый лазерный принтер напечатает один символ, оперативная память способна выдать центральному процессору около 3 миллионов байт, а сам центральный процессор способен за это время выполнить порядка одного миллиона команд.
| Сеть | Мышь | ||||
Клавиатура | ||||||
| Оперативная память | Печать | ||||
Центральный процессор | ||||||
Рис. 14.2. Центральная и периферийная части компьютера. |
Поэтому очевидно, что в то время, когда по запросу некоторой программы производится обмен данными с медленными внешними устройствами, центральный процессор не сможет выполнять команды этой программы, т.е. будет простаивать. Например, рассмотрим случай, когда в программе Васи выполняются операторы
Read(MyFile,X); Y:=X+1;
Очевидно, что оператор присваивания Y:=X+1 не сможет начать выполняться, пока из файла не будет прочитано значение переменной X. Вот здесь нам и пригодится способность компьютера автоматически переключаться на выполнение других программ, тоже расположенных в оперативной памяти. Пока одна программа выполняет свои команды на центральном процессоре, другая может выводить свои данные на принтер, третья – читать массив с диска в оперативную память, четвёртая – ждать ввода символа с клавиатуры и т.д. Правда, для того, чтобы обеспечить такую возможность, мало наличия на компьютере одной системы прерываний. Прежде всего, необходимо научить периферийные устройства компьютера работать параллельно и относительно независимо от центрального процессора.
Как мы говорили, на первых ЭВМ не было режима мультипрограммирования. Сейчас мы сформулируем необходимые требования, которые предъявляются к аппаратуре компьютера, чтобы на этом компьютере было возможно реализовать мультипрограммный режим работы. Сначала заметим, что требование параллельной работы центрального процессора и периферийных устройств, не являются необходимым для режима разделения времени, который, как мы уже говорили, является частным случаем мультипрограммного режима работы. Поэтому мы не будем включать это требование в перечень обязательных свойств аппаратуры ЭВМ для обеспечения работы в мультипрограммном режиме. Скажем, однако, что параллельная работа периферийных устройств и центрального процессора реализована на большинстве современных ЭВМ и на всех больших и супер-ЭВМ.
14.1. Требования к аппаратуре для обеспечения возможности работы в мультипрограммном режиме.
Итак, сформулируем необходимые требования к аппаратуре ЭВМ для обеспечения возможности мультипрограммной работы.
14.1.1. Система прерываний.
Система прерываний необходима как для режима разделения времени, так и для обеспечения параллельной работы центрального процессора и периферийных устройств, так как обеспечивает саму возможность реакции на события и автоматического переключения с одной программы на другую.
14.1.2. Механизм защиты памяти.
Этот механизм обеспечивает безопасность одновременного нахождения в оперативной памяти нескольких независимых программ. Защита памяти гарантирует, что одна программа не сможет случайно или же предумышленно обратиться в память другой программы (по записи или даже по чтению данных). Очевидно, что без такого механизма мультипрограммный режим просто невозможен.1
Механизм защиты памяти на современных ЭВМ устроен весьма сложно и часто связан с механизмом так называемой виртуальной памяти, с которым Вы познакомитесь в следующем семестре. Сейчас мы рассмотрим одну из простейших реализаций механизма защиты памяти, так эта защита была сделана на некоторых первых ЭВМ 3-го поколения, способных работать в мультипрограммном режиме.
В центральный процессор добавляются два новых регистра защиты памяти, обозначим их Анач и Акон. На каждый из этих регистров можно загрузить любой адрес оперативной памяти. Предположим теперь, что после загрузки программы в оперативную память она занимает сплошной участок памяти с адресами от 20000010 до 50000010 включительно. Тогда загрузчик, перед передачей управления на первую команду программы (у нас это часто была команда с меткой Start), присваивал регистрам защиты памяти соответственно значения