RISC-ul Java

Java a făcut posibilă interconectarea paginilor Web, picoJava I va permite interconectarea echipamentelor care rulează Java.

Budai László

În zilele noastre cu toții suntem de acord că viitorul este al rețelelor, și aici nu e vorba doar de rețele de calculatoare, ci și de echipamentele, microcontrolerele interconectate, care câștigă din ce în ce mai mult teren. Pe viitor vor fi milioane de cutii set-top, terminale, telefoane celulare, echipamente specializate, care vor lucra interconectate într-un mediu optimizat pentru aplicații mici rulând la viteză maximă.

Limbajul Java pare a fi cel care sprijină cel mai mult această evoluție, promovând o interconectare sigură a echipamentelor de rețea prin intermediul facilităților native care asigură integritatea aplicațiilor de rețea.

Următorul pas

Fenomenul Java a fost dus cu un pas mai departe prin implementarea în pastila de siliciu a Mașinii Virtuale Java. Executarea codului Java pe un procesor optimizat pentru aceste tipuri de aplicații elimină gâtuirile care până acum limitau performanțele acestora. Până acum, programele Java rulau fie prin intermediul unui interpretor, fie printr-un compilator JIT (just in time). În primul caz (interpretor), era afectată mult viteza de execuție, iar în al doilea îmbunătățirile de viteză se fac pe seama dimensiunii codului, acesta mărindu-se de peste trei ori, devenind o problemă pentru utilizarea în aplicații înglobate.

Pentru eliminarea acestor gâtuiri, Sun Microelectronics a realizat cipuri Java, care sunt optimizate în acest sens. Astfel, picoJava I execută setul de instrucțiuni Java eliminând necesitatea unui interpretor sau a unui compilator JIT.

Pentru a întruni cât mai eficient cerințele Mașinii Virtuale Java, proiectanții cipului picoJava I au adoptat o arhitectură asemănătoare procesoarelor RISC (Reduced Instruction Set Computer), optimizată pentru performanțe de execuție maxime. O atenție deosebită s-a acordat faptului ca acest nucleu să poată fi adaptat diferitelor aplicații, astfel, dispune de memorii cache de date și de instrucțiuni cu dimensiunea variabilă și de unitate de calcul în virgulă flotantă opțională.

Nucleul picoJava I are o arhitectură pipeline cu patru nivele, asemănătoare procesoarelor RISC și un set de instrucțiuni bine definit. Au fost implementate hardware doar acele instrucțiuni care îmbunătățesc în mod direct execuția codului Java. Majoritatea instrucțiunilor se execută în 1 – 3 cicluri, acelea care nu au fost implementate hardware, dar care sunt considerate esențiale din punctul de vedere al performanței sistemului pot fi executate prin microcod sau cu mașini de stare, iar cele câteva rămase sunt interceptate și emulate.

Codul binar Java este păstrat într-un cache de instrucțiuni a cărui dimensiune poate varia de la 0 la 16 Kb. Acest cache are o lungime de linie de 8 octeți, mică în comparație cu procesoarele RISC, dar este adecvată instrucțiunilor Java, care sunt mai scurte și astfel, rezultatul final este aproximativ același. Cache-ul de instrucțiuni este separat de unitatea de execuție printr-un buffer de instrucțiuni de 12 octeți. În acest tampon se pot înscrie simultan 4 octeți în timp ce se pot citi simultan 5 octeți, astfel ținând cont de faptul că majoritatea instrucțiunilor au lungimea de 1.8 octeți, procesorul poate citi simultan mai multe instrucțiuni. Conform specificațiilor Mașinii Virtuale Java, fiecare instrucțiune este formată dintr-un cod de operație (opcode) pe opt biți și operandul pe mai mulți octeți (vedeți articolul „Mașina Virtuală Java” din BYTE Septembrie 1997). La un moment dat, se citesc cinci octeți din cache-ul de instrucțiuni, aceștia sunt decodificați și trimiși către următorul nivel din arhitectura pipeline pentru a fi executat.

Stiva

Pentru a mări viteza de rulare a aplicațiilor, picoJava I conține o stivă hardware de operanzi, care poate păstra 64 valori pentru a fi accesate de către unitățile funcționale. Această stivă poate păstra atât valori întregi, cât și valori reale. Transferul acestor valori spre sau dinspre stivă nu reprezintă o supraîncărcare a nucleului indiferent de tipul operandului, acest lucru facilitând transferul datelor între unitatea de prelucrare în virgulă flotantă și cea de întregi.

