Устройство центрального процессора

 

Внутреннее устройство тракта данных типичного фон-неймановского процессо­ра иллюстрирует рис. 2.2. Тракт данных состоит из регистров (обычно от 1 до 32), арифметико-логического устройства (АЛУ) и нескольких соединительных шин. Содержимое регистров поступает во входные регистры АЛУ, которые на рис. 2.2 обозначены буквами А и В. В них находятся входные данные АЛУ, пока АЛУ производит вычисления. Тракт данных — важная составная часть всех ком­пьютеров, и мы обсудим его очень подробно.

АЛУ выполняет сложение, вычитание и другие простые операции над вход­ными данными и помещает результат в выходной регистр. Содержимое этого выходного регистра может записываться обратно в один из регистров или сохра­нятся в памяти, если это необходимо. Рисунок 2.2 иллюстрирует операцию сло­жения. Отметим, что входные и выходные регистры есть не у всех компьютеров.

Большинство команд можно разделить на две группы: типа регистр-память и ти­па регистр-регистр. Команды первого типа вызывают слова из памяти, помещают их в регистры, где они используются в качестве входных данных АЛУ (слова — это такие элементы данных, которые перемещаются между памятью и регистрами2). Словом может быть целое число. Организацию памяти мы обсудим далее в этой главе. Другие команды этого типа помещают регистры обратно в память.

Команды второго типа вызывают два операнда из регистров, помещают их во входные регистры АЛУ, выполняют над ними какую-нибудь арифметическую или логическую операцию и переносят результат обратно в один из регистров.

1 Используется также термин «указатель команд». — Примеч. научн. ред.

2 На самом деле размер слова обычно соответствует разрядности регистра данных. Так, у 16-разряд­ных микропроцессоров 8086 и 8088 слово имеет длину 16 бит, а у 32-разрядных микропроцессо­ров — 32 бита. — Примеч. научн. ред.

Этот процесс называется циклом тракта данных. В какой-то степени он опреде­ляет, что может делать машина. Чем быстрее происходит цикл тракта данных, тем быстрее компьютер работает.

clip_image002

Рис. 2.2. Тракт данных обычной фон-неймановской машины

Выполнение команд

Центральный процессор выполняет каждую команду за несколько шагов:

1. Вызывает следующую команду из памяти и переносит ее в регистр команд.

2. Меняет положение счетчика команд, который после этого указывает на сле­дующую команду1.

3. Определяет тип вызванной команды.

4. Если команда использует слово из памяти, определяет, где находится это слово.

5. Переносит слово, если это необходимо, в регистр центрального процессора2.

Это происходит после декодирования текущей команды, а иногда и после ее выполнения. — Примем, научн. ред.

Следует заметить, что бывают команды, которые требуют загрузки из памяти целого множества слов и их обработки в рамках единственной команды. — Примеч. научн. ред.

6. Выполняет команду.

7. Переходит к шагу 1, чтобы начать выполнение следующей команды.

Такая последовательность шагов (выборка — декодирование — выполнение)

является основой работы всех компьютеров.

Описание работы центрального процессора можно представить в виде про­граммы. В листинге 2.1 приведена такая программа-интерпретатор на языке Java. В описываемом компьютере есть два регистра: счетчик команд с адресом следующей команды и аккумулятор, в котором хранятся результаты арифмети­ческих операций. Кроме того, имеются внутренние регистры, в которых хранит­ся текущая команда (instr), тип текущей команды (instr_type), адрес операнда команды (datajloc) и сам операнд (data). Каждая команда содержит один адрес ячейки памяти. В ячейке памяти находится операнд, например фрагмент дан­ных, который нужно добавить в аккумулятор.

Листинг 2.1. Интерпретатор для простого компьютера (на языке Java)

