ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2021

Просмотров: 146

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Имеющиеся в системе UltraSPARC II регистры с плавающей точкой могут содержать 32-битные (одинарная точность) или 64-битные (двойная точность) значения. Возможно также использование пар этих регистров для поддержки 128-битных значений.

Архитектура UltraSPARC II - архитектура загрузки/сохранения. Единственные операции непосредственного обращения к памяти в ней - это команды LOAD (загрузка) и STORE (сохранение). Все операнды арифметических и ло­гических команд берутся из регистров или предоставляются самой ко­мандой, и все результаты сохраняются в регистрах.


5.1.3.3. Особенности уровня команд JVM


Уровень команд машины JVM необычен, но достаточно прост. Это 32-разрядная машина, ее память можно рассматривать как массив 4 294 967 296 байтов (4 Гбайт) либо как массив 1 073 741 824 из 4-байтных слов. Порядок байтов в слове – прямой.

Память содержит 4 основные области: набор констант, фрейм локальных переменных, стек операндов и область процедур. На эти области указывают соответственно регистры СРР (Constant Pool Pointer), LV (Local Variable), SP (Stack Pointer) и PC (Program Counter) или их аналоги. Доступ к памяти осуществляется только по смещению от одного из этих регистров; указатели и абсолютные адреса памяти не используются. Другими словами, виртуальная машина Java не совершает об­ращений к памяти, видимых на уровне команд. Отсутствие указателей для доступа к данным не случайно. Это нужно для безопасности при загрузке двоичных программ из Интернета и их выполнении.

Область набор констант загружается один раз при загрузке программы (или объекта) и после этого не меняется. Фрейм локальных переменных предназначен для хранения переменных во время выполнения процедуры. В его начале располагаются параметры процедуры. Очевидно, содержимое LV меняется при вызове процедур. Стек операндов содержит операнды и результаты выполняемых команд. Его размер не должен превышать определенного предела, который заранее вычисляется компилятором Java. В от­личие от регистров СРР и LV, указатель стека операндов меняется во время выполнения процедуры, поскольку операнды команд помещаются в стек и выталкиваются из него. Область процедур содер­жит выполняющуюся программу. Ее указатель называется счетчиком команд.

Область процедур представляет собой массив байтов, в то время как предыдущие участки памяти считаются массивами слов. Например, LV, LV+1 и LV+2 указывают на первые три слова из фрейма ло­кальных переменных. Смещения для индексирова­ния рассмотренных областей ограничиваются 16 битами. Поэтому ни одна из областей памяти JVM не может быть большой – они ограничены величиной 64 Кбайт.

Область локальных переменных меняется с каждой процедурой, поэтому каж­дая вызываемая процедура имеет собственные 64 Кбайт для своих локальных пе­ременных. Точно так же набор констант распространяется только на определенный Java-класс, поэтому каждый из них имеет собственные 64 Кбайт.


В JVM не предусмотрено статического места для больших массивов и других структур данных, на­пример списков и деревьев. Именно поэтому в JVM имеется дополнительная область памяти – “куча” (Heep), специально предназначенная для хранения динамических объектов. При выполнении инструкции


int a[] = new int [4096];


вызывается распределитель памяти, который определяет место в “куче” и возвращает его указатель. Таким образом, указатели в JVM используются, но программисты не могут непосредственно манипулировать ими.

Когда специальная система определяет, что “куча” почти заполнилась, она вызывает программу чистки памяти (сборщик мусора), кото­рая ищет и освобождает ненужные объекты. Для этого применяется сложный алгоритм.

JVM не содержит регистров общего назначения, которые могут загружаться или сохраняться пользовательской программой. В машине picoJava II имеются 25 32-битных регистров. Четыре из них по функциям соответствуют вышеупомянутым PC, LV, SP и СРР. Регистр OPLIM содержит определенное предельное значение для SP. Если значение SP вы­ходит за пределы OPLIM, то происходит прерывание. Регистр FRAME отмечает конец фрейма локальных переменных и указывает на слово, которое содержит счетчик команд вызывающей процедуры.

Среди других регистров можно упомянуть слово состояния программы - это ре­гистр, который следит, насколько заполнен 64-регистровый стековый кэш, и четы­ре регистра, которые используются для управления потоком выполнения. Кроме того, суще­ствуют 4 регистра для ловушек и прерываний и 4 регистра для вызова процедур и возвращения значений в командах, полученных трасляцией с С и C++ (они поддерживаются picoJava, но не JVM). PicoJava II не имеет виртуальной памяти. Поэтому для ограничения памяти, к которой может иметь доступ текущая программа на С или C++, используются два специаль­ных регистра.

JVM - машина со стековой организацией. Такая машина дает простую и легко компилируемую архитектуру ко­манд. У машины со стековой организацией есть недостаток - потре­бность в большом количестве обращений к памяти. Как говорилось в разделе 4.4.3, эта проблема решается специальными средствами микроархитектурного уровня. Хороший эффект в этом плане дает также применение кэш-памяти.