Stiva hard a fost optimizată pentru a implementa cât mai bine funcționarea stivei Mașinii Virtuale Java. Astfel se creează câte un cadru pentru fiecare metodă. Un astfel de cadru conține parametrii metodei, variabilele locale, precum și un descriptor de stare a metodei, care furnizează informațiile necesare la revenire, după terminarea execuției metodei, cum ar fi numărătorul de program sau valorile returnate.

Stiva implementată de picoJava facilitează transferul parametrilor între metode prin implementarea unui mecanism de suprapunere, astfel valorile nu trebuie copiate din cadrul unei metode în cel al alteia. Acest transfer de parametri făcut direct prin stivă evită operațiile de scriere și citire din registre, prezente în arhitecturile convenționale de microprocesoare.

Această stivă hardware poate conține simultan mai multe cadre de metode, pentru a permite un acces cât mai rapid. De asemenea, stiva este suficient de flexibilă încât să poată să conțină metode cu dimensiuni diferite. Pentru a preveni depășirile de stivă picoJava are implementat un mecanism de anticipare, rulând în fundal. În cazul în care se prezice o depășire a stivei, o parte din date sunt salvate în cache-ul de date, ele urmând să fie reîncărcate în stivă când se eliberează spațiu; pentru a accelera aceste operații de scriere/citire stiva folosește un port dedicat.

Anticiparea depășirii stivei se bazează pe un mecanism de driblare, care urmărește procesul de salvare și înscriere al valorilor în stivă. Stiva este administrată ca un tampon circular, care asigură încărcarea stivei într-o manieră previzibilă, evitând depășirea acesteia. Astfel, o aplicație Java poate apela mai multe metode depășind capacitatea stivei, mecanismul de driblare va crea spațiu în stivă prin salvarea acelor metode care sunt cele mai vechi (în stivă), iar excesul rămas va fi salvat în cache-ul de date. În momentul în care prima metodă își termină execuția cele rămase vor fi încărcate din cache-ul de date în stivă cu mult înaintea utilizării lor.

Operațiile de salvare și reîncărcare a valorilor este declanșat de indicatorii de nivel inferior și nivel superior al stivei.

Pentru a accelera execuția operațiilor pe stivă, picoJava folosește un mecanism de folding. S-a constatat că majoritatea operațiilor accesează operanzii de pe stivă, iar rezultatul este depus tot pe stivă. Dar accesul se face doar la vârful stivei, astfel variabilele care nu sunt în vârful stivei vor fi mai întâi mutate acolo și abia după aceea vor fi accesate. Eliminarea acestei operații suplimentare îmbunătățește foarte mult performanțele operațiilor pe stivă. Pentru a realiza acest deziderat, proiectanții picoJava au constatat că operațiile de mutare a variabilelor pe stivă de obicei sunt urmate de o operație care consumă acea variabilă, iar prin cuplarea celor două operații s-a reușit eliminarea a până la 60% din ineficiența datorată arhitecturii stivei. Cele două instrucțiuni cuplate vor executa un acces aleator la stivă într-un singur ciclu, ca și cum variabila ar fi fost situată în vârful stivei.

Utilizarea picoJava I

Nucleul picoJava I se dorește a fi componenta de bază a unei serii de echipamente cum ar fi telefoane care să se conecteze la WWW, calculatoare de rețea (NC – Network Computers), cutii set-top și alte echipamente destinate a rula aplicații Java. Astfel picoJava I este un nucleu de procesor pentru echipamentele înglobate.

Prin arhitectura sa optimizată pentru execuția codului binar Java, nucleul picoJava I oferă performanțe remarcabile în rularea aplicațiilor Java. Testele au arătat că picoJava I este de 15 – 20 ori mai rapid decât un 486 cu compilator, la aceeași frecvență de tact, și de 5 ori mai rapid decât un Pentium cu un compilator JIT, la aceeași frecvență de tact.

Aceste performanțe, adăugate la posibilitatea de a adapta nucleul la necesitățile aplicației și prețul scăzut fac din picoJava I o soluție viabilă pentru realizarea echipamentelor înglobate.

Referințe
1. picoJava I Microprocessor Core Architecture
2. Tutorial On picoJava: http://www.ee. siue.edu/~kgovind/ee580_1.html
3. Hardware Implementation of Java VM: http://infopad.eecs.berkeley.edu/HotChips8/4.3/


BYTE România - ianuarie 1998


(C) Copyright Computer Press Agora