Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры к ГОСАМ (все билеты).doc
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
2 Мб
Скачать
☆

Особенности архитектуры Alpha компании dec

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

Первым на рынке появился 64-разрядный микропроцессор Alpha (DECchip 21064). Он представляет собой RISC-процессор в однокристальном исполнении, в состав которого входят устройства целочисленной и плавающей арифметики, а также кэш-память емкостью 16 Кб. Кристалл проектировался с учетом реализации передовых методов увеличения производительности, включая конвейерную организацию всех функциональных устройств, одновременную выдачу нескольких команд для выполнения, а также средства организации симметричной многопроцессорной обработки.

В кристалле имеются два регистровых файла по 32 64-битовых регистра: один – для целых чисел, второй – для чисел с плавающей точкой. Для обеспечения совместимости с архитектурами MIPS и VAX архитектура Alpha поддерживает арифметику с одинарной и двойной точностью как в соответствии со стандартом IEEE 754, так и в соответствии с внутренним для компании стандартом арифметики VAX.

В конце 1993 г. появилась модернизированная версия кристалла – модель 21064А, имеющая на кристалле кэш-память удвоенного объема и работающая с тактовой частотой 275 МГц.

Затем были выпущены модели 21066 и 21068, оперирующие на частоте 166 и 66 МГц. Отличительной особенностью этой ветви процессоров Alpha является реализация на кристалле шины PCI. Отличительная особенность модели 21068 – низкая потребляемая мощность (около 8 Вт). Основное предназначение этих двух новых моделей – персональные компьютеры и одноплатные ЭВМ.

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

Рис. 4.9. Пример построения системы на базе микропроцессора Alpha 21066

3. Обработка исключительных ситуаций. Обработка исключений в языку С: Использование assert; исключения и стек, длинные переходы; Ошибки сопроцессора, функция signal; Ошибки математической библиотеки, функция matherr. управление исключениями языка С++; использование ключевых слов try, catch, throw.Некоторые особенности обработки исключений. Спецификации исключений.

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

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

Простейший способ обнаружения ошибок - использование макроса assert(int). Параметром макроса является выражение, при равенстве которого 0 макрос выводит в стандартный поток ошибок stderr сообщение об имени файла и строке, в которой произошла ошибка, а затем вызывает функцию abort, завершающую выполнение программы. Использовать этот макрос рекомендуется при вызове функций, результат которых критичен для дальнейшего выполнения программы.

Еще один инструмент для работы с исключительными ситуациями - длинные переходы. Этот механизм позволяет возобновить выполнение программы с любого заранее определенного момента. Для этого сначала необходимо сделать "слепок" содержимого основных регистров процессора с помощью команды int setjmp(jmp_buf). Структура jmp_buf хранит значения регистров, необходимых для возобновления выполнения с данной позиции программы. Чтобы это сделать, необходимо вызвать функцию longjmp(jmp_buf). Нужно быть осторожным при использовании этого механизма в программах, использующих оверлеи, так как при этом возможна замена стека и как следствие - непредсказуемая работа программы после вызова longjmp

Рассмотрим подробнее процессы, происходящие при возникновении исключительной ситуации в С. После возникновения такой ситуации в системной переменной errno устанавливается значение, соответствующее возникшей ситуации, после чего вызывается обработчик соответствующего исключения. Это происходит посредством посылки определенного сигнала. Обработчики сигналов по умолчанию обычно выдают сообщение о возникшей ошибке и завершают программу. Можно установить собственный обработчик сигнала с помощью функции signal, параметрами которой являются номер сигнала и указатель на функцию - новый обработчик сигнала. При поступлении определенного сигнала будет вызываться нужный обработчик. Послать программе сигнал принудительно можно с помощью функции raise(int).

Для ошибок, возникающих при математических операциях, предусмотрен специальный механизм. Можно переопределить функцию int matherr(struct exception), которая вызывается при возникновении какой-либо исключительной ситуации во время арифметических вычислений. Из структуры exception можно узнать тип возникшего исключения и операнды. Здесь же можно изменить результат математической операции. Если функция успешно справилась с возникшей ситуацией, она должна вернуть ненулевое значение. В противном случае работа программы завершится с выдачей сообщения об ошибке. Необходимо отметить, что с помощью этой функции можно обработать такие исключения, как переполнение, извлечение корня из отрицательного числа и т.д. Исключения математического сопроцессора, такие как деление на 0, с помощью matherr обработать невозможно, для этого надо использовать функцию signal.

Язык C++ предоставляет более гибкий механизм обработки исключительных ситуаций. Блок кода, который потенциально может вызвать исключительную ситуацию, помещается в контейнер try. За ним следуют блоки обработки исключения - контейнеры catch(exception), содержащие обработчики для соответствующего исключения Блоки catch идут один за другим, и выполняется тот, для которого exception соответствует возникшему исключению. Происходит это так: при возникновении исключительной ситуации внутри блока try работа программы приостанавливается и происходит поиск соответствующего исключению обработчика catch. Если таковой не найден, работа программы завершается, в обратном случае выполняется код соответствующего обработчика и управление передается коду, следующему за конструкцией try-catch. Чтобы обработать любое возникшее исключение, используется конструкция catch(...).

Сгенерировать исключение можно при помощи функции throw(exception).

Билет 26