Регистровые окна
Включение в состав процессора большого количества регистров должно привести к снижению частоты обращения к оперативной памяти в ходе выполнения программы. Но само по себе большое количество регистров в процессоре еще не решает задачу. Необходимо так организовать совместную работу аппаратных средств процессора, чтобы регистры использовались наиболее эффективно.
Поскольку большинство операндов машинных команд представляет собой локальные скалярные переменные, то логично было бы держать эти переменные в регистрах. Для хранения небольшого числа часто используемых глобальных переменных также целесообразно было бы выделить необходимое количество регистров.
Проблема состоит в том, что определение "локальности" переменной изменяется при каждом вызове очередной процедуры или возврате из нее, а эти операции выполняются в ходе работы программы очень часто. При использовании стека при каждом вызове процедуры локальные переменные вызывающей программы (которая, в свою очередь, может быть процедурой по отношению к запустившей ее программе) должны пересылаться из регистров в стек, который находится в оперативной памяти, чтобы освободить регистры для локальных переменных вызываемой процедуры. Кроме того, в вызываемую процедуру требуется еще передать и параметры вызова. При возврате из процедуры следует, во-первых, восстановить в регистрах сохраненные в стеке (в памяти) переменные, а во-вторых, передать в вызывающую программу результаты выполнения завершенной процедуры.
Для эффективного решения этой проблемы в процессоре, имеющем в своем составе значительное число регистров, необходимо ответить на несколько вопросов:
какое распределение числа локальных переменных в процедурах;
какое распределение числа передаваемых параметров и возвращаемых результатов;
какое распределение вложенности вызовов процедур.
Результаты исследования значительного числа программ показали, что:
в типичной процедуре используется весьма небольшое количество локальных переменных;
при вызове процедуре передается, как правило, всего несколько параметров;
размер возвращаемых результатов также невелик;
глубина вложенности вызовов в типичной процедуре изменяется в весьма узких пределах.
Учитывая эти особенности типичных программ, было предложено разделить весь набор регистров процессора на ряд небольших групп — регистровых окон (register window). Каждое регистровое окно в процессе выполнения программы будет связываться с определенной процедурой. При вызове очередной процедуры вместо того, чтобы пересылать содержимое регистров в оперативную память и записывать в них локальные переменные и параметры вызова, процессор может автоматически переключаться на использование регистрового окна, связываемого с новой процедурой. Если регистровые окна вложенных процедур будут частично перекрываются, т.е. некоторые регистры будут входить в состав двух соседних регистровых окон, то это обеспечит автоматическую передачу параметров в вызываемую процедуру и возврат результатов в вызывающую процедуру.
Описанная концепция иллюстрируется схемой, приведенной на рис. 13.1.
Рис. 13.1 Перекрывающиеся регистровые окна
В любой момент времени в ходе выполнения программы процессор "видит" только одно регистровое окно и обращается к регистрам, которые входят в него, так, как если бы они были единственными регистрами процессора (т.е. имели адреса от 0 до N-1).
Регистровое окно делится на три области фиксированного размера.
Область регистров параметров содержит параметры вызова процедуры, которые формируются вызывающей программой, и результаты выполнения процедуры, которые возвращаются вызывающей программе.
Область локальных регистров используется для хранения локальных переменных процедуры. Назначение каждого из регистров определенной переменной в этой области производится компилятором.
Область временных регистров используется для передачи параметров и приема результатов из процедуры следующего уровня вложенности, т.е. процедуры, вызываемой данной процедурой. Область временных регистров окна одного уровня физически представляет те же регистры, что и область регистров параметров окна следующего уровня. Такое перекрытие окон позволяет передавать в процедуру параметры, не выполняя при этом операций пересылки данных.
Чтобы такую схему разделения регистров процессора можно было использовать при любой последовательности вызовов/возвратов, возможной в реальных программах, количество регистровых окон не должно ограничиваться. Поскольку физически это реализовать невозможно, регистровые окна применяются для работы с несколькими последними по уровню вложенности процедурами. Данные, касающиеся процедур меньшего уровня вложенности, должны при этом сохраняться в оперативной памяти. Они переписываются в высвобождающиеся регистровые окна при понижении уровня вложенности текущей выполняемой процедуры. Таким образом, в процессоре перекрывающиеся регистровые окна имеют такую же организацию, как и кольцевой буфер данных.
При использовании набора из N регистровых окон, они обеспечивают обработку (N-1)вложенных вызовов процедур. Значение N может быть довольно небольшим. В ряде работ было показано, что при использовании восьми окон сохранять в оперативной памяти и восстанавливать из нее содержимое регистрового окна приходится при выполнении только 1% всех операций вызова и возврата из процедур.
Дата добавления: 2015-09-29; просмотров: 1435;