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

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

### 5.1. Процессоры

Рис. 5.1

Центральный процессор – мозг компьютера. Его задача – выполнять программы, находящиеся в основной памяти. Процессор состоит из нескольких частей. Блок управления отвечает за вызов команд из памяти и определение их типа. АЛУ выполняет арифметические и логические операции. В центральном процессоре находится память для хранения промежуточных результатов и некоторых команд управления – регистровая память.

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

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

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

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

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

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

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

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

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

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

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

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

Описание работы центрального процессора можно представить в виде программы. Такая программа называется программой-интерпретатором.

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

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

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

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

Для переноса сложных команд на дешевые компьютеры использовалась интерпретация. Эта технология была предложена Уилксом в 1951 году и позволяла разрабатывать дешевые компьютеры, которые могли выполнять большое количество команд. Так была создана System/360. В дорогих компьютерах сложные команды выполнялись аппаратными методами, а в дешевых – программными. Простые компьютеры с интерпретатором имеют и некоторые другие преимущества:

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

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

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

Со временем интерпретаторы стали применяться практически во всех компьютерах. Эта тенденция достигла своего пика в разработке компьютера VAX, у которого было несколько сотен команд и более 200 способов определения операндов в каждой команде. Это привело к появлению множества второстепенных команд. Производительности было уделено мало внимания, что и стало роковым для VAX, а также для производителя DEC. В 1998 году Compaq купила DEC.

#### 5.1.2. RISC и CISC

В 1980 году группа разработчиков университета Беркли (Дэвид Паттерсон и Карло Секвин) начала разработку процессоров без использования интерпретаторов. Для обозначения этого понятия был придуман термин RISC (Reduced Instruction Set Computer). Новые процессоры существенно отличались от коммерческих процессоров того времени. Они имели ограниченный набор команд, а преимущество состояло в том, что выбор и декодирование команд осуществляется быстро.

RISC противопоставляется CISC (Complex Instruction Set Computer). Типичный CISC-компьютер – VAX.

Учитывая преимущества RISC-компьютеров можно было предположить, что они стали бы доминировать над СISC-компьютерами. Однако этого не произошло.

Во-первых, RISC-компьютеры были несовместимы по программному обеспечению с другими моделями.

Во-вторых, идеи RISC воплощались в компьютерах с СISC архитектурой. Например, процессоры Intel начиная с 486, содержат ядро RISC, которое выполняет наиболее простые (а, значит, наиболее распространенные) команды за один такт тракта данных. При таком «гибридном» подходе работа происходит не так быстро, как у RISC, но программная совместимость оправдывает эту потерю в быстродействии.

#### 5.1.3. Принципы разработки современных компьютеров

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

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

Компьютер должен начинать выполнение большого числа команд. Процессор MIPS-500 способен приступить к выполнению 500 млн ком/с. Этот принцип полагает, что параллелизм может играть главную роль в повышении производительности.

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

К памяти должны обращаться только команды записи/считывания.

Должно быть большое количество регистров.

#### 5.1.4. Параллелизм на уровне команд

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

##### 5.1.4.1. Конвейеры

Главное препятствие высокой скорости выполнения команд является обращение в память. Для разрешения этой проблемы разработчики придумали средство для вызова команд из памяти заранее. Эти команды помещались в набор регистров, который называется буфером выборки с упреждением.

Одним из самых простых и наиболее распространенным способов повышения быстродействия процессоров является конвейеризация процесса вычислений. В любом процессоре машинная команда проходит ряд этапов обработки, например: выборку команды из памяти (ВК), вычисление адреса операнда (ВА), выборку операнда из памяти (ВО), собственно выполнение операции.

В процессоре последовательной ЭВМ для выполнения этих функций используется единственное устройство, поэтому время выполнения команды равно: tk = tвк + tва + tво + tалу.

Для того, чтобы уменьшить время выполнения команды можно для каждой функции ввести собственное оборудование. В таком процессоре любая команда проходит через все устройства, находясь на каждом этапе время Δt, постоянное для всех этапов. Теперь, несмотря на то, что время выполнения операции может даже увеличиться, результаты выполнения команд появляются через интервалы времени Δt = tk/n, где n – число этапов конвейера команд.

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

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

На рис. 5.3 показан конвейер из 5 блоков, которые называются стадиями.

Рассмотрим конвейеризация устройства выборки команд. Поскольку на каждый полученный в АЛУ результат происходит одна выборка команды из памяти, то время выборки команды не должно превышать времени выполнения операции в АЛУ. Но запоминающие устройства могут иметь цикл обращения в значительно превышающий требуемый цикл конвейера. Выходом из сложившейся ситуации может являться расслоение памяти – разделение ее на множество автономных по функционированию блоков. Число этих блоков N = tmem/Δt, где Tmem – время обращения в память, Δt – цикл конвейера. Обычно N выбирают как целую степень 2.

Некоторые варианты такой памяти изображены на рис.5.4.

Для организации чтения со сдвигом в регистры адреса (РА) блоков памяти 1 … 4 с интервалом Δt подается новый адрес из счетчика адресов команд. С таким же сдвигом по времени на выходе блока памяти будут появляться команды, которые затем поступают в буфер команд (БК) (память типа очереди). Из БК считываются команды, которые указывает счетчик команд для БК. При достаточной длине БК там могут, например, целиком размещаться циклы. В этих случаях выборка команд будет происходить только из БК. В этих случаях выборка команд не будет мешать выборке операндов.

Во втором случае за один цикл памяти в БК заносится несколько команд, операции в БК выполняются как и ранее.

##### 5.1.4.2. Суперскалярные архитектуры

