Глобальные переменные
Описанная выше схема регистровых окон обеспечивает эффективную работу с локальными скалярными переменными процедур. Однако она никак не учитывает необходимость обработки глобальных переменных, к которым обращаются несколько процедур.
Существует два подхода к обработке глобальных переменных. Первый подход, который совершенно очевиден, состоит в том, что для переменных, объявленных в исходном тексте программы на языке высокого уровня как глобальные, компилятор резервирует определенные ячейки в оперативной памяти, и все команды обращения к глобальным переменным используют режимы адресации, работающие с оперативной памятью, а не с регистрами. Однако для обработки часто используемых в программе глобальных переменных такой подход не эффективен.
Альтернативный подход состоит в том, чтобы включить в состав процессора специальную группу регистров для размещения таких часто используемых глобальных переменных. Эти регистры должны иметь фиксированные номера, и доступ к ним должен быть открыт из любой процедуры. Для упрощения формата машинных команд при этом можно использовать унифицированную схему нумерации регистров. Например, номера от 0 до 7 присваиваются регистрам глобальных переменных, а номера от 8 до 31 — регистрам в составе регистровых окон, т.е. фактически эти номера представляют собой смещение относительно значения указателя текущего окна. Конечно, использование регистров для хранения глобальных переменных несколько усложняет схему адресации регистров в процессоре, и, к тому же, компилятор должен решать, какие именно глобальные переменные имеет смысл размещать в этих регистрах, а какие хранить в ячейках памяти.
Большой набор регистров или кэш-память?
Большой набор регистров в составе процессора, организованный по схеме регистровых окон, фактически функционирует как сверхбыстродействующий буфер для хранения подмножества переменных, к которым чаще всего приходится обращаться в процессе выполнения текущего фрагмента программы. С этой точки зрения функции набора регистров во многом схожи с функциями кэш-памяти. Поэтому возникает естественный вопрос, а не проще ли будет использовать традиционную схему с кэш-памятью и небольшим набором регистров?
В табл.13.1 приведены сравнительные характеристики этих двух подходов.
Таблица 13.1.
Набор регистровых окон | Кэш-память |
Все локальные скалярные переменные текущих процедур | Последние по времени обращения скалярные переменные |
Отдельные переменные | Блоки оперативной памяти |
Глобальные переменные, определенные компилятором | Последние по времени обращения глобальные переменные |
Сохранение данных в памяти и их восстановление основано на глубине вложенности процедур | Сохранение данных в памяти и их восстановление основано на алгоритме обновления кэш-памяти |
Регистровая адресация | Адресация ячеек памяти |
Набор регистровых окон позволяет хранить все локальные скалярные переменные (N-1) текущих процедур (или, по крайней мере, подавляющее большинство таких переменных) в регистрах процессора. В кэш-памяти хранятся последние по времени обращения скалярные переменные. Поэтому регистровые окна обеспечивают более быстрый доступ к переменным — все необходимые переменные постоянно находятся "под рукой". Тем не менее, кэш-память обеспечивает более эффективное использование пространства памяти, поскольку при его заполнении учитывается динамически изменяющаяся ситуация.
При работе с набором регистровых окон вполне вероятно, что не все регистры окна будут использованы, поскольку отдельным процедурам не нужно столько локальных переменных. Но информация, хранящаяся к кэш-памяти, также обладает определенной избыточностью, поскольку считывание данных в кэш из оперативной памяти производится блоками, и отнюдь не все ячейки в составе блока могут понадобиться при выполнении текущего фрагмента программы.
Глобальные переменные хранятся в кэш-памяти точно так же, как и локальные. Обычно в программах имеется довольно много глобальных переменных, но далеко не ко всем из них программа обращается очень часто. Механизм работы с кэш-памятью отслеживает динамическую ситуацию, и в результате в кэш-памяти оказываются именно те глобальные переменные, к которым чаще всего производится обращение. При использовании регистров для хранения глобальных переменных вся ответственность за отбор именно тех из них, к которым программа будет чаще всего обращаться, возлагается на компилятор.
Механизм сохранения/восстановления данных в регистровых окнах работает на основе текущей глубины вложенности процедур. Поскольку глубина вложенности, как правило, изменяется в весьма узком диапазоне, к оперативной памяти этот механизм обращается довольно редко. В большинстве схем организации кэш-памяти используется секционированный ассоциативный метод отображения с малым размером секции. Поэтому существует опасность, что другие данные или машинные команды вытеснят из кэш-памяти нужные переменные.
Из всего сказанного следует, что ни одному из обсуждаемых принципов организации процессора нельзя безоговорочно отдать предпочтение. Но существует одна характеристика, по которой схема с регистровыми окнами имеет неоспоримое преимущество в быстродействии перед схемой с кэш-памятью. Речь идет о накладных расходах, связанных с определением адресов операндов.
Для обращения к локальной скалярной переменной в наборе регистров, организованном в виде множества регистровых окон, достаточно передать "виртуальный" номер соответствующего регистра и номер используемого окна. Эти данные поступают на довольно простой дешифратор, который выбирает нужный регистр в наборе.
Для того чтобы обратиться к переменной в кэш-памяти, нужно сформировать полноразмерный виртуальный адрес оперативной памяти, который необходимо затем преобразовать в физический адрес оперативной памяти. Сложность этой операции зависит от способа адресации, структуры модуля преобразования виртуальных адресов в физические адреса, его объема. В кэш-памяти с секционированным ассоциативным методом отображения часть кода адреса используется для считывания количества слов и тэгов, соответствующего размеру секции. Другая часть адреса сравнивается с тэгами, и выбирается одно из прочитанных слов. Совершенно очевидно, что каким бы быстродействующим не был блок кэш-памяти, время доступа к данным при таком способе поиска значительно больше, чем при работе с регистровыми окнами. Следовательно, с точки зрения производительности обработки локальных скалярных переменных схема с регистровыми окнами имеет несомненное преимущество. Но регистровые окна желательно сочетать с использованием кэш-памяти для хранения команд.
Контрольные вопросы
1. Назовите основные подсистемы процессора
2. Какие регистры относят к программно доступным?
3. Какие функции выполняют регистры общего назначения?
4. Какая разрядность регистров общего назначения?
5. Сколько регистров общего назначения?
6. Какие функции выполняют регистры управления и состояния?
7. Какие методы используются для повышения эффективности использования регистров?
8. Что такое регистровые окна?
Дата добавления: 2015-09-29; просмотров: 1055;