
Лекция 10
5. Уровень системы команд
На разработку этого уровня архитектуры влияют две противоборствующие тенденции: достижение прогресса (применение новых технологий) и сохранение обратной совместимости. Под обратной совместимостью подразумевается способность новой машины выполнять старые программы.
Большое значение имеют также принципы построения системы команд в рамках данной технологии. Это сказывается как на вычислительных возможностях, так и стоимости компьютеров. Производительность эквивалентных машин с различными уровнями команд может различаться на 25%. Поэтому важно понимать принципы разработки этого уровня.
Существуют два основных фактора, определяющих хорошую архитектуру команд. С одной стороны, набор команд должен эффективно реализовываться в современной и будущей технике. Это приводит к рентабельным разработкам на несколько поколений. С другой, набор команд обязан полно и непротиворечиво обеспечивать потребности высокоуровневого программного обеспечения. Другими словами, процесс получения оттранслированной программы должен быть реализуемым и недвусмысленным.
5.1. Общий обзор уровня команд
Составляющими уровня команд являются: модель памяти, регистры, типы данных, команды. Часто на уровне команд имеется также два режима их выполнения. Привилегированный режим предназначен для работы операционной системы и предоставляет полный доступ к системе команд. Пользовательский режим используется для запуска обычных приложений. В этом режиме недоступны некоторые возможности процессора. Он не позволяет выполнять ряд команд (обращения к кэш-памяти, прямая работа с внешними устройствами), в нем недоступны некоторые регистры (системные) и т. п. Данный раздел посвящен в основном обзору возможностей пользовательского режима.
5.1.1. Модели памяти
Во всех компьютерах память разделена на ячейки, имеющие последовательные номера (адреса). В настоящее время наиболее распространенной ячейкой является байт - 8 двоичных разрядов (битов). Изначально это можно объяснить тем, что 8 - это минимальная степень двойки, подходящая для хранения общеупотребительных наборов символов (например, ASCII). Вполне возможно, что в связи с доминированием UNICODE в будущем минимальная ячейка станет 16-разрядной.
Байты обычно группируются в 2, 4 или 8 - байтные слова, которыми манипулируют команды. Многие архитектуры требуют, чтобы слова были выровнены на их целочисленную границу. Например, 4-байтовое слово должно начинаться с адреса, кратного 4. Такая память более эффективна как с точки зрения быстродействия, так и сложности и стоимости микросхем.
Большинство современных машин имеют
единое линейное адресное пространство,
от 0 до некоторого максимума (например,
или
).
Некоторые компьютеры поддерживают
раздельные адресные пространства для
команд и данных. Такая система гораздо
сложнее, но имеет два преимущества.
Во-первых, появляется возможность
32-битной адресации к
байтам для программы и такому же
количеству данных. Во-вторых, из программы
можно делать запись только в область
данных, поэтому случайная перезапись
программы становится невозможной. Это
устраняет один из распространенных
источников программных сбоев.
Еще один аспект модели памяти - ее семантика. При разработке моделей памяти возникает ряд проблем, связанных с современной компьютерной архитектурой. Во-первых, это вызвано переупорядочиванием микрокоманд. В результате есть опасность того, что память будет действовать не так, как ожидается. Например, команда LOAD может возвратить из ячейки не то значение, которое сохранит предшествующая ей STORE. Во-вторых, при наличии мультипроцессора каждый процессор посылает разделяемой памяти поток запросов чтения/записи, которые также могут подвергаться переупорядочиванию.
Возможны два кардинальных решения подобных проблем. Все запросы к памяти могут быть синхронизированы в последовательности так, чтобы каждый завершался до того как начнется следующий. Такая стратегия очень вредит производительности, но дает простейшую семантику памяти - все операции выполняются в строгом программном порядке. Вторая крайность - вообще не давать никаких гарантий последовательности выполнения запросов к памяти. Чтобы упорядочивать обращения к памяти, программа сама должна выполнять команду SYNC, блокирующую запуск новых операций памяти, пока предыдущие не будут завершены. Эта идея существенно затрудняет разработку компиляторов, зато дает свободу разработчикам аппаратуры в плане оптимизации памяти.
Имеются также промежуточные варианты решения. В частности, аппаратное обеспечение может автоматически блокировать запуск лишь определенных операций с памятью (например, находящихся в RAW-взаимозависимости), в то время как запуск других операций не блокируется. Такие подходы более равномерно распределяют сложности разработки между аппаратурой и системным ПО. Именно им в настоящее время отдается предпочтение.