Один конвейер хорошо, а два лучше. Одна из возможных схем процессора с двойным конвейером приведена на рис. 5.5.

Сначала конвейеры использовались только в компьютерах RISC. Конвейеры в процессорах Intel появились только с 486, который содержал один конвейер, а Pentium – 2 конвейера из 5-ти стадий. Эти конвейеры были не одинаковы. Главный конвейер (u-конвейер) мог выполнять произвольные команды, а второй (v-конвейер) мог выполнять только простые команды с целыми числами, а также одну простую команду с плавающей точкой.

Имеются сложные правила определения, является ли пара команд совместимой для того, чтобы выполняться параллельно.

Переход к четырем конвейерам возможен в принципе, но требует значительных аппаратных затрат. Вместо этого используют другая идея – один конвейер с большим количеством функциональных блоков, как показано на рис. 5.5. (Pentium II).

В 1987 году для такого подхода был введен термин суперскалярная архитектура, хотя впервые такая структура была использована в конце 50-х в компьютере CDC 6600.

#### 5.1.5.Параллелизм на уровне процессов

Конвейерная и суперскалярная архитектура обычно увеличивает скорость работы всего лишь в 5 – 10 раз. Чтобы увеличить скорость в 50, 100 и более раз необходимо разрабатывать компьютеры с несколькими процессорами.

##### 5.1.5.1. Матричные компьютеры

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

Матричный процессор состоит из большого числа сходных процессоров, которые выполняют одну и ту же последовательность команд применительно к разным наборам данных. Первым таким процессором был ILLIAC IV, структурная схема которого изображена на рис. 5.7. Он содержит решетку 8 х 8 элементов процессор/память. Имеется блок контроля, который рассылал команды, выполняемые всеми элементами одновременно. Первоначально планировалось иметь четыре решетки, но из-за высокой стоимости была реализована только одна. Одна решетка (или сектор) выполняет 50 млн оп/с с п.з.

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

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

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

В настоящее время матричные процессоры не выпускаются, но принцип, на котором они реализованы используется, по-прежнему актуален. Например, аналогичная идея используется в наборах ММХ- и SSE- командах Pentium 4.

##### 5.1.5.2. Мультипроцессоры

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

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

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

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

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

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

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

##### 5.1.5.3. Мультикомпьютеры

Создание больших мультипроцессорных систем представляется сложной задачей, основная проблема которой состоит, чтобы связать все компьютеры с памятью. Чтобы избежать этих проблем было предложено создавать системы, состоящие из большого числа взаимосвязанных компьютеров, у каждого из которых имелась своя собственная память, а общей памяти нет. Такие системы называются мультикомпьютерами. Обмен информацией происходит посредством посланий (сообщений). Каждый компьютер связан не обязательно со всеми другими, а только с некоторыми. В качестве топологии используются 2D, 3D, деревья, кольца. Для того, чтобы сообщения доходили до адресата, они могут проходить через один или несколько промежуточных компьютеров. Сейчас запусеаются в работу мультикомпьютеры, содержащие около 10 000 процессоров. Более подробно организацию таких систем рассмотрим в конце курса.

### 5.2. Кэш-память

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

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

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

Эффективность использования кэш памяти определяется тем, насколько «удачно» она заполнена. Основная идея заполнения кэш-памяти заключается в том, что, как правило, последовательно используемые данные и команда расположены поблизости. Если определенное слово вызывается из памяти, то вместе с ним считываются и записываются в кэш соседние слова.

Разработка кэш-памяти очень важна для процессоров с высокой производительностью. При разработке кэш-памяти принципиальное значение имеет решение следующих вопросов:

1. размер кэш-памяти;

2. размер строки (cache lines) кэш-памяти (совместно переписываемые слова при обращении к основной памяти);

3. устройство памяти (способ определения наличия требуемого слова);

4. расположение данных и команд – смежная память (данные и команды располагаются совместно или раздельная (данные и команды располагаются в разных памятях;

5. количество блоков кэш-памяти.

### 5.3. Вспомогательная память

Сколько бы памяти не было, ее всегда будет мало. Иерархическая структура памяти является традиционным решением проблемы хранения большого количества информации. Структура изображена на рис. 5. 10.

По мере продвижения по структуре сверху вниз возрастают три параметра:

1. увеличивается время доступа;

2. увеличивается объем памяти;

3. увеличивается объем информации, получаемых на одну у.е.

### 1.4. Процесс ввода-вывода

Большинство персональных компьютеров имеют структуру, сходную с приведенной на рис. 5.11.

На рисунке все компоненты соединены одной шиной, что соответствует логической структуре компьютера. Однако физически существуют различные шины.

Если контроллер считывает данные или записывает их в память без участия центрального процессора, то говорят, что осуществляется прямой доступ к памяти (Direct Memory Access DMA). Когда передача данных заканчивается, контроллер вызывает прерывание, по которому ЦП приостанавливает работу текущей программы и выполняет особые процедуры – программу обработки прерываний. Это необходимо, чтобы проверить правильность выполненных операций и сообщить операционной системе о завершении процесса ввода-вывода.

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

С увеличением производительности процессоров и памяти шина перестала справляться с нагрузкой. Разработка новой шины потребовала бы замены и контроллеров, поэтому IBM была вынуждена сохранить старую шину, которая сейчас называется шиной ISA (стандартная промышленная шина). Поскольку быстродействия шины не хватало, многие компании начали производить компьютеры с несколькими шинами. Сейчас самой популярной является шина PCI (взаимодействие периферийных компонентов). Она была разработана компанией Intel, но все патенты были сделаны всеобщим достоянием, чтобы вся компьютерная индустрия могли перенять эту идею.

Типичная конфигурация приведена на рис. 5.12.

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