- •Организация эвм и систем
- •Содержание
- •Глава 1. Становление и эволюция цифровой вычислительной техники 8
- •Глава 2. Архитектура системы команд 37
- •Глава 3. Программная модель процессора на примере Intel i8086 71
- •Глава 4. Интерфейсы и шины в вычислительной системе 87
- •Глава 5. Системы ввода/вывода. Организация обмена в вычислительной системе 116
- •Глава 6. Основные направления в архитектуре процессоров 129
- •Глава 7. Подсистема памяти 169
- •Глава 8. Внешние накопители 197
- •Глава 9. Основы параллельных вычислений 220
- •Глава 10. Архитектура многопроцессорных систем 237
- •Глава 1. Становление и эволюция цифровой вычислительной техники
- •1.1. Определение понятия «архитектура»
- •1.2. Уровни детализации структуры вычислительной машины
- •1.3. Эволюция средств автоматизации вычислений
- •1.3.1. Нулевое поколение (1492-1945)
- •1.3.2. Первое поколение(1937-1953)
- •1.3.3. Второе поколение (1954-1962)
- •1.3.4. Третье поколение (1963-1972)
- •1.3.5. Четвертое поколение (1972-1984)
- •1.3.6. Пятое поколение (1984-1990)
- •1.3.7. Шестое поколение (1990–)
- •1.4. Концепция машины с хранимой в памяти программой
- •1.4.1. Принцип двоичного кодирования
- •1.4.2. Принцип программного управления
- •1.4.3. Принцип однородности памяти
- •1.4.4. Принцип адресности
- •1.6 Типы структур вычислительных машин и систем
- •1.6.1. Структуры вычислительных машин
- •1.6.2. Структуры вычислительных систем
- •1.6.3. Перспективные направления исследований в области архитектуры
- •Контрольные вопросы
- •Глава 2. Архитектура системы команд
- •2.1. Понятие архитектуры системы команд
- •2.2. Классификация архитектур системы команд
- •2.2.1. Классификация по составу и сложности команд
- •2.2.2. Классификация по месту хранения операндов
- •2.3. Форматы команд
- •2.3.1. Длина команды
- •2.3.2. Разрядность полей команды
- •2.3.3. Количество адресов в команде
- •2.4. Выбор адресности команд
- •2.4.1. Адресность и емкость запоминающего устройства
- •2.4.2. Адресность и время выполнения программы
- •2.4.3. Адресность и эффективность использования памяти
- •2.5. Способы адресации операндов
- •2.5.1. Непосредственная адресация
- •2.5.2. Прямая адресация
- •2.5.3. Косвенная адресация
- •2.5.4. Регистровая адресация
- •2.5.5. Косвенная регистровая адресация
- •2.5.6. Адресация со смещением
- •2.5.7. Относительная адресация
- •2.5.8. Базовая регистровая адресация
- •2.5.9. Индексная адресация
- •2.5.10. Страничная адресация
- •2.6. Цикл команды
- •2.7. Основные показатели вычислительных машин
- •Контрольные вопросы
- •Глава 3. Программная модель процессора на примере Intel i8086
- •3.1. Программная архитектура i80х86
- •3.2. Микропроцессор i8086
- •3.3. Доступ к ячейкам памяти
- •3.4. Команды микропроцессора
- •3.5. Основные группы команд и их краткая характеристика
- •3.6. Способы адресации в архитектуре i80x86
- •Контрольные вопросы
- •Лабораторная работа №1. Программная архитектура процессора i8086
- •Глава 4. Интерфейсы и шины в вычислительной системе
- •4.1. Структура взаимосвязей вычислительной машины
- •4.2. Типы шин
- •4.2.1. Шина «процессор-память»
- •4.2.2. Шина ввода/вывода
- •4.2.3. Системная шина
- •4.3. Иерархия шин
- •4.3.1. Вычислительная машина с одной шиной
- •4.3.2. Вычислительная машина с двумя видами шин
- •4.3.3. Вычислительная машина с тремя видами шин
- •4.4. Физическая реализация шин
- •4.4.1. Механические аспекты
- •4.4.2. Электрические аспекты
- •4.5. Распределение линий шины
- •4.6. Выделенные и мультиплексируемые линии
- •4.7. Арбитраж шин
- •4.7.1. Схемы приоритетов
- •4.7.2. Схемы арбитража
- •4.8. Основные интерфейсы современных вм на базе архитектуры ia-32
- •4.8.1. Интерфейс pci
- •4.8.2. Порт agp
- •4.8.3. Pci Express
- •Глава 5. Системы ввода/вывода. Организация обмена в вычислительной системе
- •5.1. Основные функции модуля ввода-вывода
- •5.1.1. Локализация данных
- •5.1.2. Управление и синхронизация
- •5.1.3. Обмен информацией
- •5.2. Методы управления вводом/выводом
- •5.3. Система прерываний и исключений в архитектуре ia-32
- •5.4. Расширенный программируемый контроллер прерываний (apic)
- •Глава 6. Основные направления в архитектуре процессоров
- •6.1. Конвейеризация вычислений
- •6.1.1. Синхронные линейные конвейеры
- •6.1.2. Метрики эффективности конвейеров
- •6.1.3. Нелинейные конвейеры
- •6.2. Конвейер команд
- •6.3. Конфликты в конвейере команд
- •6.4. Методы решения проблемы условного перехода
- •6.5. Предсказание переходов
- •6.5.1. Статическое предсказание переходов
- •6.5.2. Динамическое предсказание переходов
- •6.6. Суперконвейерные процессоры
- •6.7. Архитектуры с полным и сокращенным набором команд
- •6.8. Основные черты risc-архитектуры
- •6.9. Преимущества и недостатки risc
- •6.10. Суперскалярные процессоры
- •Лабораторная работа №4. Исполнительные устройства вм
- •Глава 7. Подсистема памяти
- •7.1. Характеристики систем памяти
- •7.2. Иерархия запоминающих устройств
- •7.3. Основная память
- •7.4. Блочная организация основной памяти
- •7.5. Организация микросхем памяти
- •7.6. Синхронные и асинхронные запоминающие устройства
- •7.7. Оперативные запоминающие устройства
- •7.8 Статическая и динамическая оперативная память
- •7.9. Статические оперативные запоминающие устройства
- •7.10. Динамические оперативные запоминающие устройства
- •Лабораторная работа №5. Расширенная работа с памятью и передача управления в программе
- •Глава 8. Внешние накопители
- •8.1. Магнитные диски
- •8.1.1. Организация данных и форматирование
- •8.1.2. Внутреннее устройство дисковых систем
- •8.2. Массивы магнитных дисков с избыточностью
- •8.2.1. Концепция массива с избыточностью
- •8.2.2. Повышение производительности дисковой подсистемы
- •8.2.3. Повышение отказоустойчивости дисковой подсистемы
- •8.2.4. Raid уровня 0
- •8.2.5. Raid уровня 1
- •8.2.6. Raid уровня 2
- •8.2.7. Raid уровня 3
- •8.2.8. Raid уровня 4
- •8.2.9. Raid уровня 5
- •8.2.10. Raid уровня 6
- •8.2.11. Raid уровня 7
- •8.2.12. Raid уровня 10
- •8.2.13. Raid уровня 53
- •8.2.14. Особенности реализации raid-систем
- •8.3. Оптическая память
- •Контрольные вопросы
- •Глава 9. Основы параллельных вычислений
- •9.1. Уровни параллелизма
- •9.1.1. Параллелизм уровня задания
- •9.1.2. Параллелизм уровня программ
- •9.1.3. Параллелизм уровня команд
- •9.2. Метрики параллельных вычислений
- •9.2.1. Профиль параллелизма программы
- •9.2.2. Ускорение, эффективность, загрузка и качество
- •9.3. Закон Амдала
- •9.4. Закон Густафсона
- •9.5. Классификация параллельных вычислительных систем. Классификация Флинна
- •Контрольные вопросы
- •Глава 10. Архитектура многопроцессорных систем
- •Классификация многопроцессорных систем
- •Организация коммуникационной среды в системах с разделяемой памятью.
- •Когерентность кэш- памяти в smp- системах.
- •Когерентность кэш- памяти в mpp-системах.
- •Организация прерываний в мультипроцессорных системах.
- •Заключение
- •Библиографический список
Контрольные вопросы
Какие характеристики вычислительной машины охватывает понятие «архитектура системы команд»?
Какие особенности аккумуляторной архитектуры можно считать ее достоинствами и недостатками?
Какие доводы можно привести за и против увеличения числа регистров общего назначения в ВМ с регистровой архитектурой системы команд?
Какие факторы определяют выбор формата команд?
Какая особенность фон-неймановской архитектуры позволяет отказаться от указания в команде адреса очередной команды?
С какими ограничениями связано использование непосредственной адресации?
В каких случаях может быть удобна многоуровневая косвенная адресация?
В чем проявляются сходства и различия между базовой и индексной адресацией?
Каким образом можно охарактеризовать производительность вычислительной машины?
Что понимается под номинальным и средним быстродействием ВМ?
Глава 3. Программная модель процессора на примере Intel i8086
3.1. Программная архитектура i80х86
Одним из наиболее распространенных процессоров общего назначения на данный момент являются процессоры с архитектурой x86 (Intel IA-32). Родоначальником семейства этих процессоров явился ЦП i8086. И по сей день современные x86-совместимые процессоры могут исполнять код, который мог выполняться на ЦП i8086. Обеспечивается это за счёт обратной совместимости на ровне программной модели.
Совокупность архитектурных решений, архитектуру команд и правила написания программ на низкоуровневом языке принято называть программной моделью процессора. Поскольку, написание в машинных командах представляется крайне трудоёмкой задачей, вместо машинного языка при написании программ используют язык ассемблера. Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи (мнемокод) команд и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данныx через метки с символьными именами (при ассемблировании для каждой метки высчитывается адрес, после чего каждое вхождение метки заменяется на этот адрес) и директивы. Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера. В дальнейшем условимся язык ассемблера также рассматривать как часть программной модели ЦП.
При выполнении любой программы в любой момент времени можно выделить несколько участков памяти (сегментов), с которыми происходит работа микропроцессора. Использование сегментов является отличительной особенностью микропроцессоров семейства I80х86 и преследовало несколько целей. Во-первых, использование сегментов является попыткой защитить или, по крайней мере, изолировать несвязные участки памяти в самой программе или между программами. Во-вторых, программа будет выполняться, если изменить только адрес начала сегмента (перенося его в памяти в другое место) и не менять относительное смещение в нем. Это позволяет, при необходимости, переносить программу в памяти даже в процессе ее выполнения. Возможности сегментации памяти существенно превышают возможный размер физической памяти, используемой в микропроцессоре. В некоторых ситуациях использовать сегментацию памяти нецелесообразно, поэтому в старших моделях микропроцессора (начиная с I80386) можно работать с сегментами памяти длиной до 4 Гбайт, т.е. вся доступная физическая память рассматривается как один сегмент. В реальном режиме работы микропроцессора любая программа, оперирует с четырьмя сегментами:
Сегмент кода.
Сегмент данных.
Сегмент стека.
Сегмент дополнительных данных.
Эти сегменты могут располагаться в памяти по отношению друг к другу как угодно, никаких ограничений на их расположение не вводятся. Например, все сегменты могут начинаться с одного и того же адреса, и таким образом они перекрываются друг с другом. Сегменты могут располагаться непосредственно друг за другом в памяти без перекрытия или же между ними могут быть пустые промежутки.
Сегмент кода.
В сегменте кода обычно записываются команды микропроцессора, которые выполняются последовательно друг за другом. Для определения адреса следующей команды после выполнения предыдущей используются два регистра – CS (регистр сегмента кода, содержит начальный адрес этого сегмента) и IР (регистр указателя команд, содержит смещение текущей команды относительно начала этого сегмента). Начальные значения регистров CS и IP загружаются операционной системой в начале выполнения программы, в процессе выполнения команд содержимое IP автоматически изменяется. Если изменить содержимое CS и/или IP, то выполнение программы продолжится с нового адреса. Однако изменить эти регистры явным образом невозможно, это можно сделать при выполнении некоторых команд (например, команды безусловного перехода или вызова подпрограммы).
В сегменте кода можно также описывать данные, однако это целесообразно делать в обоснованных случаях, например, в программах обработки прерываний.
Переменные в программе.
Во всех остальных сегментах выделяется место для переменных, используемых в программе. Разделение на сегменты данных, сегмент стека и сегмент дополнительных данных связано с тем, что в таких сегментах хранятся переменные, имеющие различные свойства.
Переменные в программе можно разбить на две большие группы. Во-первых, переменные, явно применяемые в программе исходя из ее логики, обычно такие переменные имеют имена и предназначены для хранения данных, имеющих предопределенный смысл (например, переменная для хранения кода нажатой клавиши при организации диалога с пользователем). Во-вторых, в программе очень часто необходимо иметь место для хранения временных данных (например, для хранения адреса возврата из подпрограммы, для хранения параметров некоторой процедуры или локальных переменных, используемых в подпрограммах). Можно, конечно, выделять таким переменным память так же, как и обычным, однако это приводит к существенному усложнению логики выполнения программы. Поэтому во всех микропроцессорах есть средства для хранения временных данных (во всяком случае для хранения временных переменных, нужных для организации работы подпрограмм). В микропроцессорах семейства i80х86 для хранения данных выделяется два сегмента – сегмент данных и сегмент стека.
Сегмент данных.
Сегмент данных предназначен для хранения переменных, определяемых программистом. Для определения адреса начала сегмента данных используется сегментный регистр DS. Для определения другой компоненты адреса (относительного смещения в данном сегменте) в языке ассемблера предполагается несколько способов, количество которых больше, чем количество способов для определения адреса команды, что обеспечивает большую гибкость при написании программ.
Сегмент стека.
Для хранения временных значений, для которых нецелесообразно выделять переменные, предназначена специальная область памяти, называемая стеком. Для адресации такой области служит сегментный регистр SS (в котором хранится начальный адрес этого сегмента памяти) и регистр указателя стека SP (для хранения смещения по отношению к началу этого сегмента).
В отличие от сегмента данных и кода, в которых можно явно адресовать любую ячейку памяти (например, используя метки или имена переменных – т.е. их адреса), в сегменте стека обычно регистры SS и SP используются неявно, автоматически изменяя свои значения при выполнении тех или иных команд. Стек обычно используется для временного хранения адресов возврата из подпрограмм или прерываний (для того, чтобы можно было продолжить выполнение программы с прерванной точки). Кроме того, в стеке удобно сохранять, а потом из стека восстанавливать значения некоторых регистров, если они могут измениться при выполнении некоторых действий (например, перед вызовом функций операционной системы или в начале программы обработки прерываний). И, наконец, используя стек, можно легко передавать аргументы подпрограммам и в стеке можно организовывать локальные переменные (такой подход используется во всех языках высокого уровня).