public class Interp{

static mt PC; // PC содержит адрес следующей команды

static int AC; // Аккумулятор, регистр для арифметики

static int instr; // Регистр для текущей команды

static int instr_type; // Тип команды (код операции)

static int dataJ ос: // Адрес данных или -1, если его нет

static int data; // Текущий операнд

static boolean run_bit = true; // Бит, который можно сбросить,

// чтобы остановить машину

public static void interpret(int memory[], int starting_address{
// Эта процедура интепретирует программы для простой машины,
// которая содержит команды только с одним операндом из
// памяти. Машина имеет регистр АС (аккумулятор). Он
// используется для арифметических действий. Например,
// команда ADD суммирует число из памяти с АС. Интерпретатор
// работает до тех пор, пока не будет выполнена команда
// HALT, вследствие чего бит run_bit поменяет значение на
// false. Машина состоит из блока памяти, счетчика команд, бита
// run bit и аккумулятора АС. Входные параметры представляют собой
// копию содержимого памяти и начальный адрес.

PC=starting_address;

while (run_bit) { instr=memory[PC]; // Вызывает следующую команду в instr РС=РС+1; // Увеличивает значение счетчика команд

instr_type=get_instr_type(instr); // Определяет тип команды data_loc=find_data(instr, instr_type); // Находит данные (-1,

// если данных нет) if(data_loc>=0) // Если data_lock=-l, значит, операнда нет

data=memory[data_loc]; // Вызов данных

execute(instr_type,data); // Выполнение команды

}

Сам факт того, что можно написать программу, имитирующую работу цен­трального процессора, показывает, что программа не обязательно должна выпол­няться реальным процессором (устройством). Напротив, вызывать из памяти, определять тип команд и выполнять эти команды может другая программа. Та­кая программа называется интерпретатором. Об интерпретаторах мы говорили в главе 1.

Программы-интерпретаторы, которые имитируют работу процессора, широко используются при разработке компьютерных систем. После того как разработ­чик выбрал машинный язык (Я) для нового компьютера, он должен решить, раз­рабатывать ли ему процессор, который будет выполнять программы на языке Я, или написать специальную программу для интерпретации программ на том же языке. Если он решит написать интерпретатор, ему потребуется разработать ап­паратное обеспечение для выполнения этого интерпретатора. Возможны также гибридные конструкции, когда часть команд выполняется аппаратным обеспече­нием, а часть интерпретируется.

Интерпретатор разбивает команды на более мелкие (элементарные). В резуль­тате машина, предназначенная для выполнения интерпретатора, может быть го­раздо проще по строению и дешевле, чем процессор, выполняющий программы без интерпретации. Такая экономия особенно важна при большом количестве сложных команд с различными параметрами. В сущности, экономия проистекает из самого факта замены аппаратного обеспечения программой (интерпретатором).

Первые компьютеры поддерживали небольшое количество команд, и эти ко­манды были простыми. Однако разработка более мощных компьютеров привела, помимо всего прочего, к появлению более сложных команд. Вскоре разработчи­ки поняли, что при наличии сложных команд программы выполняются быстрее, хотя выполнение каждой отдельной команды занимает больше времени. (В каче­стве примеров таких сложных команд можно назвать выполнение операций с плавающей точкой, обеспечение прямого доступа к элементам массива и т. п.) Если обнаруживалось, что пара тех или иных команд часто выполняется после­довательно, вводилась новая команда, заменяющая эти две.

Сложные команды оказались лучше еще и потому, что некоторые операции иногда перекрывались. Подобные операции могли выполняться параллельно, но для этого требовалась дополнительная аппаратура. Для дорогих компьютеров с высокой производительностью приобретение такого дополнительного аппарат­ного обеспечения было вполне оправданным. Таким образом, у дорогих компью­теров было гораздо больше команд, чем у дешевых. Однако развитие программ­ного обеспечения и требования совместимости команд привели к тому, что сложные команды стали использоваться и в дешевых компьютерах, хотя там во главу угла ставилась стоимость, а не быстродействие.

К концу 50-х годов компания IBM, которая лидировала тогда на компьютер­ном рынке, решила, что производство семейства компьютеров, каждый из кото­рых выполняет одни и те же команды, выгоднее и для самой компании, и для по­купателей. Чтобы охарактеризовать этот уровень совместимости, компания IBM ввела термин архитектура. Новое семейство компьютеров должно было иметь единую архитектуру и много разных моделей, различающихся по цене и скорости, но «умеющих» выполнять одни и те же программы. Но как построить дешевый компьютер, который сможет выполнять все сложные команды, предназначенные для высокоэффективных дорогостоящих машин?

Решением проблемы стала интерпретация. Эта технология, впервые предложен­ная Уилксом в 1951 году, позволяла разрабатывать простые дешевые компьютеры, которые тем не менее могли выполнять большое количество команд. В результа­те компания IBM создала архитектуру System/360 — семейство совместимых компьютеров, различающихся по цене и производительности. Аппаратное обес­печение, позволяющее работать без интерпретации, использовалось только в са­мых дорогих моделях.

Простые компьютеры с интерпретаторами команд имели свои достоинства. Наиболее важными среди них являлись:

♦ возможность исправлять неправильно выполненные команды или даже ком­пенсировать ошибки аппаратного обеспечения;

♦ возможность добавлять новые команды при минимальных затратах, при­чем при необходимости уже после покупки компьютера;

♦ возможность (благодаря структурированной организации) разработки, про­верки и документирования сложных команд.

В 70-е годы компьютерный рынок быстро разрастался, новые компьютеры могли выполнять все больше и больше функций. Спрос на дешевые компьютеры провоцировал создание компьютеров с интерпретаторами. Возможность разра­батывать аппаратное обеспечение с интерпретатором для определенного набора команд привела к появлению дешевых процессоров. Полупроводниковые техно­логии быстро развивались, низкая стоимость брала верх над высокой производи­тельностью, и интерпретаторы стали применяться при разработке компьютеров все шире и шире. Интерпретация использовалась практически во всех компью­терах, выпущенных в 70-е годы, от мини-компьютеров до самых больших машин.

К концу 70-х годов интерпретаторы стали применяться практически во всех моделях, кроме самых дорогих машин с очень высокой производительностью (на­пример, Сгау-1 и компьютеров серии Control Data Cyber). Интерпретаторы обес­печивали реализацию сложных команд без использования дорогостоящей аппа­ратуры, поэтому разработчики могли вводить все более и более сложные коман­ды, а также (и даже в особенности) расширять способы определения операндов.

Эта тенденция достигла своего апогея в компьютере VAX, разработанном ком­панией DEC; у него было несколько сот команд и более 200 способов определе­ния операндов в каждой команде. К несчастью, архитектура VAX с самого нача­ла разрабатывалась с ориентацией на интерпретатор, а производительности уде­лялось мало внимания. Это привело к появлению большого количества команд второстепенного значения, которые сложно было реализовать непосредственно. Данное упущение стало фатальным как для VAX, так и для его производителя (компании DEC). Компания Compaq купила DEC в 1998 году (правда, тремя го­дами позже сама компания Compaq вошла в структуру Hewlett-Packard).

Хотя самые первые 8-разрядные микропроцессоры были очень простыми и поддерживали небольшой набор команд, к концу 70-х годов даже они стали разрабатываться с ориентацией на интерпретаторы. В этот период основной про­блемой для разработчиков стала возрастающая сложность микропроцессоров.

Главное преимущество интерпретации заключалось в том, что можно было раз­работать очень простой процессор, а все самое сложное реализовать с помощью интерпретатора. Таким образом, вместо разработки сложной аппаратуры требо­валась разработка сложного программного обеспечения.

Успех системы Motorola 68000 с большим набором интерпретируемых ко­манд и одновременный провал компьютера Zilog Z8000, у которого был столь же обширный набор команд, но не было интерпретатора, продемонстрировали все преимущества интерпретации при разработке новых машин. Этот успех был до­вольно неожиданным, учитывая, что компьютер Z80 (предшественник Zilog Z8000) пользовался большей популярностью, чем Motorola 6800 (предшественник Motorola 68000). Конечно, важную роль здесь играли и другие факторы, напри­мер то, что компания Motorola много лет занималась производством микросхем, а торговая марка Zilog принадлежала Exxon — крупной нефтяной компании.

Еще один фактор в пользу интерпретации — существование быстродействую­щих постоянных запоминающих устройств для хранения интерпретаторов (так называемых командных ПЗУ). Предположим, что для выполнения обычной ин­терпретируемой команды интерпретатору компьютера Motorola 68000 нужно выполнить 10 команд (они называются микрокомандами), по 100 не на каждую, и произвести 2 обращения к оперативной памяти, по 500 не на каждое. Общее время выполнения команды составит, следовательно, 2000 не, всего лишь в два раза больше, чем в лучшем случае могло бы занять непосредственное выполне­ние этой команды без интерпретации. А если бы не было специального быстро­действующего постоянного запоминающего устройства, выполнение этой коман­ды заняло бы целых 6000 не. Таким образом, значимость командных ПЗУ очевидна.

Таненбаум Э. Архитектура компьютера. 5-е изд. (+CD). — СПб.: Питер, 2007. — 844 с: ил.

Предлагаю ознакомиться с аналогичными статьями: