- Віртуальна Java-машина
- Java в кремнії
- RISC-архітектура Java-процесора
- Конвеєр PicoJava I
- апаратний стек
- прискорення стека
- Продуктивність PicoJava I
Кожна сучасна ділова людина використовує близько 10 мікроконтролерів. Вони є в стільникових і звичайних телефонах, пейджерах, електронних записних книжках, телевізорах і багатьох інших звичних пристроях. Очікується, що до кінця десятиліття на один будинок буде припадати від 50 до 100 інтелектуальних мікросхем.
Багато фірм з виробництва побутової техніки вже вбудовують мікроконтролери в такі звичні і зручні пристрої, як пральні машини і холодильники. Ймовірно, з'являться мільйони інтелектуальних телефонів, телекомпьютеров та інших аналогічних приладів. Для цієї армії пристроїв потрібні мікропроцесори, здатні працювати в невеликій комп'ютерної мережі і оптимізовані для виконання невеликих програм. Розробці таких мікроконтролерів може сприяти стала популярною останнім часом технологія Java.
Ця технологія розроблялася фірмою Sun Microsystems для передачі по мережі дуже компактних програм з подальшим виконанням їх на віддалених комп'ютерах або інших пристроях. Прості, безпечні і компактні програми Java працюють на всіх платформах, де реалізовані так звані віртуальні Java-машини (крос-системи для виконання Java-програм). Для виконання Java-програми на новій платформі досить розробити для неї віртуальну машину. Слід зазначити, що за півтора року існування Java написані її крос-системи для всіх найпоширеніших платформ. Тому Java-машина полегшує перенесення програмного забезпечення на інші типи процесорів, а також дозволяє легко реалізовувати розподілені обчислення.
Технологія Java об'єднує в собі об'єктно мову Java і віртуальну Java-машину. За допомогою мови Java можна розробити програмне забезпечення практично будь-якої складності, а віртуальна машина забезпечує ефективне і безпечне виконання програм на всіх комп'ютерах мережі. Саме спільне використання обох компонентів технології Java відрізняє її від інших комп'ютерних технологій. Крім того, в систему Java вбудовані спеціальні додаткові заходи для забезпечення безпеки і надійної роботи мережевих пристроїв і ПО.
Завдяки перерахованим властивостям, Java затверджується як стандарт для побудови дешевих мережевих комп'ютерів і, ймовірно, невеликих інтелектуальних пристроїв. Саме тому такою важливою є розробка спеціалізованого Java-процесора, який зміг би найбільш швидко і ефективно виконувати Java програми. Pico-Java I, розроблений фірмою Sun і є таким процесором.
Віртуальна Java-машина
Будь-процесор Java повинен відповідати специфікації віртуальної Java-машини, яка є основним механізмом управління програмами, написаними на мові Java. Ця специфікація повністю визначає систему команд Java, типи даних, які обробляються Java-машиною і її регістри. Оскільки більшість команд Java вміщується в один байт, то їх часто називають байт-кодом.
Байт-коди мови Java розроблялися для забезпечення компактності програм, яка досягається за допомогою мінімальної кількості регістрів і максимального використання покажчиків. Середня команда на мові Java має довжину всього 1,8 байта, в той час як команди класичних RISC-процесорів - близько чотирьох байт. Java-машина має стекову архітектуру, оскільки операнди передаються через регістр процесора "стек операндів". Це дозволяє зменшити довжину команди, так як вона займає всього один байт, супроводжуваний (якщо необхідно) номером операнда - 0, 1, 2, 3 і так далі.
Java-машина обробляє наступні типи даних:
- byte - байти, short - двухбайтное цілі числа, integer - чотирибайтових цілі числа, long - восьмибайтових цілі числа, float - чотирибайтових речові числа, double - восьмибайтових речові числа, char - двухбайтное символи, object - чотирибайтових посилання на об'єкти, returnAddress - чотирибайтових адреси повернення з методу.
Вона має такі регістри:
- pc - лічильник команд, який вказує на код операції, яка буде виконуватися наступною, vars - регістр для доступу до локальних змінних поточного методу, optop - покажчик на стек операндів (так як основна частина операцій виконуються саме через стек), frame - покажчик на структуру оточення часу виконання.
Оточення часу виконання використовується для обробки виняткових ситуацій, динамічного завантаження методу і повернення з нього. Для обробки виняткових ситуацій Java-машина переглядає виклики методів в зворотному порядку і передає управління першому знайденому методу обробки виняткових ситуацій. Для забезпечення динамічного завантаження оточення часу містить посилання на таблицю методів поточного об'єкта. Повернення ж з методу виконується за допомогою відновлення структури попереднього методу.
Java-машина має наступний набір команд:
- завантаження констант і змінних в стек операндів, записи змінних з стека операндов в локальні змінні, управління масивами, обробки стека, арифметичні стекові, логічні стекові, перетворення типів, передачі управління, виклику методів, повернення з методу, маніпулювання полями об'єктів, порушення виняткової ситуації, синхронізації, інші об'єктні операції.
У специфікації Java-машини розрізняються команди, що використовуються для обробки різних типів даних. Крім того, Java-машина повинна мати так званий "збирач сміття", який звільняє недоступну для програми пам'ять. Для безпеки роботи в мережі читання файлів з локального диска і запуск зовнішніх по відношенню до Java-машині програм обмежені.
Java в кремнії
До недавнього часу віртуальні Java-машини були дійсно віртуальними, тобто Java-програми інтерпретувалися або компілювалися на універсальних комп'ютерах. У разі інтерпретації (рисунок 1, спосіб 1) виконання програми сильно сповільнюється, так як універсальний процесор витрачає час на перетворення Java-програм в свій власний код. У разі ж компіляції "на льоту" (Just In Time - JIT) (рисунок 1, спосіб 2,), розмір програми збільшується в три або більше разів. Якщо комп'ютер має обмежений обсяг пам'яті, то виконання Java-програм може призвести до серйозних проблем.
Малюнок 1.Три способу виконання байт-коду Java.
Але становище змінилося, коли у жовтні 1996 р фірма Sun Microelectronics випустила перший Java-процесор - PicoJava I. Архітектура JavaChip_, розроблена Sun Microelectronics, дозволяє проектувати процесори, оптимізовані для швидкого виконання Java-програм в невеликому обсязі пам'яті. Процесор PicoJava I відповідає всім вимогам, зазначеним в специфікації віртуальної Java-машини. Оскільки Java-програми на новому процесорі можна виконувати без попередньої обробки, то це дозволяє уникнути інтерпретації або компіляції Java-програм (рисунок 1, спосіб 3).
RISC-архітектура Java-процесора
Архітектура процесора PicoJava I показана на малюнку 2. При створенні процесора, який ефективно реалізує "в залізі" віртуальну Java-машину, конструктори PicoJava I використовували RISC-технологію, успішно застосовується фахівцями фірми Sun Microsystems протягом останніх 15 років. Процесор можна легко налаштувати на різну довжину кеша команд і даних, а також включити або вимкнути речовинний обчислювач.
Малюнок 2. Блок-схема процесора PicoJava I.
В ядрі PicoJava I використовується конвеєрний принцип обробки команд. Процесор виконує команду за три такти, але при цьому одночасно можуть оброблятися відразу кілька команд. Однак слід зазначити, що PicoJava I виконує за три такту не всі команди, певні в специфікації Java-машини. Деякі команди реалізовані як макрокоди або виражені через інші команди. Така ієрархія виконання команд забезпечує ефективну роботу програм при збереженні компактності коду.
Під час роботи процесора байт-коди Java записуються в кеш команд, розмір якого може змінюватися від нуля до 16 Кбайт. Хоча командний кеш в PicoJava I і менше за розміром, ніж в інших RISC-процесорах, але так як в середньому Java-команда коротше, то загальний ефект залишається приблизно таким же. Потім байт-коди передаються в буфер команд, який має розмір 12 байт. Одночасно в нього можуть бути записано не більше чотирьох байт, а прочитано - п'ять. Оскільки більшість команд має довжину 1,8 байта, то за один такт в процесор може бути завантажено відразу кілька команд. П'ять початкових байт буфера команд можуть бути декодовані і передані на наступну стадію конвеєра для подальшої обробки.
Для прискорення виклику методів деякі з них (найбільш вживані) міститися в спеціальному стекового кеші. Він є аналогом набору регістрів, які використовуються в більшості RISC-процесорів. Цей стек необхідний для ефективної реалізації Java-машини. Він може містити покажчики, цілочисельні і речові дані, але отримати доступ до його вмісту можна тільки через певні точки. Цей стек виконує важливі функції в реалізації віртуальної Java-машини, і тому в подальшому про його роботі буде розказано докладніше.
Кеш даних, як і кеш команд, може змінюватися від нуля до 16 Кбайт. У ньому зберігаються часто використовувані дані, для чого він зроблений у вигляді двобічної асоціативної пам'яті. Обмін даними між кешем даних і конвеєром виконується по 32-розрядної шини. А все спілкування з зовнішніми пристроями процесор виконує через єдиний інтерфейс введення-виведення.
Конвеєр PicoJava I
RISC-конвеєр в PicoJava I, як і аналогічні конвеєри інших RISC-процесорів, обробляє команди в чотири етапи (рисунок 3).
Малюнок 3. Чотири етапи конвеєрної обробки в процесорі PicoJava I.
Арифметичні і логічні команди в процесорі PicoJava I оперують зі стеком даних, а не з пам'яттю, тому обчислення можна легко організувати за допомогою конвеєра. Однак багато команд в стековой архітектурі залежать від даних, що завантажуються попередньою командою, тому реалізувати за допомогою конвеєра обмін з кешем даних дещо складніше. У разі необхідності до кешу даних можна звертатися на етапі декодування команд.
У конвеєрі процесора PicoJava I вжито додаткових заходів для прискорення об'єктно орієнтованих програм. Наприклад, в ньому передбачені чотири різні команди виклику методів, а також можлива пряма робота з локальними змінними об'єкта. Крім того, для прискорення роботи програм конвеєр виконує синхронізацію потоків і "збір сміття". У PicoJava I також кешируєтся і запис в пам'ять, що дозволяє спростити "збір сміття" - очищення вже не використовуваних областей пам'яті.
апаратний стек
В ядрі PicoJava I реалізований стек, за допомогою якого можна легко реалізувати архітектуру віртуальної Java-машини. 64 найбільш використовувані стекові структури зберігаються на кристалі PicoJava I в стекового кеші, через який виконуються всі обчислення. Константи і локальні змінні пересилаються в стек і тільки після цього з ними можна виконувати необхідні обчислення.
Стек PicoJava I в основному використовується для зберігання інформації про поточні методах (рисунок 4). Віртуальна машина створює для кожного методу окрему структуру, яка називається часом виконання. Ця структура містить параметри методу, локальні змінні і оточення часу виконання, де вказано вектор повернення, які повертаються змінні і константи, та інша необхідна для реалізації віртуальної Java-машини інформація.
Малюнок 4. Архітектура стека PicoJava I.
Java-програми часто використовують виклики різних методів, тому їх прискорення може істотно зменшити час роботи Java-програми. Крім того, програмісти часто використовують такі зручні особливості об'єктно орієнтованої мови Java, як об'єктні і віртуальні методи, тому відсоток використання нових методів буде, ймовірно, збільшуватиметься.
Передача параметрів при виклику методів оптимізована в процесорі PicoJava I за допомогою організації стека. Він побудований так, щоб передача параметрів виконувалася через загальну для обох методів область стека. Значення параметрів знаходяться в вершині стека операндов і при виклику методу стають частиною його локальних змінних. Таким чином, можна уникнути непотрібних операцій копіювання для передачі параметрів через регістри процесора.
Крім того, стековий кеш виконаний у вигляді замкнутого буфера, який дозволяє контролювати збільшення і зменшення його розміру. Це важливо в тому випадку, коли обробляється метод має багато змінних, які заповнюють весь стековий кеш. Коли можливо переповнення стека, процесор тимчасово переписує частину стекового кеша в фоновому режимі в кеш даних, а коли в стеці знову з'являється вільне місце, то збережені дані відновлюються. Це дозволяє уникнути переповнення стекового кеша і виключити втрату інформації. Для контролю за переповненням стека в PicoJava I передбачений спеціальний механізм захисту (рисунок 5).
Малюнок 5.
Механізм захисту від переповнення стекового кеша.
Щоб пояснити роботу цього механізму, розглянемо наступний приклад: деякі Java-програми можуть викликати кілька методів поспіль і, таким чином, переповнити стек. Захисний механізм у фоновому режимі звільняє місце в стеку, записавши дані про раніше запущених методах з стека в кеш даних. Коли поточний метод закінчить свою роботу, захисний механізм перевантажить збережену раніше інформацію з кеша даних назад в стек. Аналіз показав, що при використанні такого методу майже не відбувається зупинки конвеєра через переповнення стекового кеша. В результаті стек дійсно виконує функції регістрів процесора.
прискорення стека
Стекові операції в процесорі PicoJava I можна ще більше прискорити за допомогою спільного виконання деяких команд. Як вже було сказано, операнди для Java-команд зчитуються з стека і результат їх обробки втягнений в стек. Тому ефективне виконання стекових операцій істотно впливає на роботу всієї програми. Зауважимо, що процесор може звертатися тільки до верхньої частини стека. В результаті відсутні в стеці змінні, необхідні для роботи програми, тимчасово записуються в області локальних змінних, а звідти - в вершину стека. Усунення цього додаткового кроку може прискорити виконання програми в стековой архітектурі.
Для підвищення продуктивності процесор PicoJava I використовує спільне виконання команд. Часто за командою, яка копіює дані з локальної змінної в вершину стека, слід команда обробки завантажених даних. Конвеєр команд відстежує таку ситуацію і обробляє ці дві команди разом. Складова команда виконується так, ніби локальна змінна вже була завантажена в вершину стека. І тільки в разі якщо локальної змінної не виявилося в стекового кеші, спільна обробка команд неможлива.
Моделювання спільної обробки команд показує, що з її допомогою можна усунути до 60% зайвих операцій. Аналіз проводився на основі декількох еталонних програм (рисунок 6), які вибираються з широкого кола програм, які можна реалізувати на PicoJava I. Діаграма показує, що великий відсоток часу витрачається на команди роботи зі стеком, такі як передача даних усередині стека, їх дублювання, запис в стек констант і обмін даними між стеком і локальними змінними. Тому можна значно прискорити роботу програм, якщо використовувати метод спільної обробки команд (рисунок 7). В результаті процентне співвідношення команд майже аналогічно розподілу інструкцій для універсального RISC-процесора.
Малюнок 6.
Розподіл типів команд без урахування спільної обробки.
Малюнок 7. Розподіл команд з використанням методу спільної обробки.
Продуктивність PicoJava I
Загалом, архітектура JavaChip була розроблена для простого і гнучкого втілення різних типів програм - від невеликих іграшок до складних клієнт-серверних систем. Можливості міняти розмір кеша команд і даних, а також включати і відключати речову арифметику дозволяють розробникам обчислювальних систем налаштовувати ядро PicoJava I на певний клас задач. Наприклад, якщо в PicoJava I прибрати речову арифметику і встановити розмір кеша команд 4 Кбайта, а даних - 8, то можна заощадити приблизно п'яту частину кристала. Крім того, продумана реалізація апаратного стека і декодування команд забезпечує PicoJava I виняткову продуктивність.
Тести на продуктивність PicoJava I показують, що час і зусилля, витрачені на розробку цього процесора, були витрачені не даремно. В еталонних тестах PicoJava I працював в 15-20 разів швидше, ніж 486 з інтерпретатором (з тієї ж частотою), і - в 5 разів швидше Pentium з JIT-компілятором (рисунок 8).
Малюнок 8.
Продуктивність PicoJava I.
Мова Java розроблявся спеціально для передачі програм по мережах, саме тому написані на ньому програми дуже компактні. А висока продуктивність PicoJava I, можливості настройки цього процесора і його невелика вартість роблять цю технологію найбільш прийнятним варіантом розвитку мережі і розробки невеликих інтелектуальних пристроїв. Поява Java-процесора відкриває нові можливості для використання комп'ютерних мереж і звичних побутових приладів.
Валерій Коржов - співробітник компанії Jet Infosystems. З ним можна зв'язатися за адресою [email protected] .