Принцип программного управления
Устройство управления (УУ) управляет всеми остальными устройствами ЭВМ. Оно осуществляет это путём посылки управляющих сигналов, подчиняясь которым остальные устройства производят определённые действия, предписанные этими сигналами. Обратите внимание, что это устройство является единственным, от которого на рис. 1 отходят тонкие стрелки управляющих сигналов ко всем другим устройствам. Остальные устройства на этой схеме могут "командовать" только памятью, делая ей запросы на чтение и запись машинных слов.
Принцип программного управления ещё называют принципом принципом автоматической работы. Машина, выполняя записанную в её памяти программу, функционирует автоматически, без участия человека, если только такое участие не предусмотрено в самой программе, например, при вводе данных. Пример устройства, которое может выполнять команды, как и ЭВМ, но не в автоматическом режиме – обычный (непрограммируемый) калькулятор.
Программа – набор записанных в памяти (не обязательно последовательно) машинных команд, задающих действия, описывающих шаги работы алгоритма. Команды программы обрабатывают хранимые в памяти компьютера данные. Таким образом, программа – это запись алгоритма на языке машины. Язык машины – набор всех возможных операций, выполняемых командами и допустимые форматы этих команд. Машинный язык современных наиболее распространённых компьютеров фирмы Intel содержит более трёхсот различных кодов операций.
Принцип последовательного выполнения команд.Устройство управления выполняет некоторую команду от начала до конца, а затем по определённому правилу выбирает следующую команду для выполнения, затем следующую и т.д. При этом каждая команда либо сама явно указывает на команду, которая будет выполняться следующей (такие команды называются командами перехода), либо следующей будет выполняться команда из ячейки, расположенной в памяти непосредственно вслед за той ячейкой, в которой хранится только что выполненная команда. Этот процесс продолжается, пока не будет выполнена специальная команда останова, либо при выполнении очередной команды не возникнет аварийная ситуация (например, деление на ноль). Аварийная ситуация – это аналог безрезультативного останова алгоритма.
Роль арифметико-логического устройства
В архитектуре машины Фон Неймана арифметико-логическое устройство (АЛУ) может выполнить следующие действия.
1. Считать содержимое некоторой ячейки памяти (машинное слово), т.е. поместить копию этого машинного слова в некоторую другую ячейку, расположенную в самом АЛУ. Если ячейки памяти расположены не в основной памяти, а в других устройствах ЭВМ, то они называются регистровой памятью или просто регистрами. Таким образом, АЛУ может читать машинное слово из памяти на один из своих регистров.
2. Записать машинное слово в некоторую ячейку памяти – поместить копию содержимого одного из своих регистров в эту ячейку памяти. Когда не имеет значения, какая операция (чтение или запись) производится, говорят, что происходит обмен машинным словом между регистром и основной памятью ЭВМ. Таким образом, как уже говорилось, машинное слово – это минимальная порция информации для обмена с основной памятью.
3. АЛУ может также выполнять различные операции над данными в своих регистрах, например, сложить содержимое двух регистров, обычно называемых регистрами первого R1 и второго R2 операндов, и поместить результат этой операции на третий регистр, называемый в русскоязычной литературе, как правило, сумматором S. В англоязычной литературе этот регистр называется Accumulator и сокращается до буквы A.
Взаимодействие УУ и АЛУ
Революционность идей Джона Фон Неймана заключалась в строгой специализации: каждое устройство компьютера отвечает за выполнение только своих функций. Например, раньше память ЭВМ часто не только хранила данные, но и могла производить операции над ними. Теперь же было предложено, чтобы память только хранила данные, АЛУ производило арифметико-логические операции над данными в своих регистрах, устройство ввода вводило данные из "внешнего мира" в память и т.д. Таким образом, Джон Фон Нейман предложил жёстко распределить выполняемые ЭВМ функции между различными устройствами, что существенно упростило схему машины, и сделало более понятной её работу.
Устройство управления тоже имеет свои регистры, оно может считывать команды из памяти на специальный регистр команд РK (IR – instruction register), на котором всегда хранится текущая выполняемая команда. Регистр УУ с именем РA называется регистром или счётчиком адреса (в англоязычной литературе его часто обозначают IP – instruction pointer), при выполнении текущей команды в него по определённым правилам записывается адрес следующей выполняемой команды (первую букву в сокращении слова регистр мы будем в дальнейшем изложении часто записывать латинской буквой R).
Рассмотрим, например, схему выполнения команды, реализующей оператор присваивания с операцией сложения двух чисел z:=x+y. ВАЖНО! Здесь x, y и z – адреса ячеек памяти, в которых хранятся, соответственно, операнды и будет помещен результат операции сложения (предположим, что такая команда есть в языке машины). После получения из памяти этой команды на регистр команд РK, УУ последовательно посылает управляющие сигналы в АЛУ, предписывая ему сначала считать операнды x и y из памяти и поместить их на регистры R1 и R2. Затем по следующему управляющему сигналу устройства управления АЛУ производит операцию сложения чисел, находящихся на регистрах R1 и R2, и записывает результат на регистр сумматора S. По следующему управляющему сигналу АЛУ пересылает копию регистра S в ячейку памяти с адресом z.
Приведем иллюстрацию описанного примера на языке Паскаль, где R1, R2 и S – переменные, обозначающие регистры АЛУ, ПАМ – массив ячеек, условно обозначающий память ЭВМ, а ⊗ – бинарная операция (в нашем случае это сложение, т.е. ⊗ = +).
R1 := ПАМ[x]; R2 := ПАМ[y]; S: = R1⊗R2; ПАМ[z] := S; |
В научной литературе по архитектуре ЭВМ принято конструкцию ПАМ[А] обозначать как <А>, тогда наш пример выполнения команды перепишется так:
R1: = <x>; R2: = <y>; S: = R1⊗R2; <z> := S; |
Опишем теперь более формально шаги выполнения одной команды в машине Фон Неймана:
1. РK := <РA>; считать из ячейки памяти с адресом РA команду на регистр команд РK; 2. РA := РA+1; увеличить счётчик адреса на единицу; 3. Выполнить очередную команду, хранящуюся в регистре РK. |
Затем по такой же схеме из трёх шагов выполняется следующая команда и т.д. Заметим, что после выполнения очередной команды ЭВМ "не помнит", какую именно команду она только что выполнила. Заметим, что по такому же принципу выполняли свои "команды" (шаги алгоритма) и такие известные абстрактные исполнители алгоритмов, как машина Тьюринга и Нормальные алгоритмы Маркова.
Итак, если машинное слово попадает на регистр команд, то оно интерпретируется УУ как команда, а если слово попадает в АЛУ, то оно по определению считается числом. Это позволяет, например, складывать команды программы как числа, либо выполнить некоторое число как команду. Разумеется, обычно такая ситуация является семантической ошибкой, если только специально не предусмотрена программистом для каких-то целей.
Современные ЭВМ в той или иной степени нарушают практически все принципы Фон Неймана. Исключение, пожалуй, составляют только принцип автоматической работы, он лежит в самой основе определения ЭВМ как устройства для автоматической обработки данных, и принцип хранимой программы.
Например, существуют компьютеры, которые различают команды и данные. В них каждая ячейка основной памяти кроме собственно машинного слова хранит ещё специальный признак, называемый тэгом (tag), который и определяет, чем является это машинное слово. Для экономии памяти современные компьютеры могут приписывать такой тэг не каждой ячейке в отдельности, а сразу целой последовательности ячеек, называемой сегментом. Таким образом, различают, например, сегменты команд и данных, при этом выполнение данных в виде команды может трактоваться как ошибка. Так нарушается принцип неразличимости команд и чисел. В такой архитектуре при попытке выполнить число как команду, либо складывать команды как числа, центральным процессором будет зафиксирована ошибка. Очевидно, что это позволяет повысить надёжность программирования на языке машины, не допуская, как часто говорят, случайного "выхода программы на константы".
Практически все современные ЭВМ нарушают принцип однородности и линейности памяти. Память может, например, состоять из двух частей со своей независимой нумерацией ячеек в каждой такой части; или быть двумерной, когда адрес ячейки задаётся не одним, а двумя числами; либо ячейки памяти могут вообще не иметь адресов, такая память называется ассоциативной и т.д.
Все современные достаточно мощные компьютеры нарушают и принцип последовательного выполнения команд: они могут одновременно выполнять несколько команд как из одной программы, так, иногда, и из разных программ (такие компьютеры имеют несколько центральных процессоров), а также быть так называемыми конвейерными ЭВМ.
Вообще говоря, следует отметить, что в архитектуре машины Фон Неймана зафиксированы и другие принципы, которые из работы самого Фон Неймана явно не вытекали, так как, безусловно, считались самоочевидными. Так, например, предполагается, что во время выполнения программы не меняется число узлов компьютера и взаимосвязи между ними, не меняется число ячеек в оперативной памяти. Далее, например, считалось, что машинный язык при выполнении программы не изменяется (например, "вдруг" не появляются новые машинные команде) и т.д. В то же время сейчас существуют ЭВМ, которые нарушают и этот принцип. Во время работы одни устройства могут, как говорят, отбраковываться (например, отключаться для ремонта), другие – автоматически подключаться. Кроме того, во время работы программы могут, как изменяться, так и появляются новые связи между элементами ЭВМ (например, в так называемых транспьютерах). Существуют и компьютеры, которые могут менять набор своих команд, они называются ЭВМ с микропрограммным управлением.
В заключение этого краткого рассмотрения машины Фон Неймана ещё раз обратим внимание на одно важное свойство компьютеров. Закончив выполнение текущей команды, машина начисто ''забывает" о том, что это была за команда, где она располагалась в памяти, с какими операндами работала и т.д. Выполнение каждой следующей команды практически начинается "с чистого листа". Это важное свойство позволяет, например, надолго прерывать выполнение программы, запомнив относительно небольшой объём информации (текущее состояние регистров компьютера, сведения об открытых файлах и т.д.). В дальнейшем в любой момент возможно возобновление счёта этой программы с прерванного места (разумеется, сама программа и её данные в памяти компьютера должны сохраниться, или же должны быть восстановлены в прежнем виде). Это свойство является основой для так называемого мультипрограммного режима работы компьютера.
На этом закончим краткое описание машины Фон Неймана и принципов её работы. Первая ЭВМ, построенная на основе принципов Фон Неймана, называлась EDVAC (Electronic Delay Storage Automatic Calculator – автоматический вычислитель с электронной памятью на линиях задержки). Компьютер EDVAC был построен в 1949 году в Англии М.Уилксом (при участии А.Тьюринга). EDVAC работала в двоичной системе счисления со скоростью примерно 100 операций в секунду. Заметим, что именно от этой машины принято отсчитывать первоепоколение ЭВМ (все предшествующие "не совсем настоящие" компьютеры можно условно отнести к нулевому поколению).
[1] Триггер (триггерная система) — класс электронных устройств, обладающих способностью длительно находиться в одном из двух устойчивых состояний и чередовать их под воздействием внешних сигналов. Каждое состояние триггера легко распознаётся по значению выходного напряжения. По характеру действия триггеры относятся к импульсным устройствам — их активные элементы (транзисторы, лампы) работают в ключевом режиме, а смена состояний длится очень короткое время.
[2] Разрывные характеристики электронных ламп, на которых основано действие триггеров, впервые под названием «катодное реле» были описаны М. А. Бонч-Бруевичем в 1918 г.
Практическая схема триггера была опубликована 5 августа 1920 года У. Г. Икклзом и Ф. У. Джорданом в патенте Великобритании № 148582, заявленном 21 июня 1918 г. и в статье «Переключающее реле, использующее трёхэлектродные вакуумные лампы» от 19 сентября 1919 года.
[3] Баула Владимир Георгиевич. Окончил факультет вычислительной математики и кибернетики МГУ (1971). Кандидат физико-математических наук (1975). Доцент кафедры АСВК (с 1982 г.)
[4] Здесь рассматривается несколько модифицированная схема машины фон Неймана: устройства ввода/вывода обмениваются данными непосредственно с памятью, а в схеме самого фон Неймана этот обмен производился через арифметико-логическое устройство (АЛУ) под контролем устройства управления.
[5] В частности, можно написать программу, которая ничего не вводит и выводит запись своего собственного текста. Вы можете попробовать сделать это на некотором языке программирования высокого уровня (например, на Паскале). Кому любопытно, могут посмотреть, как это делается, в книге Уэзерелл Ч. Этюды для программистов. – М., Мир, 1982.
[6] В современных ЭВМ некоторые программы, называемые Базовыми процедурами ввода/вывода (BIOS) крайне нежелательно изменять (стирать) во время работы компьютера. Такие программы располагают в уже упомянутой ранее памяти типа ROM, закрытой для записи, хотя по внешнему виду команды в такой памяти тоже неотличимы от чисел.