Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ТСвИС / книга.(уч.пособие) Архитектура компьютера. Э.Танненбаум

.pdf
Скачиваний:
84
Добавлен:
28.05.2015
Размер:
5.64 Mб
Скачать

Краткое содержание книги

53

Чтобы разъяснить, как принципы, изложенные в этой книге, могут применяться на практике, мы в качестве примеров будем использовать компьютеры Pentium II, UltraSPARC II и picojava II. Они были выбраны по нескольким причинам. Во-первых, они широко используются, и у читателя наверняка есть доступ хотя бы к одному из них. Во-вторых, каждый из этих компьютеров обладает собственной уникальной архитектурой, что дает основу для сравнения и возможность показать альтернативные варианты. Книги, в которых рассматривается только один компьютер, оставляют у читателя чувство, будто это и есть единственный нормальный компьютер, что является абсурдным в свете огромного числа компромиссов и произвольных решений, которые разработчики вынуждены принимать. Читатель должен рассматривать эти и все другие компьютеры критически и постараться понять, почему дела обстоят именно таким образом и что можно было бы изменить, а не просто принимать их как данность.

Нужно уяснить с самого начала, что эта книга не о том, как программировать Pentium II, UltraSPARC II и picojava II. Эти компьютеры используются только в качестве иллюстративных примеров, и мы не претендуем на их полное описание. Читателям, желающим ознакомиться с этими компьютерами, следует обратиться к публикациям производителей.

Глава 2 знакомит читателей с основными компонентами компьютера: процессорами, памятью, устройствами ввода-вывода. В ней дается краткое описание системной архитектуры и введение к следующим главам.

Главы 3, 4, 5 и 6 касаются каждая одного из уровней, показанных на рис. 1.2. Мы идем снизу вверх, поскольку компьютеры разрабатывались именно таким образом. Структура уровня к в значительной степени определяется особенностями уровня к-1, поэтому очень трудно понять, как устроен определенный уровень, если не рассмотреть подробно предыдущий, который и определил строение последующего. К тому же с точки зрения обучения логичнее следовать от более простых уровней к более сложным, а не наоборот.

Глава 3 посвящена цифровому логическому уровню, то есть аппаратному обеспечению. В ней рассказывается, что такое вентили и как они объединяются в схемы. В этой главе также вводятся основные понятия булевой алгебры, которая используется для обработки цифровых данных. Кроме того, объясняется, что такое шины, причем особое внимание уделяется популярной шине PCI. В главе приводится много разнообразных примеров, в том числе относящихся к трем компьютерам, упомянутым выше.

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

Вглаве 5 обсуждается уровень архитектуры команд, который многие называют машинным языком. Здесь мы подробно рассмотрим 3 компьютера, выбранные нами

вкачестве иллюстративных примеров.

Вглаве 6 говорится о некоторых командах, об устройстве памяти компьютера, о механизмах управления на уровне операционной системы. В качестве примеров будут использованы операционные системы Windows NT, которая устанавливается на Pentium П, и UNIX, используемая на UltraSPARC П.

54 Глава 1. Предисловие

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

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

Глава 9 содержит список рекомендуемой литературы к каждому разделу, а также алфавитный список литературы, цитируемой в этой книге.

Вопросы и задания

1.Объясните следующие термины своими словами: 1. Транслятор.

2 Интерпретатор.

3. Виртуальная машина.

2.Чем отличается интерпретация от трансляции?

3.Может ли компилятор производить данные сразу для микроархитектурного уровня, минуя уровень архитектуры команд? Обоснуйте все доводы за и против.

4.Можете ли вы представить многоуровневый компьютер, у которого уровень внешнего устройства и цифровой логический уровень — не самые нижние уровни? Объясните, почему.

5.Рассмотрим компьютер с идентичными интерпретаторами на первом, втором и третьем уровнях. Чтобы вызвать из памяти, определить и выполнить одну команду, интерпретатору нужно выполнить п команд. Выполнение одной команды первого уровня занимает к не. СКОЛЬКО времени будет занимать выполнение одной команды на втором, третьем и четвертом уровнях?

6.Рассмотрим многоуровневый компьютер, в котором все уровни отличаются друг от друга. Команды каждого уровня в m раз мощнее команд предыдущего уровня, то есть одна команда уровня г может выполнять ту же работу, которую выполняют m команд на уровне г-1. Если для выполнения программы первого уровня требуется к секунд, сколько времени будут выполняться соответствующие программы на втором, третьем и четвертом уровнях, учитывая, что для интерпретации одной команды уровня г+1 требуется п команд уровня г?

7.Некоторые команды уровня операционной системы идентичны командам уровня архитектуры команд. Эти команды сразу выполняются микропрограммой, а не операционной системой. Учитывая ответ на предыдущий вопрос, подумайте, зачем это нужно.

8.В каком смысле аппаратное и программное обеспечение эквивалентны? А в каком не эквивалентны?

Вопросы и задания

55

9.Одно из следствий идеи фон Неймана хранить программу в памяти компьютера — возможность вносить изменения в программы. Приведите пример, где это может быть полезно (подсказка: подумайте об арифметических операциях над массивами).

10.Работоспособность 75-й модели IBM-360 в 50 раз больше, чем у модели 30, однако время цикла меньше всего лишь в 5 раз. Объясните, почему.

11.На рисунках 1.4 и 1.5 изображены схемы компьютерных систем. Опишите, как происходит процесс ввода-вывода в каждой из этих систем. У какой из них общая производительность больше?

12.В определенный момент времени диаметр транзистора на микропроцессоре составлял один микрон. Каков будет диаметр транзистора на новой модели в следующем году в соответствии с законом Мура?

Глава 2

Организация компьютерных систем

Цифровой компьютер состоит из связанных между собой процессоров, памяти

иустройств ввода-вывода. Вторая глава знакомит читателя с этими компонентами

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

Процессоры

На рис. 2.1 показано устройство обычногокомпьютера. Центральныйпроцессор — это мозг компьютера. Его задача — выполнять программы, находящиеся в основной памяти. Он вызывает команды из памяти, определяет их тип, а затем выполняет их одну за другой. Компоненты соединены шиной, представляющей собой набор параллельно связанных проводов, по которым передаются адреса, данные и сигналы управления. Шины могут быть внешними (связывающими процессор с памятью и устройствами ввода-вывода) и внутренними.

Процессор состоит из нескольких частей. Блок управления отвечает за вызов команд из памяти и определение их типа. Арифметико-логическое устройство выполняет арифметические операции (например, сложение) и логические операции (например, логическое И).

Внутри центрального процессора находится память для хранения промежуточных результатов и некоторых команд управления. Эта память состоит из нескольких регистров, каждый из которых выполняет определенную функцию. Обычно все регистры одинакового размера. Каждый регистр содержит одно число, которое ограничивается размером регистра. Регистры считываются и записываются очень быстро, поскольку они находятся внутри центрального процессора.

Самый важный регистр — счетчик команд, который указывает, какую команду нужно выполнять дальше. Название «счетчик команд» не соответствует действительности, поскольку он ничего не считает, но этот термин употребляется повсеместно1. Еще есть регистр команд, в котором находится команда, выполняемая в данный

Для этой же цели используется термин «указатель команд». — Примеч. научи, ред.

Процессоры 57

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

Центральный процессор

Блок

управления

Арифметико-

 

 

 

логическое

 

Устройства ввода-вывода

устройство

 

Регистры

 

 

 

 

Основная

Диск

Принтер

 

память

 

 

 

Шина

Рис. 2 . 1 . Схема устройства компьютера с одним центральным процессором и двумя устройствами ввода-вывода

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

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

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

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

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

58Глава 2. Организация компьютерных систем

А+ В

Регистры

^~* Входной регистр АЛУ Входная шина АЛУ

АЛУ

-Выходной регистр АЛУ

А + В

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

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

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

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

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

2)меняет положение счетчика команд, который теперь должен указывать на следующую команду1;

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

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

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

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

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

иих обработки в рамках одной-единственной команды. — Примеч. научн. ред.

Процессоры 59

6)выполняет команду;

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

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

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

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

public class

Interp{

 

 

 

static

int

PC.

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

static

int

AC;

// аккумулятор, регистр для арифметики

static

int

instr.

//регистр для

текущей команды

static int instr_type.

//тип

команды

(код операции)

static mt data_loc.

//адрес

данных или - 1 , если его нет

static

int

data.

//содержит текущий операнд

static

boolean run_bit

= true;

//бит. который можно выключить, чтобы остановить машину

public static void interpretCint memory[], int starting_address{ //Эта процедура интепретирует программы для простой машины.

которая содержит команды только с одним операндом из памяти Машина содержит регистр АС (аккумулятор) Он используется для арифметических действий Например, команда ADD суммирует число из памяти с АС. Интерпретатор работает до тех пор. пока не будет выполнена команда HALT, вследствие чего бит run_bit поменяет значение на false. Машина состоит из памяти, счетчика команд, бита run b i t и аккумулятора АС Входные параметры состоят из копии содержимого памяти и начального адреса

PC=starting_address. while (run_bit) {

instr-memory[PC], //вызывает следующую команду в instr

РС-РС+1.

//увеличивает

значение счетчика

команд

mstr_type=getjnst retype ( i n s t r ) .

//определяет тип команды

data_loc=find_data(instr, mstrjtype) . //находит данные ( - 1 , если данных нет)

1f(datajoc>=0)

//если data_lock=-l.

//значит,

операнда нет

data=memory[data_loc].

//вызов данных

 

execute(mstr_type.data),

//выполнение команды

}

 

 

 

 

 

private static int get_instr_type(mt addr) {.}

 

private static int find_dataCint

instr. int type) {.}

 

private static void executednt

type,

int data) {..}

 

}

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

60 Глава 2. Организация компьютерных систем

из памяти, определять тип команд и выполнять эти команды может другая программа. Такая программа называется интерпретатором. Об интерпретаторах мы говорили в главе 1.

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

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

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

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

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

Процессоры 61

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

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

1)возможность фиксировать неправильно выполненные команды или даже восполнять недостатки аппаратного обеспечения;

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

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

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

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

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

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

62 Глава 2. Организация компьютерных систем

разработка сложного аппаратного обеспечения замещалась разработкой сложного программного обеспечения.

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

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

RISC и CISC

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

Вкомпании IBM группа разработчиков во главе с Джоном Коком противостояла этой тенденции; они попытались воплотить идеи Сеймура Крея, создав экспериментальный высокоэффективный мини-компьютер 801. Хотя IBM не занималась сбытом этой машины, а результаты эксперимента были опубликованы только через несколько лет, весть быстро разнеслась по свету, и другие производители тоже занялись разработкой подобных архитектур.

В1980 году группа разработчиков в университете Беркли во главе с Дэвидом Паттерсоном и Карло Секвином начала разработку процессоров VLSI без использования интерпретации. Для обозначения этого понятия они придумали термин RISC и назвали новый процессор RISC I, вслед за которым вскоре был выпущен RISC II. Немного позже, в 1981 году, Джон Хеннеси в Стенфорде разработал и выпустил другую микросхему, которую он назвал MIPS. Эти две микросхемы развились в коммерчески важные продукты SPARC и MIPS соответственно.

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