Регистровые окна ( register window )

Один из способов решения проблемы вложенных процедур – регистровые окна.

В компьютере имеется k физических регистров. Система команд машины предоставляет l регистров общего назначения, l различных регистровых окна. Каждый из l регистров отображается на k физических регистров. В каждый момент времени программа работает с одним регистровым окном.

Каждое регистровое окно делится на части:

а) область регистров, использующихся для получения и передачи параметров из\в внешние подпрограммы.

Б) область локальных регистров подпрограмм

В)область временных регистров

Возможна кольцевая схема организации регистровых окон.

При вызове подпрограммы происходит переключение текущего регистрового окно на следующее регистровое окно, при этом возможно пересечение 3-тей части текущего окна с первой частью последующего окна. Этим достигается, во-первых, практически автоматическая передача и прием параметров, во-вторых, всегда создается новый комплект локальных регистров, которые присутствуют в программе.

Рассмотрим, что происходит при непосредственной работе:

Обращаемся к 1-й программе, ей выделяется 0-е регистровое окно. Дальше пошли в глубину на 2-й уровень, выделилось 1-е регистровое окно и т.д. до тех пор, пока не дошли до последнего. Что будет, когда этот круг обойдем? Начинается откачка этих окон в ОП. Эта схема гарантирует эффективную работу программ с вложенностью не более фиксированного, если вложенность больше, то возникают проблемы, но все равно начинается работа с КЭШем и мы все равно не опускаемся на уровень общения с ОП. Соответственно система может иметь специальный регистр-указатель текущего окна и указатель сохраненного окна.

При обращении в функцию происходят следующие действия:

Увеличиваем указатель текущего окна на единичку по модулю N.

Сравниваем, получилось ли: (указатель на новое содержимое текущего окна) = (указатель на сохраненное окно), если получилось, то мы дошли до ситуации, в которой пытаемся обратиться за окном, которое уже занято, т.е. пошли по второму кругу этого цикла. Происходит прерывание. Мы откачиваем в память текущее окно, после этого меняем указатель на сохраненное окно и используем освобожденное текущее окно, так новое. Если не равно, то идем на «Использование окна CWP, вызов функции».

При выходе из функции мы начинаем действовать в следующим образом:

- Сначала уменьшаем модулю,

- Сравнивает полученный результат с указанием сохраненных, если он равен, то это означает, что мы сохраняли это окно. Происходит прерывание, мы восстанавливаем это окно, мы соответственно уменьшаем этот указатель и продолжаем выполнение, если не равен, это означает, что это окно у нас не сохранялось и мы просто переходим на «Продолжение выполнения» (проталкиваем туда).

Рассмотрим пример:

Main –программа, которая изначально имеет некоторое состояние 0. Т.е. у нас 2 регистровых окна. 0-е регистровое окно принадлежит программе Main, 1-е – свободное. Если количество операций выхода из функции будет больше, чем количество обращений, то возникнут проблемы. Рассмотрим, что происходит при (ложном) обращении к таким функциям.

  1. Мы обратились к функции А1, согласно алгоритму текущее окно будет первым, сохраненное остается нулевым.
  2. Обратились к А2, увеличили текущий указатель по модулю 2, и получили, что он стал равным нулю. Равный нулю, равен указателю нулевого (сохраненного). Это означает, что мы обратились к окну, которое занято. Происходит то, что окно, которое было main, выталкивается, его место занимает функция А2, ну и указатель SWP становится равным единичке.
  3. Обратились к функция А3. Увеличили текущий на 1. И получили опять совпадение – «занято». Вытолкнули А1 и изменили и т.д.

Есть такой процессор Itanium – это 64-х разрядный процессор. В нем используется модель, в которой считается, что регистровое окно, доступное программе в каждый момент, состоит из 128 регистров общего назначения. Соответственно 32 регистра – это статические регистры, которые остаются всегда неизменными, оставшиеся регистры (96)– динамические (виртуальные), т.е. которые отображаются на кольцевой список физических регистров. Размер этого кольцевого списка может варьироваться от … и до…. «Динамическое» окно– можно заказать окно произвольного размера (от регистра GR32 до регистра GR32+N (N=0,..,95).

Происходит оптимизация работы с физическими регистрами


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: