ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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, эта проблема решается специальными средствами микроархитектурного уровня. Хороший эффект в этом плане дает также применение кэш-памяти.