Arhitectura Calculatoarelor

ȚIUNI INTRODUCTIVE

SCHEMA DE BAZĂ A UNUI CALCULATOR

Orice calculator are în componență patru mari unități fundamentale:

-Unitatea centrală (UC).

-Unitatea de memorie (UM).

-Unitatea de Intrare/Ieșire (U I/E).

-Magistrale de interconectare (BUS-uri).

Periferic 1

Periferic 2

Periferic n

Magistrală (BUS)

ă

Rolurile acestor componente sunt:

-Unitatea centrală (UC) controlează toate componentele, executând instrucțiunile unui program; efectuează calcule aritmetice și logice.

-Memoria (UM) păstrează programele în curs de execuție și datele asociate lor.

-Unitatea de Intrare/Ieșire (U I/E) leagă sistemul cu lumea externă prin intermediul unităților periferice: ecran, tastatură, discuri, benzi magnetice, rețele etc.

-Magistralele sunt de trei feluri:

magistrale de adresă, care vehiculează adresa memorie sau a unității I/E generată de UC (sau, în unele cazuri de alte unități de control);

magistrale de date, care vehiculează informația (instrucțiuni, date) între UC, memorie și unitățile I/E;

magistrale de control, care vehiculează semnalele utilizate de UC pentru controlul sistemului (adresă, memorie validă, adresă I/E validă, citire/scriere, așteptare, întrerupere etc.).

Principiul de funcționare a unui calculator este relativ simplu. În UM există programe, fiecare program având un număr de instrucțiuni. Ciclurile de executare a unei instrucțiuni sunt următoarele:

-Ciclul extragere instrucțiune (instruction fetch). UC face o citire a memoriei la adresa la care se află instrucțiunea. Instrucțiunea are un număr de biți, în funcție de arhitectura calculatorului, de obicei multiplu de 8. Instrucțiunea citită este adusă pe magistrală și depusă într-un registru al UC-ului.

-Ciclul de aflare a operanzilor. Oricare instrucțiune lucrează cu operanzi. Între operanzi se petrece o operație dată de un câmp al instrucțiunii, numit codul instrucțiunii. În această fază trebuie depistați operanzii, mai precis adresele unde se găsesc operanzii. Aceștia se pot găsi în două tipuri de locații:

-în registrele generale ale UC-ului;

-la o adresă de memorie.

Există mai multe tipuri de adresare pentru determinarea adreselor de operanzi. La sfârșitul acestui ciclu, în UC trebuie să se existe adresele fizice ale operanzilor participanți la instrucțiune.

-Ciclul de aducere a operanzilor în UC. În acest ciclu se aduc operanzii participanți la instrucțiune de la adresele determinate în ciclul anterior. Ei sunt aduși din registrele generale sau de la adresele de memorie în registrele funcționale.

-Ciclul de execuție propriu zisă. În acest ciclu are loc execuția propriu zisă a instrucțiunii, dată de codul instrucțiunii.

-Ciclul de depunere a rezultatului. Orice instrucțiune are ca scop final aflarea unui rezultat care poate fi un operand în cazul instrucțiunilor aritmetice(de exemplu suma pentru cod de adunare, produsul pentru cod de înmulțire) sau poziționarea unor indicatori în cazul instrucțiunilor logice (de exemplu, în cazul unui cod de comparație între doi operanzi, poziționarea indicatorului z=1 pentru identitatea celor doi operanzi).

La sfârșitul acestui ciclu, care înseamnă și sfârșitul executării instrucțiunii, se calculează adresa instrucțiunii următoare și adresa de la care va fi adusă instrucțiunea următoare.

Execuția unui program înseamnă execuția succesivă a instrucțiunilor din care este alcătuit. Programele care compun sistemul de operare asigură gestiunea resurselor (procesor, memorie, I/E) și fac legătura cu programele de aplicație.

SCHEMA NIVELELOR CONCEPTUALE A UNUI CALCULATOR

Un calculator virtual actual are șapte nivele conceptuale.

Interpretare

Microprogram executat

direct de hard

Fig.1.2. Nivelurile conceptuale ale mașinii virtuale corespunzătoare calculatoarelor actuale.

Mașina virtuală este organizată pe niveluri iar între două niveluri pot exista două operații:

-translatarea și

-interpretarea.

Translatare Interpretare

Utilizarea limbajului inferior este greoaie și de aceea s-a creat un limbaj superior, mult mai aproape de gândirea umană. Se pot scrie programe atât în Lsup cât și în Linf dar calculatorul va executa totdeauna setul de instrucțiuni din Linf pentru care a fost proiectat fizic.

Translatarea înseamnă transformarea programului din Lsup în întregime într-un program din Linf . Programul din Lsup este abandonat iar noul program din Linf este încărcat în memorie și executat. Translatarea seamănă cu compilarea.

Interpretarea înseamnă execuția instrucțiunilor din Lsup , pas cu pas, fiecare instrucțiune fiind executată imediat. Este scrierea unui program în Linf care preia programe din Lsup ca date de intrare și le execută examinând fiecare instrucțiune pe rând și executând secvența echivalentă de instrucțiuni direct în Linf , dar fără să genereze un nou program în Linf .

Diferența fundamentală între cele două tehnici este că în translatare un program mai întâi este transformat în totalitate în alt program și apoi executat programul translat, în timp ce în interpretare se execută fiecare instrucțiune pas cu pas.

Față de interpretare, translatarea are avantajul unei viteze de execuție mult mai mari.

Nivelurile au următoarele semnificații:

Nivelul 1 este hard pur. Este format din circuite electrice și electronice.

Nivelul 2 este nivelul microprogram care interpretează instrucțiunile nivelului 3 și le execută în nivelul 1. Fiecare instrucțiune a nivelului 3 este executată de un microprogram.

Nivelul 3 este nivelul setului de instrucțiuni al mașinii, instrucțiuni executate pe nivelul hard.

Nivelul 4 . Sistemul de operare este hibrid deoarece cuprinde atât instrucțiuni interpretate de nivelul patru cât și instrucțiuni interpretate de nivelul trei.

Nivelele 1-4 nu sunt utilizate de programatori, ele conținând interpretoare și translatoare construite de către programatorii de sisteme.

Nivelul 5 este nivelul limbajului de asamblare, destinat programatorilor de aplicații. Dacă primele niveluri erau interpretate, acesta este translatat de către un program numit asamblor.

Nivelul 6 este nivelul de limbaj înalt. Programele scrise în acest nivel sunt translatate către nivelele cinci și șase de către programe specializate numite compilatoare.

Nivelul 7 conține limbaje destinate unor domenii foarte speciale cum ar fi proiectarea asistată, administrația, grafica etc.

SCURT ISTORIC AL DEZVOLTĂRII CALCULATOARELOR

În decursul timpului, de la apariția primului calculator și până astăzi, dezvoltarea în acest domeniu s-a datorat celor doi factori principali:

-progresul tehnologic și

-introducerea de noi concepții în arhitectura calculatoarelor.

Influența progresului tehnologic asupra dezvoltării calculatoarelor

De la apariția primului calculator, tehnologiile au făcut progrese uriașe, atât în ceea ce privește componentele unui calculator cât și în tehnologiile de stocare a informației. Din acest punct de vedere, se pot distinge cinci generații de calculatoare.

Generația zero ,calculatoare mecanice,(1642-1945)

Primul care a construit o mașină de calcul funcționabilă a fost Blaise Pascal (1623-1662) care, la numai 19 ani, a proiectat o mașină mecanică, folosind roți dințate și fiind acționată de o manivelă manevrată de om. Mașina putea să facă numai adunări și scăderi și a fost creată de tânărul Pascal pentru a-l ajuta pe tatăl său care era colector de taxe pentru guvernul francez.

Gottfried von Leibnitz (1646-1716) a contribuit, teoretic și practic, la nașterea informaticii. El a perfecționat mașina lui Pascal, noua mașină reușind să execute, pe lângă adunări și scăderi, și înmulțiri și împărțiri.

Cel care poate fi considerat autorul precursorului calculatorului actual este Charles Babbage (1792-1871). Acesta a creat două mașini: mașina de calcul diferențială și mașina analitică.

Mașina de calcul al diferențelor (diferențială) era o mașină specializată care, pe baza unui algoritm, calcula tabele de numere utile în navigația maritimă prin metoda diferențelor finite. Cea mai interesantă caracteristică a acestei mașini era înscrierea rezultatelor pe o tablă de aramă gravabilă cu o ștanță de oțel, previzionând mediile periferice de inscripționare de azi.

Mașina analitică avea patru componente:

-magazia (memoria);

-moara (unitatea de calcul);

-secțiunea de intrare (cititorul de cartele);

-secțiunea de ieșire (ieșire perforată și imprimată).

Magazia consta din 100 de cuvinte a câte 50 cifre zecimale, fiecare fiind folosite pentru a memora variabile și rezultate. Moara putea accepta operanzi din magazie, pe care putea aduna , scădea, înmulți sau împărți, pentru ca, în final, să întoarcă rezultatul în magazie. Această mașină analitică era programabilă, într-un limbaj simplu de asamblare, care necesita pe cineva care să facă programarea. Acel cineva a fost Ada de Lovelace, fiica lordului Byron, care este cunoscută ca fiind primul programator din istoria calculatoarelor. În cinstea ei limbajul de programare a fost denumit ADA. Din păcate, mașina nu a funcționat pentru că folosea roți dințate care, în sec. IX, erau realizate cu o precizie redusă. Insă această mașină, care a fost realizată practic în 1991 la Muzeul Științei din Londra, stă la baza calculatoarelor moderne, ideile ei fiind valabile și astăzi.

Următoarele calculatoare aparțin tehnologiei electromecanice.

În 1930, un student german, Konrad Zuse, a construit o serie de mașini de calcul folosind relee electromagnetice. Din cauza războiului, însă, mașinile lui nu au fost cunoscute și, mai mult, au fost distruse în bombardamentul Berlinului din 1945.

În SUA, John Atanasoff, de la Colegiul Statului Yowa, a creat, pornind de la ideea lui Babbage, o mașină asemănătoare din punct de vedere logic dar utilizând o altă tehnologie. Memoria era formată din capacități care se reîncărcau periodic, idee utilizată astăzi la memoria dinamică RAM cu refresh.

Ca și mașina Babbage, mașina lui John Atanasoff era tributară tehnologiei și nu a funcționat. Se pare, însă, că istoria a reținut prototipul ABC (Atanasoff-Berry-Computer), Berry fiind un student a lui Atanasoff, realizat în 1939.

George Stibitz, de la Bell Laboratories, a creat o mașină mai primitivă ca a lui Atanasoff dar care are marele merit că a funcționat, demonstrația făcându-se, în 1940, la Colegiul Dartmouth.

În 1944, Howard Aiken a construit o mașină pornind de la mașina Babbage, pe care a studiat-o îndelung, creând o nouă mașină pe bază de relee electromagnetice. Mașina avea 72 cuvinte, fiecare de câte 23 cifre zecimale, și un timp de instrucțiune de 6 secunde. Intrarea și ieșirea se făceau pe bază de hârtie perforată.

Generația întâi, mașini cu tuburi electronice (1945-1955)

Circuitele logice din generația întâi erau realizate cu tuburi electronice și aveau un consum energetic foarte mare. Principalele caracteristice ale acestor calculatoare au fost:

-memoria realizată cu tambur magnetic;

-utilizarea cititorului/perforator de hârtie;

-existența a 10-20 instrucțiuni simple care constituiau baza unui limbaj cod mașină.

Din punct de vedere logic nu era mare diferență față de mașina Babbage dar tehnologic se intra în era electronică.

Principalele calculatoare din această generație au fost:

ENIGMA, mașină realizată de Germania în timpul celui de-al doi Lovelace, fiica lordului Byron, care este cunoscută ca fiind primul programator din istoria calculatoarelor. În cinstea ei limbajul de programare a fost denumit ADA. Din păcate, mașina nu a funcționat pentru că folosea roți dințate care, în sec. IX, erau realizate cu o precizie redusă. Insă această mașină, care a fost realizată practic în 1991 la Muzeul Științei din Londra, stă la baza calculatoarelor moderne, ideile ei fiind valabile și astăzi.

Următoarele calculatoare aparțin tehnologiei electromecanice.

În 1930, un student german, Konrad Zuse, a construit o serie de mașini de calcul folosind relee electromagnetice. Din cauza războiului, însă, mașinile lui nu au fost cunoscute și, mai mult, au fost distruse în bombardamentul Berlinului din 1945.

În SUA, John Atanasoff, de la Colegiul Statului Yowa, a creat, pornind de la ideea lui Babbage, o mașină asemănătoare din punct de vedere logic dar utilizând o altă tehnologie. Memoria era formată din capacități care se reîncărcau periodic, idee utilizată astăzi la memoria dinamică RAM cu refresh.

Ca și mașina Babbage, mașina lui John Atanasoff era tributară tehnologiei și nu a funcționat. Se pare, însă, că istoria a reținut prototipul ABC (Atanasoff-Berry-Computer), Berry fiind un student a lui Atanasoff, realizat în 1939.

George Stibitz, de la Bell Laboratories, a creat o mașină mai primitivă ca a lui Atanasoff dar care are marele merit că a funcționat, demonstrația făcându-se, în 1940, la Colegiul Dartmouth.

În 1944, Howard Aiken a construit o mașină pornind de la mașina Babbage, pe care a studiat-o îndelung, creând o nouă mașină pe bază de relee electromagnetice. Mașina avea 72 cuvinte, fiecare de câte 23 cifre zecimale, și un timp de instrucțiune de 6 secunde. Intrarea și ieșirea se făceau pe bază de hârtie perforată.

Generația întâi, mașini cu tuburi electronice (1945-1955)

Circuitele logice din generația întâi erau realizate cu tuburi electronice și aveau un consum energetic foarte mare. Principalele caracteristice ale acestor calculatoare au fost:

-memoria realizată cu tambur magnetic;

-utilizarea cititorului/perforator de hârtie;

-existența a 10-20 instrucțiuni simple care constituiau baza unui limbaj cod mașină.

Din punct de vedere logic nu era mare diferență față de mașina Babbage dar tehnologic se intra în era electronică.

Principalele calculatoare din această generație au fost:

ENIGMA, mașină realizată de Germania în timpul celui de-al doilea război mondial pentru transmiterea mesajelor codificate.

COLLOSUS, mașini fabricate de Englezi pentru decodificarea mesajelor ENIGMA. De menționat că la fabricarea lor a contribuit și Allan Turing, cunoscut mai târziu drept creator al mașinii TURING.

ENIAC (Electronic Numerical Integrator And Computer), construit de către John Mauchley și John Eckert (Universitatea din Pensilvania), cu colaborarea lui John von Neumann,. Era destinat rezolvării ecuațiilor diferențiale cu derivate parțiale și a avut aplicații în domeniul militar, la calcularea traiectoriilor balistice și chiar la fabricarea bombei atomice în proiectul Manhatan. Avea următoarele caracteristici:

-19000 tuburi electronice și 1500 relee;

-30 unități separate care procesau datele;

-20 registre de câte 10 cifre zecimale destinate rezultatelor finale și parțiale;

-efectua 5000 operații pe secundă.

EDVAC (Electronic Discrete Variable Automatic Computer), calculator cu numai 4000 tuburi electronice. Este important pentru că în echipa care l-a proiectat s-a aflat și John von Neumann care în 1947 a publicat principiile calculatorului modern, valabile și astăzi. Mașina lui von Neumann este un model de mașină universală, nespecializată, cu următoarele elemente:

-o memorie conținând programe (instrucțiuni) și date;

-o unitate aritmetică și logică(UAL);

-o unitate care permite schimbul de informație cu perifericele (U I/E)

-o unitate de comandă (UC).

Aceste dispozitive realizează funcțiile de bază ale unui calculator: stocarea de date, tratarea datelor, mișcarea datelor și controlul lor, funcții care sunt aceleași și în ziua de astăzi. Calculatoarele moderne se bazează pe schema lui von Neumann.

MANIAC , calculatorul de la Los Alamos Laboratory, utilizat la proiectarea bombei atomice.

UNIAC 1, calculator lansat în 1951 de Eckert și Mauchley și utilizat într-o aplicație de predicție a alegerilor din SUA câștigate de Dwight Eisenhower.

IBM 701, calculator cu memorie de 2kcuvinte a 36 biți și două instrucțiuni pe cuvânt (primul din seria de calculatoare lansate de celebra firmă IBM, înființată, de altfel, în 1911) .

IBM 704, cu 4kcuvinte de 36 biți.

1.3.1.3.Generația a doua, calculatoare cu tranzistori (1955-1965)

John Bardeen, Walter Brattain și Wiliam Shockley au inventat în 1948 tranzistorul bipolar cu joncțiune ceea ce le-a adus în 1956 Premiul Nobel pentru Fizică. Tranzitorul are aceleași funcțiuni ca tuburile electronice cu vid dar are avantajul de a fi miniaturizabil.

Calculatoarele bazate pe tehnologia cu tranzistori au următoarele caracteristici:

-utilizarea diodelor și tranzistorilor pe bază de germaniu și apoi pe bază de siliciu ceea ce a condus la o putere disipată mai mică, gabarit redus și siguranță în funcționare;

-memorii pe inele de ferită, de 1000 de ori mai rapide decât cele din generația anterioară, având timpul de acces de 2-12 µs.;

-apariția cablajului imprimat;

-apariția echipamentelor periferice precum discul, banda magnetică, imprimanta;

-apariția limbajelor de nivel înalt ca Fortran, Cobol, Algol.

Dintre calculatoarele din această generație, cele mai cunoscute sunt:

TX-0 (Tranzistorised eXperimental computer 0) realizat la MIT.

PDP-1 (Programmable Data Procesor) realizat de către DEC (Digital Equipement Corporation) , având o memorie internă de 4kcuvinte a 18 bițiși ciclul instrucțiune de 5µs., fiind echipat cu consolă monitor CRT (Cathode Ray Tube) cu posibilitatea de control al fiecărui punct de pe ecran.

PDP-8 , cu o magistrală unică și cu următoarele module: CPU, memorie, consolă, dispozitive I/E. A fost primul calculator numeric comercial, de mare serie, vânzându-se 5000 bucăți.

CDC 6600,produs de DEC și proiectat de Seymour Cray, viitorul proiectant al calculatoarelor Cray 1 și Cray 2.

IBM 7094, cu memorie de 32kcuvinte de 36 biți și ciclu instrucțiune de 2µs.

În această perioadă și în România au început să se producă primele computere, care în majoritate au fost prototipuri, DACIC, MECIPT, ANCA, CETA, ele fiind realizate la Institutul de Fizică Atomică și la Institutele Politehnice din București și Timișoara.

1.3.1.4. Generația a treia, calculatoare cu circuite integrate (1965-1980)

În 1958 a fost inventat circuitul integrat de către Robert Noyl sau, după alte surse, de către Jack Kilby de la Texas Instruments. Este vorba despre gruparea pe o pastilă de siliciu a mii și apoi milioane de componente.. Principalele caracteristici ale calculatoarelor din această generație sunt:

-utilizarea circuitelor integrate e scară redusă, cu 100 tranzistori pe chip;

-apariția memoriilor de semiconductoare, cu timp de acces de 0,5-75µs;

-memorie externă de mare capacitate, discuri de masă și benzi magnetice.

Sistemele de calcul din această generație au fost create de:

IBM, cel mai reprezentativ fiind IBM 360;

DEC, cu minicalculatoare din seria PDP 11/XX.

Minicalculatorul IBM 360 avea următoarele caracteristici:

-ciclul instrucțiune 250µs.;

-spațiul de adresare de 216 octeți (19 Mocteți);

-registre de lucru pe 32 biți;

-apariția multiprogramării.

Minicalculatoarele PDP 11/XX aveau caracteristici asemănătoare cu ale lui IBM , însă cuvântul era de 16 biți (și apoi de 32 biți la cele din seria VAX); raportul preț/performanță era foarte bun, cel mai bun dina anii 80.

Și în România , în acea perioadă (anii 80), a fost o emulație și o efervescență în construcția de calculatoare, România fiind la un moment dat pe locul 1 din vechiul lagăr socialist în ceea ce privea echipamentele de tehnici de calcul.

În domeniul calculatoarelor numerice, România a produs:

FELIX C 512/1024, serie de calculatoare care avea ca patent un calculator francez produs de firma CII. Din punct de vedere tehnologic, a fost construit pe porți logice și bistabile iar urmașul său, FELIX 5000, a avut în componență circuite medii integrate ca registre și numărătoare. De remarcat că circuitele pentru FELIX C 512/1024 erau de proveniență românească, produse la IPRS Băneasa Microelectronic. Din punct de vedere al caracteristicilor, FELIX avea cuvâtul de 16 biți, o memorie de maxim 1 Moctet pe bază de semiconductoare, o unitate de intrare/ieșire numită USM (Unitate de Schimburi Multiple) care emiea 5 instrucțiuni speciale de intrare/ieșire. Ca sistem de operare avea un sistem pe laturi, numit SIRIS V, cu alocare de memorie cu partiții statice.

CORAL și INDEPENDENT, minicalculatoare ce emulau instrucțiunile din PDP 11/44. Amândouă calculatoarele românești aveau caracteristici tehnice asemănătoare cu PDP 11/44, deosebirea dintre ele fiind aceea că minicalculatorul CORAL avea în componență numai cipuri din Europa de Vest și din America iar INDEPENDENT avea numai cipuri românești și rusești. INDEPENDENT a fost proiectat de ITC (Institutul de Tehnică de Calcul) iar Coral de un colectiv de la FCB (Fabrica de Calculatoare București) dar toate erau produse de FCB. Sistemul de operare era o prelucrare a SO RSX, numită MIX, creată de cei de la FCB.

RCD (Rom Control Data) fabrica echipamente periferice românești. RCD era o societate mixtă, româno-americană, în colaborare cu CD (Control Data). Se fabricau discuri magnetice de masă MD-40, MD-50 (de 50 Mocteți), benzi magnetice CDC, imprimante liniare BP (Band Printer). Crearea RCD ne-adus un mare avantaj deoarece toate calculatoarele românești erau echipate cu periferice Control Data. Datorită acestui fapt am putut exporta calculatoare românești FELIX în China, INDEPENDENT în China, Cehoslovacia și R.D.Germană. CORAL, deși era cel mai performant și făcut cu echipament românesc, nu a putut fi exportat deoarece sistemul de operare MIX era o copie a RSX-ului . În vest nu s-a putut exporta pe motiv de drept de autor iar în est cei de la FCB nu au vrut să-l exporte fiind prea bun.

Oricum, în anii 70 eram cei mai buni producători de echipamente de calcul din est. În anii 80, însă, am pierdut supremația în favoarea Bulgariei care a învestit mai mult ca noi, în special în echipamente periferice și soft.

1.3.1.5. Generația a patra . V.L.S.I. (1980-2005)

Apariția acestei generații a fost posibilă datorită perfecționării tehnologiei integratelor. Circuitele integrate VLSI (Very Large Scale Integration) ajung la 1 miliard de tranzistoare pe cip..

Calculatoarele din această generație se caracterizează prin următoarele:

-utilizarea circuitelor VLSI;

-apariția și dezvoltarea microprocesoarelor;

-dezvoltarea de noi tipuri de memorii (MOS, magnetice, holografice) și echipamente periferice orientate pe sesizarea primară a datelor;

-interconectarea calculatoarelor în rețele, însoțită de întrepătrunderea industriilor de calculatoare și telecomunicații;

-apariția și dezvoltarea mediilor de programe complexe cu puternice facilități grafice.

În această generație au apărut la început calculatoarele personale de tip Home Computer iar apoi cunoscutele Personal Computer, pe bază de microprocesoare; două dintre firmele cele mai importante care produl microprocesoare sunt INTEL și MOTOROLA.

1.3.1.6. Generația cincia

S-a încercat o definire a generației a cincia, prin formularea cerințelor ce stau în fața calculatoarelor la ora actuală, cerințe care cuprin următoarele:

-o interfață inteligentă care să permită dialogul pe bază de limbaj natural )voce, sunete, imagini, informație grafică);

-crearea unei mașini care să realizeze rașionament pentru rezolvarea problemei, fără cunoașterea prealabilă a algoritmului;

-baze de date imense cu o căutare foarte rapidă.

Tabelul 1.1. Tabel sintetic cu principalele evenimente din istoria calculatoarelor

Concepte noi în evoluția calculatoarelor

În afara progresului tehnologic, concepțiile noi au condus la o dezvoltare rapidă a sistemelor de calcul.. . Noile idei sunt legate, în primul rând, de arhitectura calculatoarelor. Menționăm doar cele mai importante dintre ele.

1.3.2.1. Microprogramarea

În 1951, Maurice Wilkes, un cercetător de la Universitatea din Cambridge, a sugerat construirea unei mașini pe trei niveluri, în loc de două câte erau până atunci. Noul nivel propus de Wilkes avea rolul ca setul de instrucțiuni să fie interpretat de microprogram, în loc să fie realizat direct pe partea electronică. Acest concept, numit microprogramare, a devenit dominant începând cu anii 70.

1.3.2.2. Inventarea sistemului de operare

A fost proiectat și introdus cu scopul de a automatiza sarcinile operatorului de calculator. Un sistem de operare este un program care acționează ca un intermediar între utilizator și partea fizică a sistemului de calcul și permite utilizarea eficace a componentelor unui calculator. Primul sistem de operare a fost realizat, în 1955, de către programatorii de la General Motors Research Center care au scris un astfel de program intitulându-l „a monitor program for the IBM 701”

Un pas foarte important în cadrul dezvoltării sistemelor de calcul a fost crearea sistemelor de operare cu timesharing de către MIT la începutul anilor 60. La sfârșitul anilor 60, se remarcă o serie de invenții precum sistemul de operare UNIX care are deja un sistem de fișiere sofisticat, gestiunea proceselor, interfață cu sistemul și o serie de instrumente specializate în tratarea unor sarcini specifice. Așa cum arată numele, marca depusă UNIX desemnează începutul sistemelor compatibile.

1.3.2.3. Memoria Cache

Memoria cache a fost o idee simplă dar foarte eficientă care a mărit de zece ori viteza de calcul a unui sistem.

1.4. TIPURI DE ARHITECTURI ALE CALCULATOARELOR NUMERICE

1.4.1. Arhitectura von Neumann

Într-un articol publicat în 1947, John von Neumann a expus niște principii care stau la baza calculatoarelor moderne. Acestea sunt:

-Existența unui mediu de intrare prin intermediul căruia să poată fi introdus un număr practic nelimitat de date și instrucțiuni.

-Existența unei memorii în care să fie depuși operanzii și instrucțiunile și de unde să fie preluate rezultatele în ordinea dorită.

-Existența unei secțiuni de calcul care să fie capabilă să execute operații aritmetice și logice asupra datelor din memorie.

-Existența unui mediu de ieșire prin intermediul căruia să poată fi comunicat utilizatorului un număr nelimitat de instrucțiuni.

-Existența unei unități de comandă capabilă să interpreteze instrucțiunile citite în memorie și, pe baza informațiilor citite în memorie și a informațiilor furnizate de secțiunea de calcul, să fie capabilă să decidă între mai multe variante de desfășurare a operațiilor.

-Datele și instrucțiunile trebuie să fie stocate în memorie sub aceeași formă.

Fig. 1.3. Modelul funcțional al mașinii John von Neumann

1.4.2. Mașina Turing

În 1936, matematicianul englez Allan Turing a creat un automat abstract care să opereze cu numere calculabile. Un număr calculabil este un număr a cărei parte zecimală poate fi determinată cu un număr finit de iterații.

Automatul a fost sintetizat pe baza următoarelor ipoteze:

a)Automatul are un număr n finit de stări.

b)Automatul se află în orice moment într-o stare i, 1≤i≥n, urmând ca

în momentul imediat următor să se afle în starea j, 1≤j≥n.

c)Fiecare din cele n stări se caracterizează prin:

-valoarea caracteristică ei, care este o valoare curentă a

numărului ce se calculează;

-funcția fj care aplicată stării ei permite obținerea următoarei stări ej .

-deplasamentul dij care va trebui aplicat numărului pentru a se realiza din starea i în starea j , adică j=i+dij

Modelul funcțional al mașinii construite pe baza acestor ipoteze este dat în figura 1.4.

C S

SR

Fig. 1.4. Modelul funcțional al mașinii Turing; SR-sistem reprezentativ; C/P-cip citire/scriere.

-Sistemul reprezentativ (SR) sau memoria mașinii este construit dintr-o bandă magnetică de lungime practic infinită, împărțită în segmente de lungime egală, fiecare segment putând stoca un număr finit de semne.

-Procesorul (P) este un circuit secvențial cu un număr finit de stări, care poate executa următoarele instrucțiuni, (setul de instrucțiuni al mașinii):

-schimbă segmentul de pe bandă de la poziția curentă;

-poziționează capul de citire (C ) cu o poziție la dreapta;

-poziționează capul de citire cu o poziție la stânga;

-oprește sistemul.

Pentru a realiza un calcul cu această mașină, se înscriu datele într-un mod convenabil și se descompune algoritmul de calcul, în funcție de modul de reprezentare a datelor, într-o secvență de instrucțiuni ale mașinii. Ultima instrucțiune este cea de oprire a mașinii.

1.5. CLASIFICAREA CALCULATOARELOR

Este destul de dificil să se clasifice tipurile de calculatoare din cauza multitudinii lor. Totuși, anumite taxonomii s-au impus. Vom prezenta trei clasificări după arhitectură și una strict comercială.

1.5.1. Taxonomia Flynn

A fost publicată în 1966 de către Flynn care avea în vedere existența într-un sistem de calcul a două fluxuri:

-fluxul de instrucțiuni, care reprezintă programul;

-fluxul de date, care reprezintă datele de intrare sau rezultatele parțiale.

Clasificarea lui Flynn ia în considerație gradul de multiplicitate ale celor două fluxuri și identifică patru tipuri de arhitecturi:

SISD (Single Instruction Single Data)

SIMD (Single Instruction Multiple Data)

MISD (Multiple Instructions Single Data)

MIMD (Multiple Instructions Multiple Data)

SISD realizează o execuție sequențială a instrucțiunilor (figura 1.5.). Principalul neajuns al acestei arhitecturi este viteza de execuție care , la un moment dat, este plafonată, situație denumită „gâtul sticlei lui Neumann” (Neumann Bottleneck). Spargerea acestei limitări este realizată prin arhitectura paralelă.

Fig. 1.5. Arhitectura SISD; UC-secțiunea de comandă a Unității centrale; UP-secțiunea de prelucrare a Unității centrale; MM-modul de memorie; FD-flux de date; FI-flux de instrucțiuni.

Arhitectura SIMD se caracterizează prin n unități de procesare (UP) care operează sub controlul unui flux unic de instrucțiuni (FI) lansat de o singură unitate de comandă (UC).

FD1

FD2

FI

FDn

Fig. 1.6. Arhitectura SIMD; UC-secțiunea de comandă a Unității centrale; UP-secțiuni de prelucrare a Unității centrale; MM-moduri de memorie; FD-flux de date; FI-flux de instrucțiuni.

Cele mai cunoscute mașini SIMD sunt calculatoarele vectoriale. Acestea transformă instrucțiuni care se execută în n pași într-o mașină SIMD, în instrucțiuni care se execută într-un singur pas. De exemplu, suma a doi vectori: c[i]=a[i]+b[i] pentru i=1…n se face într-un pas, fiecare Unitate de Prelucrare calculând o componentă a vectorului sumă.

MISD nu are nici un sens și de aceea nu este utilizată.

MIMD cuprinde două feluri de mașini:

-multiprocesoare și

-multicalculatoare.

Multiprocesoarele se caracterizează prin existența memoriei comune la care au acces n procesoare. Schimbul de informație dintre procesoare se face prin variabilele partajate din memoria comună la care au acces toate procesoarele, însă accesul trebuie făcut prin excludere mutuală pentru a realiza ceea ce se numește consistența memoriei.

Multicalculartoarele se caracterizeză prin existența unui număr foarte mare de calculatoare ( de la ordinul sutelor în sus) care sunt legate printr-o rețea topologică. Fiecare procesor are memoria lui locală, văzută doar de el, iar comunicarea între procesoare se face prin mesaje.

1.5.2. Taxonomia lui Wang

Această clasificare presupune o organizare matricială a datelor. O matrice de dimensiunea m x n are m cuvinte, fiecare cuvânt are o lungime de n biți. Criteriul de clasificare este gradul de paralelism în procesarea datelor organizate matricial. Conform acestui criteriu există patru tipuri de arhitecturi și anume:

-WSBS (Word Serial-Bit Serial) în care se lucrează pe un singur cuvânt, fiecare cuvânt fiind prelucrat serial bit cu bit, ns1, ms1….

-WSBP (Word Serial-Bit Paralel) în care se lucrează pe un singur cuvânt , biții fiecărui cuvânt fiind prelucrați simultan, n>1, ms1.

WPBS (Word Paralel-Bit Serial) în care se lucrează pe un singur bit la toate cuvintele simultan, ns1, m>1.

-WPBP (Word Paralel-Bit Paralel) în care se lucrează simultan pe toate cuvintele și pe toți biții, n>1, m>1.

WSBS nu are elemente de paralelism.

WSPB și WPBS sunt parțial paralele, fiind orientate pe prelucrarea vectorilor.

WPBP este complet paralel.

1.5.3. Taxonomia lui Shore

Spre deosebire de Flynn, Shore și-a bazat clasificarea pe modul în care este organizat calculatorul din părțile sale componente. Din acest punct de vedere, au fost identificate șase tipuri de mașini, fiecăreia atribuindu-se o cifră romană.

Mașina I are o arhitectură convențională von Neumann, cu următoarea structură:

-unitate de comandă (CU)

-unitate de procesare (PU)

-memorie pentru instrucțiuni (IM)

-memorie pentru date (DM)

(orizontal)

Fig. 1.7. Mașina I Shore.

O citire a DM produce toți biții unui cuvânt, care sunt prelucrați în paralel de PU, PU putând conține mai multe unități funcționale.

Această clasă include calculatoare vectoriale, de exemplu CRAY 1.

Mașina II este similară mașinii I, cu deosebirea că, în timp ce mașina I citește slice-uri orizontale, mașina II citește un slice vertical.

(vertical)

Fig. 1.8. Mașina II Shore

Exemple de calculatoare de tip mașina II Shore : ICL, DAP, STARAN etc.

Mașina III este o combinație a mașinilor I și II. Un exemplu de astfel de mașină este calculatorul ortogonal Shooman(1970)

(orizontal)

(vertical)

Fig. 1.9. Mașina III Shore

Masina IV se obține prin multiplicarea unităților PU și DM din mașina I și prin trimiterea acestui ansamblu de la o singură unitate de control UC. Exemplu: PEPE.

Fig. 1.10. Mașina IV Shore

Mașina Veste exact mașina IV cu facultatea suplimentară că unitățile PU sunt așezate pe o linie și se asigură conexiuni între vecinii cei mai apropiați; fiecare PU poate adresa informații din memoria sa dar și din cea a vecinilor săi imediați. Este un masiv conectat. Exemplu: ILIA CIV.

Mașina VI este denumită mașina cu logica în memorie. Este o abordare alternativă a distribuirii comenzii în memorie.

Fig. 1.11. Mașina VI Shore

Exemplu: calculatoare cu memorii asociative.

1.5.4. Clasificare comercială

Dacă primele trei clasificări erau strict legate de arhitectură, clasificarea următoare are ca punct de vedere piața de calculatoare. Sistemele de calcul pot fi:

-calculatoare personale;

-servere;

-sisteme dedicate.

Calculatoarele personale sunt cele mai populare. Au cel mai mic cost și în ultimii ani s-au produs 150-200 milioane pe an. Prețul lor nu depășește suma de 10000 dolari.

Serverele sunt destinate să ofere servicii tot mai sofisticate de rețea. Costul lor este de 10.000 – 10.000.000 dolari. În ultimii ani s-au produs aproximativ 4 milioane servere pe an.

Sistemele dedicate sunt construite pentru anumite aplicații speciale. Costul lor este de 10.000-100.000 dolari.

TRENDUL ÎN ARHITECTURA CALCULATOARELOR

Din punct de vedere tehnologic cele mai importante tendințe sunt:

-gradul de integrare al tranzistorilor pe cip crește cu cca. 55% pe an; tehnologia de integrare a microprocesoarelor a evoluat de la 10 microni (1971) la 0,18 microni 2001.

-frecvența ceasului crește și ea cu 50% pe an;

-pentru memoriile DRAM, densitatea de integrare crește cu cca 40-50% pe an, iar timpul de acces aferent scade cu 3 % pe an.

-tehnologia și performanțele rețelelor se îmbunătățesc semnificativ.

Se poate spune că aceste tendințe respectă legea lui Gordon Moore, cofondator împreună cu Obert Noyce a societății INTEL. Acesta, în 1965, enunță celebra sa lege: „numărul de tranzistori din circuitele integrate se va dubla la fiecare doi ani” . Aceasta înseamnă că, la fiecare 10 ani se schimbă prefixul de măsurare, adică totul crește de 1000 de ori. Într-adevăr, dacă hard discurile din anii 90 aveau 100 MB, în 2000 ele au 100 GB. Frecvența ceasului era în 1990 de 8 MHz iar în 2000 era de 1 GHz etc.

Ceea ce s-a întâmplat într-adevăr cu procesoarele INTEL în ultimele trei decenii se poate constata din tabelul de date reale dat în continuare, date care verifică destul de bine legea lui Gordon.

Tabelul 1.2. Evoluția procesoarelor Intel între 1972 și 2000

Între cele mai evidente tendințe de evoluție în arhitectură amintim:

-exploatarea paralelismului la nivelul instrucțiunilor și firelor de execuție, atât prin tehnici statice (soft) cât și dinamice(hard); există și tehnici hibride cum ar fi cazul procesorului Intel Ithamium IA-64;

-structuri tot mai performante de ierarhizare a sistemului de memorie prin utilizarea arhitecturilor evoluate de memorie cache;

-reducerea latenței ………critice de program, prin tehnici de predicție;

-utilizarea microprocesoarelor Shered memory în special în cadrul arhitecturii serverelor și stațiilor grafice.

Capitolul 2

UNITATEA CENTRALĂ

Unitatea centrală (UC), în engleză CPU=Central Processing Unit, este partea din calculator care are rolul de a interpreta și executa instrucțiunile unui program, de a citi sau salva în memorie rezultatele și de a comunica cu unitățile de schimb. Toate aceste activități sunt cadențate de un ceas la frecvență constantă care împarte timpul în fracțiuni de aceeași durată numite cicluri.

2.1. STRUCTURA UNITĂȚII CENTRALE

Unitatea Centrală are în componență:

-Unitatea Aritmetică și Logică (UAL);

-Unitatea de comandă (UCd);

-Registrele generale (RG).

a) Unitatea Aritmetică și Logică (UAL)

UAL execută operații aritmetice (adunare, scădere, înmulțire împărțire, complement față de 1, complement față de 2 etc.) , operații logice (negare, și, sau, suma modulo 2), decalaje și rotații. Are două intrări de date, pe n biți, o ieșire corespunzătoare operației efectuate, pe n biți, eventual o ieșire corespunzătoare flagurilor poziționate de operație și o intrare de comandă care selecționează operația de efectuat.

Toată Unitatea Aritmetică și Logică este grupată în jurul unui sumator paralel care poate aduna conținutul a două registre multiplexate la cele două intrări ale sumatorului. Operațiile de înmulțire și împărțire se realizează, cu ajutorul diferiților algoritmi, prin adunări și deplasări stânga/dreapta succesive. Scăderea se realizează ca o adunare cu complementul scăzătorului.

Schema unei UAL este dată în figura 2.1.

Fig 2.1. Schema bloc UAL

b) Unitatea de Comandă (UCd)

Unitatea de comandă este formată din:

-Generatorul de Faze (GF);

-Generatorul de Tact (GT);

-Blocul Circuitelor de Comandă (BCC).

Blocul circuitelor de comandă (BCC) dirijează toate operațiile executate în cadrul unei instrucțiuni. Există microoperații, care sunt operațiile elementare executate într-o instrucțiune, și microcomenzi, care sunt semnalele generate de BCC pentru execuția microoperațiilor. Microcomenzile sunt trimise elementelor de execuție din structura calculatorului: registre, UAL, memorie, porturi etc. O instrucțiune este, de fapt, o succesiune de microoperații.

Toate microoperațiile care se execută în același timp definesc o stare în execuția unei instrucțiuni, stare numită fază.

Generatorul de faze (GF) construiește succesiunea fazelor necesară pentru execuția instrucțiunii.

Generatorul de tact (GT) dă cadența schimbărilor de stare pentru toate circuitele secvențiale.

c) Registrele generale (RG)

Registrele generale (RG) sunt considerate o memorie foarte rapidă și de foarte mică capacitate. Structural fac parte din UC și, în marea majoritate a arhitecturilor, ele sunt adresabile pe magistrală.

Există două moduri de conexiune a registrelor generale:

-RG conectate direct între ele:

-RG conectate la magistrale.

2.2. CARACTERISTICILE UNITĂȚII CENTRALE

Performanțele în funcționarea unei Unități Centrale sunt redate prin următoarele caracteristici:

-Lungimea cuvântului;

-Frecvența ceasului;

-Numărul de instrucțiuni executate în unitatea de timp;

-Gradul de paralelism.

Lungimea cuvântului

Calculatoarele lucrează cu ajutorul cuvintelor de cod a căror cantitate de informație este măsurată în biți. Numărul de biți reprezintă lungimea unui cuvânt și este multiplu de doi. Un cuvânt poate reprezenta:

-o instrucțiune;

-un segment de date.

Într-un calculator, lungimea cuvântului se identifică cu numărul de biți ai instrucțiunii. Cele mai noi calculatoare au instrucțiuni pe 64 biți. Aceasta este o caracteristică principală a UC .

Nu este obligatoriu ca lungimea cuvântului să fie aceeași cu dimensiunea magistralei de memorie pe care se aduc instrucțiunile din UM în UC. Un calculator poate avea, de exemplu, lungimea instrucțiunii de 64 biți și lărgimea magistralei de 32 biți; pentru aducerea unei instrucțiuni din memorie sunt necesare, în acest caz, două apeluri la memorie.

2.2.2. Frecvența ceasului

Orice calculator are un generator de impulsuri, numit ceasul unității centrale.. Acesta este realizat cu un cuarț care emite impulsuri cu frecvență fixă. Ceasul inițial suferă două tipuri de operații:

-operația de divizare a ceasului, ceea ce înseamnă că ceasul inițial, cu cuarț, suferă modificarea frecvenței sale;

-operația de amplificare a semnalului de ceas.

Pe acest ceas, care este inima calculatorului, au loc toate evenimentele hard din UC.

2.2.3. Numărul de instrucțiuni executate

în unitatea de timp

Dacă facem următoarele notații:

f = frecvența ceasului, în Hz

N = numărul mediu de ceasuri în care se execută o instrucțiune

n = numărul de instrucțiuni executate într-o secundă

atunci

De exemplu, pentru un calculator care are frecvența ceasului de 2 GHz și care execută două instrucțiuni pe ceas, numărul de instrucțiuni executate în unitatea de timp este:

miliarde instrucțiuni pe secundă

Pentru calculatoarele moderne se adoptă o unitate de măsură numită MIPS (milioane de instrucțiuni executate într-o secundă). În exemplul precedent, parametrul n va fi de 4000 MIPS.

Trebuie precizat că acest parametru (n) este mai aproape de adevăr decât frecvența ceasului (f). Există calculatoare cu frecvență mai mică dar care sunt inferioare calculatoarelor cu frecvența ceasului mai mare, tocmai datorită mărimii N. De exemplu Intel 586 cu frecvența 100 MHz și Pentium I cu frecvența 66 MHz. Ar fi mai bine să fie afișat parametrul n în locul parametrului f, dar partea dificilă este calcularea practică a lui N. Este dificilă, deoarece, în setul de instrucțiuni, fiecare are N diferit și chiar aceeași instrucțiune are N diferit în funcție de contextul rulării.

2.2.4. Gradul de paralelism

Există două feluri de paralelism:

-paralelism la nivel de instrucțiuni (pipeline)

-paralelism la nivel de procesor.

2.2.4.1. Paralelism la nivel de instrucțiuni (pipeline)

a)Principiul pipeline-ului este acela al liniei de montaj (de asamblare):

-împărțirea unei sarcini în mai multe subsarcini de durate egale, numite etaje;

-executarea simultană a diferitelor subsarcini din mai multe sarcini.

În felul acesta se mărește debitul de sarcini al sistemului. Sistemul va fi caracterizat prin doi parametri: durata individuală a unui etaj (T) și numărul de etaje (l)din pipeline. Latența L este durata totală de execuție a unei sarcini: L= lT

Debitul, d, al pipeline-ului depinde de numărul n de sarcini de executat. Timpul necesar pentru execuția în pipeline a n sarcini este timpul de execuție a primei sarcini, L= lT, plus timpul necesar pentru a le termina pe celelalte n-1 următoare:

sau, la limită:

Apare rezultatul esențial: pentru un mare număr de sarcini, debitul nu depinde de latență ci de durata individuală a fiecărui etaj. Deci, debitul optimal va fi atins fracționând cât mai fin posibil sarcina în subsarcini. Evident, fracționarea are limite tehnice.

b)Clasicul pipeline pentru execuția instrucțiunilor

În calculatoare, pipeline-ul constă în fracționarea execuției unei instrucțiuni în mai multe module, fiecare modul executând hard o parte de instrucțiune. Conceptul de pipeline înseamnă de fapt o bandă de asamblare cu segmente, fiecare segment executând o parte de instrucțiune.

De exemplu, o bandă de asamblare cu 5 segmente. Aceste 5 segmente sunt:

S1 – unitate de extragere a instrucțiunii

S2 – unitate de decodificare a instrucțiunii

S3 – unitate de calcul și extragere a operanzilor

S4 – unitate de execuție propriu zisă a operației instrucțiunii

S5 – unitate de scriere a rezultatelor

(a)

(b)

Fig.2.2. Schema unei benzi de asamblare cu 5 segmente; (a) schema de funcționare; (b)diagrama temporară a execuției segmentelor.

Din figura 2.2. se observă cum funcționează paralelismul într-o bandă de asamblare, la un moment de timp fiecare segment executând unul din cele 5 segmente de instrucțiune diferite. Dacă timpul de execuție a unui segment este de 1 secundă, (t1=t2=…….=t10=t11=1s) atunci timpul de execuție a 7 instrucțiuni este, așa cum se vede în figură, de 11 secunde. Pe o mașină normală, fără pipeline, timpul de execuție a 7 instrucțiuni, fiecare necesitând 5 secunde, ar fi de 35 sec. Efectul se vede în creșterea debitului în executarea instrucțiunilor.

Există și sisteme cu două benzi de asamblare, ca în figura 2.3.

Fig.2.3. Pipeline cu două benzi de asamblare.

Un astfel de sistem are o singură unitate de extragere a instrucțiunii (S1) care extrage perechi de instrucțiuni și le plasează pe cele două benzi. Condiția de a lucra în paralel este ca cele două instrucțiuni să nu își dispute aceeași resursă și să nu depindă una de rezultatul celeilalte. Această condiție este garantată fie de compilator , fie de un hard suplimentar dotat cu un sistem de predicție.

Calculatoarele Pentium I erau dotate cu două benzi de asamblare:

-bandă de asamblare U (U pipeline), bandă principală, care putea executa orice instrucțiune;

-bandă de asamblare V (V pipeline), care putea executa doar instrucțiunile simple în numere întregi și o singură instrucțiune simplă în virgulă mobilă.

Existau reguli destul de complicate pentru împerecherea instrucțiunilor. Erau extrase câte două instrucțiuni și dacă erau compatibile erau executate, dacă nu, se executa doar prima pe banda U, a doua fiind păstrată și împerecheată cu cea care urma. În acest mod, s-a constatat că Pentium I era de două ori mai rapid decât un 586 la aceeași frecvență.

c) Arhitecturi suprascalare

Pornind de la ideea benzilor de asamblare , s-a ajuns la concluzia că este mai benefic de a avea o singură bandă de asamblare dar cu mai multe unități funcționale. O astfel de arhitectură se numește superscalară, termen introdus de Agerwals și Cocke în 1987. În figura 2.4. este dată o astfel de arhitectură.

S4

Fig. 2.4. Procesor superscalat cu 5 unități funcționale.

Ideea arhitecturii superscalare este că segmentul S3 poate lansa instrucțiuni mult mai rapid decât le poate executa S4, deci, la o bandă simplă există o gâtuire de timp între S3 și S4. La arhitectura superscalară, se împarte unitatea de execuție S4 în unități funcționale pe tipuri de instrucțiuni (de încărcare,LOAD, de memorie, STORE, de virgilă mobilă)

2.2.4.2. Paralelism la nivel de procesor

Banda de asamblare sau arhitectura superscalară nu cresc performanțele în mod simțitor. Mult mai eficientă este mărirea numărului de procesoare. Acest lucru se întâmplă în :

-mașinile SIMD, calculatoare vectoriale;

-mașinile MIMD, multiprocesoare;

-mașinile MIMD, multicalculatoare.

MODURI DE ADRESARE

După posibilitatea găsirii operanzilor, există mai multe moduri de adresare:

-adresare imediată;

-adresare directă;

-adresare indirectă;

-adresare indexată.

Adresare imediată

Operandul se află chiar în câmpul instrucțiunii.

Instrucțiune

Câmp operand

MOV R 20000

Se transferă valoarea 20000 în registrul R.

Adresare directă

Operandul se găsește la o adresă care există în instrucțiune

Câmp adresă

OPERAND

MOV R 100

100 20000

În câmpul de adresă al instrucțiunii se află o adresă (100) la care există operandul.

c) Adresare indirectă

În câmpul de adresă al instrucțiunii se află o adresă. La acea adresă se află operandul. Numărul de indirectări depinde de fiecare calculator în parte.

Câmp adresă

ADRESĂ OPERAND

MOV R 100

100 200

20000

La adresa 100 din câmpul instrucțiunii se află altă adresă, 200, iar la această adresă se află operandul.

Adresare indexată

La adresarea indexată participă un registru numit registru INDEX. Adresa operandului este:

Adresa operand = valoareCÂMP ADRESĂ + valoareREGISTRU INDEX

MOV R 100

RINDEX 600

700

Adresa calculată: 600 + 700 = D00

D00 20000

UNITATE CENTRALĂ CABLATĂ

Într-o UNITATE CENTRALĂ CABLATĂ toate transferurile se fac în mod hard, de către o unitate de comandă. Părțile componente ale unei astfel de UC, aleasă ca exemplu (figura 2.5.), sunt:

-registrul A, numit registru acumulator (32 biți);

-registrul T, numit registrul tampon, cu rol de a păstra rezultatele parțiale, (32 biți);

Bus local în UC

Bus memorie

RG

IC

Fig. 2.5. Schema bloc a unei unități centrale cablate.

-registrul M, care are rolul de a reține datele scrise sau citite din unitatea de memorie (32 biți);

-registrul RI, care are rolul de a stoca instrucțiunea pe toată durata execuției sale;

-registrul PC, care are rolul de a reține adresa următoarei instrucțiuni din program;

-registrul ADRMEM, care adresează memoria, atât la scriere cât și la citire;

ADRMEM ADRMEM

M UM M UM

citire scriere

de asemenea, prin ADRMEM se adresează și cele 16 registre generale (RG), dar pe bus-ul local nu pe cel al memoriei; adresele de registre generale sunt primele 16 adrese de memorie, adrese rezervate exclusiv pentru RG, neputând fi utilizate ca adrese de memorie;

-!6 registre generale (RG) adresate pe bus-ul local al UC-ului;

-registrul INDEX , care participă la calculul adresei în mod indexat;

-4 indicatori de condiție (ZC) cu următoarele semnificații:

Z arată două situații

Compararea între registrele A și T

Z=1 → A=T

Z=0 → A≠T

Conținutul acumulatorului este zero (Z=1)

S S=1 rezultat negativ (în A)

D D=1 depășire

C C=1 transport

-BUS-ul local, un bus foarte rapid în interiorul UC-ului;

-BUS-ul de memurie, un bus mai lent care face legătura UC↔UM;

Convențional, o adresă este o adresă de octet. Un cuvânt este pe 32 biți, deci pe 4 octeți.

Adresele din PC vor evolua cu 4, următoarea adresă de instrucțiune fiind PC+4.

Adresele celor 16 registre generale sunt:

O instrucțiune are 32 biți și are următoarea structură:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

COD MS SURSA MD DESTINAȚIE

COD – 4 biți – codul instrucțiunii (calculatorul are 16 instrucțiuni)

MS – modul operandului sursă – 2 biți

00 – mod imediat

01 – mod direct

10 – mod indirect

11 – mod indexat

SURSA – câmpul operandului SURSA – 12 biți

MD – modul destinație

00 – mod imediat

01 – mod direct

10 – mod indirect

11 – mod indexat

DESTINAȚIE – câmpul operandului DESTINAȚIE – 12 biți

Setul de instrucțiuni executate de acest calculator este de numai 16 instrucțiuni.

Tabelul 2.1. Lista de instrucțiuni a calculatorului

Fiecare instrucțiune, pentru a fi executată, are o serie de comenzi care, la UC cablată, sunt efectuate de către partea hardware a unității centrale.

Orice instrucțiune are o parte comună care se numește ifetch (instructionfetch) și care este partea de aducere a instrucțiunii din memorie în UC. Ea are următoarele comenzi:

PC → ADRMEM

ADRMEM

M ← UMEM

CITIRE

M → RI

PC → PC + 4

În continuare, să vedem care sunt comenzile pentru diferite instrucțiuni care lucrează în diferite tipuri de adrese.

1)

COD 0001

MNEMONIC ADD

MS 00 – imediat

SURSA 02A

MD 00 – imediat

DESTINAȚIA – 05B

Adresa instrucțiunii 100

Instrucțiunea este

000A805B

Comenzi:

ifetch: PC → ADRMEM 100

ADRMEM

M ← UMEM 000A805B

CITIRE

M → RI 000A805B

PC → PC + 4 104

RI7-18 → A 0000 002A

RI21-32 → T 0000 005B

A + T → A 0000 0085

A → RI 0000 0085

2)

COD 0001

MNEMONIC MOV R5 ABCDEF01

MS 01 – direct

SURSA RG5 10

MD 01 – direct

DESTINAȚIA – RG16 3C

Adresa instrucțiunii 200

Instrucțiunea este 0404103C

Comenzi:

ifetch: PC → ADRMEM 200

ADRMEM

M ← UMEM 0404103C

M → RI 0404103C

PC → PC + 4 204

RI7-18 → ADRMEM 10

ADRMEM

M ← RG5 ABCDEF01

RI21-32 → ADRMEM 3C

ADRMEM

M ← RG16 ABCDEF01

3)

COD 0010

MNEMONIC CMP

MS 10 – indirect

SURSA 800 800 F00

MD 10 – indirect 900 E00

DESTINAȚIA – 900 F00 ABCDEF01

Adresa instrucțiunii 200 E00 ABCDEF01

Instrucțiunea este 1A002900

Comenzi:

ifetch: PC → ADRMEM 200

ADRMEM

M ← UMEM 1A002900

M → RI 1A002900

PC → PC + 4 204

RI7-18 → ADRMEM 800

ADRMEM

M ← 800 F00

M → ADRMEM F00

ADRMEM

M ← F00 ABCDEF01

M → A ABCDEF01

RI21-32 → ADRMEM 900

ADRMEM

M ← 900 E00

M → ADRMEM E00

ADRMEM

M ← E00 ABCDEF01

M → T ABCDEF01

A compara cu T → pozit lui Z=1

prm Σ

UNITATE CENTRALĂ CU MICROPROCESOR

Microprocesorul este o unitate centrală de prelucrare a datelor (UCP), realizată într-un singur circuit integrat. Vom exemplifica o arhitectură de microprocesor pe INTEL 8086, primul microprocesor pe 16 biți.

Schema generală a unui microprocesor 8086

Microprocesorul 8086 are două componente:

-Unitatea de execuție (UE);

-Unitatea de interfață cu bus-urile(UI)

Structura acestui microprocesor este de tip pipeline, adică este o structură în bandă de asamblare cu două segmente: UE și UI.

UE decodifică instrucțiunile numerice, elaborează comenzi interne pentru efectuarea calculelor și comenzi externe către cea de-a doua unitate. UE conține 8 locații de memorie internă numite registre de uz general.

UI calculează adresele de memorie și de intrare/ieșire, transferă datele între UE și memorie, între UE și I/O și transferă către UE codurile numerice ale instrucțiunilor citite în memorie.

Cele două segmente efectuează autonom secvențe de operații proprii, transferându-și în același timp informații. Secvențele de operații efectuate de cele două unități ale microprocesorului pentru a executa instrucțiunile se numesc cicluri de instrucțiune, pentru UE și cicluri mașină de bus, pentru UI.

a)Structura UE

UE are componentele:

-Unitatea aritmetică-logică (UAL), în engleză Arithmetic-Logic Unity (ALU), care execută operații aritmetice și logice, deplasări și rotații.

-Registrele temporare (RT), care preiau operanzii de pe bus-ul intern și îi oferă unității UAL. Împreună cu UAL formează un automat.

-Registrul de flaguri, F, care conține indicatorii de stare ALU ai ultimei operații; registrul este actualizat de către ALU.

-Blocul de comandă, care decodifică codul instrucțiunii curente, preluată din coada de așteptare Q, execută operația și elaborează comenzi externe pentru UI.

UE este complet separată de exterior, toate sarcinile privind transferul cu exteriorul revenind UI-ului.

20biți

16 biți

8biți 8biți

Ax

Bx Registre de offset

date

Cx

Dx

Registre de

adrese

Bus intern 4biți

A16.-19

AD0-15

BD0-15

RT

BC

Coadă de așteptare

Instrucțiuni (Q)

F

UE UI

Fig. 2.6. Arhitectura internă a microprocesorului 8086.

b)Structura UI

UI conține componentele date în continuare.

1)Blocul de interfață între bus-uri, care face transferurile UE.

Are următoarele cicluri:

-cicluri de scriere memorie sau I/E (UC→MEM , I/E)

-cicluri de citire memorie sau I/E (UC←MEM , I/E)

2)Coada de așteptare a codurilor de instrucțiuni (Q), care:

-este încărcată de către UI cu coduri de instrucțiune, numai în momentele de timp când UE nu are transferuri de date;

-este inactivă dacă este plină sau se cer transferuri pe bus;

-este ștearsă complet dacă instrucțiunea este de salt.

3)Blocul de calcul al adreselor fizice, care include:

-registrele de segment ce conțin componenta segment a adresei locației de memorie accesată;

-registrul indicator al instrucțiunii curente (IP) cu componenta offset a adresei instrucțiunii curente;

-unitate de deplasare-adunare pentru calculul adresei fizice din componentele segment și offset .

2.5.2. Registrele microprocesorului

Registrele microprocesorului 8086 au o capacitate de 16 biți și pot fi clasificate în patru grupe, în funcție de rolul pe care îl au în execuția instrucțiunilor.

-Registre generale.

-Registre segment.

-Registru indicator al adresei instrucțiunii curente IP.

-Registru de flaguri,F, și registrul IP.

2.5.2.1. Registre generale

Registrele generale se impart în două seturi de registre:

-Registre de date: Ax,Bx,Cx,Dx.

-Registre de adresare: SP, BP, SI, DI.

a)Registre de date

Există patru registre de date de 16 biți:

Ax-acumulator;

Bx-baza în adresarea datelor;

Cx-contor;

Dx-date.

Fiecare din aceste registre pot fi împărțite în două registre de 8 biți:

Registrele de date sunt utilizate în majoritatea instrucțiunilor aritmetice și logice. Majoritatea instrucțiunilor aritmetice utilizează în același mod toate registrele. Există și instrucțiuni aritmetice pentru care anumite registre generale au întrebuințări speciale. De exemplu:

Ax – operații de intrare/ieșire pe 16 biți, înmulțiri și împărțiri pe 16 biți;

AL – operații de intrare/ieșire pe 8 biți, translații, aritmetice BCD, înmulțiri și împărțiri pe 8 biți;

AH – înmulțiri și împărțiri pe 8 biți;

Bx – operații cu memoria, adresare indirectă, translații;

Cx – operații cu șiruri, bucle program;

CL – operații de deplasare sau rotație cu mai mult de o poziție;

Dx – operații de intrare/ieșire, adresare indirectă, înmulțiri și împărțiri pe 16 biți.

b)Registre de adresare

Sunt de două tipuri:

1)Registre indicatoare de adresă în stivă (pointer):

-SP (Stack Pointer), care conține adresa curentă a vârfului stivei;

-BP (Base Pointer), care conține adresa bază pentru adresarea indirectă a stivei.

2)Registre indicatoare de adrese pentru șiruri (index):

-DI (Destination Index)–conține adresa curentă pentru șirul destinație;

-SI (Source Index)–conține adresa curentă pentru șirul sursei.

Registrele de adresare pot fi utilizate și pentru anumite instrucțiuni aritmetico-logice.

Registrele pointer conțin componente offset ale adreselor de stivă (adresele relative în segmentul de stivă curent) .

Registrul BP poate fi utilizat și pentru adresarea în cadrul altor segmente.

Registrele index conțin componente offset ale adreselor variabilelor (adrese relative în segmentul de date curent). Ele sunt utilizate ca registre de adresare și instrucțiunile de transfer sau prelucrări de șiruri de caractere. În acest ultim caz registrul SI conține adresa relativă curentă a șirului destinație în cadrul segmentului de date curent (DS), iar DI conține adresa relativă curentă a șirului sursă în cadrul segmentului de date suplimentar (ES).

2.5.2.2. Registrele segment

Spațiul de memorie pe care poate să-l adreseze un microprocesor 8086 este împărțit în segmente logice de lungime 64KO. Există patru registre segment:

-CS (Cod Segment), care conține componenta segment a adreselor codului (instrucțiunile programului);

-DS (Data Segment), care conține componenta segment a adreselor variabilelor (segment date curent);

-ES (Extra Segment), care conține componenta segment a adreselor variabilelor (segment suplimentar);

-SS (Stack Segment), care conține componenta segment a adreselor datelor din segmentul stivă.

Instrucțiunea care urmează să fie executată se găsește în segmentul a cărui adresă se află în registrul CS, la adresa relativă conținută în IP.

Conținutul registrului DS definește segmentul de date curent. Toate referirile la datele din memorie, cu excepția celor prin registrele BP șiSP sau registrul DI în instrucțiunile pentru șiruri, utilizează în mod implicit segmentul referit de DS.

Conținutul registrul ES definește segmentul de date suplimentar. Referirile la date în instrucțiunile pentru șiruri utilizează în mod implicit segmentul referit de ES.

Conținutul registrului SS definește segmentul curent al stivei. Toate referirile la datele din memorie prin registrele BP și SP utilizează în mod implicit segmentul referit de registrul SS.

2.5.2.3. Registrele IP și F

Registrul indicator al adresei curente , IP (Instrucțion pointer), este un registru de 16 biți care conține componenta ofset a adresei instrucțiunii în segmentul de cod curent.

Programele nu au acces direct la IP, dar există instrucțiuni care îl modifică și îl încarcă sau îl descarcă prin stivă.

Registrul de flaguri F cuprinde biții indicatori de stare și control, numiți și flaguri. Aceste flaguri sunt utilizate pentru a memora informații referitoare la rezultatul unor operații aritmetice și logice (OF, SF, ZF, AF, PF, CF) și pentru memorarea unor informații de control al microprocesorului (TF, DF, IF). Semnificațiile acestor flaguri sunt date în continuare.

-CF (Carry Flag) reflectă transportul în exterior al bitului cel mai semnificativ al rezultatului operațiilor aritmetice. CF=1 înseamnă un transport la operația de adunare. CF mai este modificat la operațiile de rotație și deplasare.

-PF (Parity Plag) este indicator de paritate, el fiind 1 dacă rezultatul are paritate pară; de asemenea acest indicator este utilizat și de instrucțiunile de aritmetică zecimală.

-AF (Auxiliary Cary Flag) este indicator de transport auxiliar și este 1 dacă a fost transport de la jumătatea de octet inferioară la jumătatea de octet superioară; este utilizat la instrucțiunile de aritmetică zecimală;. -ZF (Zero Flag) este indicatorul de zero, având valoarea 1 dacă rezultatul operației a fost zero;

-SF (Sign Flag), indicatorul de semn, este 1 dacă cel mai semnificativ bit al rezultatului este 1, adică, în reprezentarea numerelor în complement față de 2, rezultatul este negativ.

-OF (Overflow Flag), indicatorul de depășire aritmetică, a gamei de valori posibil de reprezentat, este 1 dacă dimensiunea rezultatului depășește capacitatea locației memoriei.

-IF (Interrupt Flag), indicatorul de validare a întreruperilor, este 1 dacă se pot valida întreruperile externe mascabile și 0 dacă întreruperile externe sunt invalidate. De remarcat că acest flag nu afectează întreruperile interne sau pe cele externe nemascabile.

DF (Direction Flag) este utilizat de instrucțiunile pe șiruri de caractere și specifică direcția de parcurgere a lor:

0 – de la adrese mici spre adrese mari;

1 – de la adrese mari spre adrese mici.

-TF (Trace Flag) este utilizat pentru controlul execuției instrucțiunilor în regim pas cu pas în scopul depănării programelor. Dacă este 1, după execuția fiecărei instrucțiuni se va genera un semnal de întreruperi intern.

Adresarea memoriei. Segmentarea memoriei.

Intel 8086 poate adresa un spațiu de memorie din memoria principală (MP) de 1 Moctet. Conform convenției INTEL, datele formate din mai mulți octeți sunt memorate cu octetul cel mai semnificativ la locația de adresă cea mai mare, adică octetul cel mai puțin semnificativ este memorat la adresa cea mai mică.

Intel 8086 vede memoria principală organizată ca un grup de segmente. Un segment este un bloc de memorie de dimensiune 64 Kocteți. Fiecare segment poate fi accesat, în scriere sau în citire, în mod independent.

Procesoarele pot lucra în două moduri: modul real și modul protejat.

În modul real procesoarele adresează memoria principală printr-o adresă fizică directă.

În modul protejat, procesoarele adresează memoria principală ca pe o memorie virtuală. O adresă virtuală este, de fapt, un nume pentru o locație de memorie pe care procesorul o translatează într-o adresă fizică corespunzătoare. O adresă virtuală are două componente: o adresă de bază (segment) și un deplasament (ofset). Notația consacrată pentru adresa logică este:

Segment : offset

Trecerea de la adresa logică la adresa fizică se face astfel:

Adresa logică → adresă fizică

Adresă fizică = segment x 10(+) + offset

Înmulțirea cu zece a unui număr în …. înseamnă deplasarea spre stânga cu o poziție. Exemple:

adresa logică ABC4 : EFB8

adresa fizică = ABC40 + EFB8 = BACF8

adresa logică AB00 : CD00

adresa fizică = AB000 + CD00 = B7D00

Această adresă fizică este calculată în UI în funcție de modul de adresare.

Structura pe segmente a memoriei face posibilă scrierea unor programe care sunt independente de poziția lor în memorie, adică sunt relocabile dinamic. Pentru ca un program să fie relocabil trebuie să fie scris astfel încât să nu altereze registrele sale segment și să nu facă transferuri directe de la o locație în afara segmentului de cod. Aceasta permite programului să fie mutat oriunde în memoria disponibilă, atâta timp cât registrele segment sunt actualizate cu noua adresă de bază.

2.5.4. Formatul instrucțiunii

Instrucțiunile, codificate în binar, pot ocupa în memorie de la 1 la 6 octeți. Codul instrucțiunii este format din:

-codul operației care ocupă 1 sau 2 octeți și care specifică:

-tipul operației;

-tipul operanzilor (8 sau 16 biți);

-sursa operanzilor (internă sau externă);

-destinația rezultatelor operațiilor ALU;

-modul de calcul al EA;

-operanzii de tip imediat: date și adrese.

Fig.2.7. Formatul instrucțiunii cu cod pe un octet.

Semnificațiile câmpurilor din figura 2.7. sunt date în continuare.

D – destinație. Specifică direcția rezultatului în combinație cu câmpurile MOD și R/M.

W – word. Specifică tipul de transfer. W = 0 înseamnă transfer pe un octet iar W = 1, transfer pe 2 octeți (1 cuvânt).

MOD este o codificare a modului de calcul al adresei efective sau lungimea deplasamentului. Este utilizat pentru a determina adresa efectivă împreună cu câmpul r/m.

MOD = 1 1, câmpul r/m este un câmp de registru cu următoarele semnificații:

MOD = 00, câmpul deplasament nu este prezent

MOD = 01, câmpul deplasament are 8 biți (low)

MOD = 10, câmpul deplasament are 16 biți.

R/M conține:

-adresa unui registru (pentru MOD=11)

-o codificare utilizată pentru calculul adresei efective.

Unitatea de execuție (UE) are acces la operanziiimediați și de registre; când este nevoie de un operand de memorie, se transmite la UI deplasamentul acestuia și registrul de segment IC determină adresa fizică a operandului în funcție de modul de adresare.

Moduri de adresare

Există, în principal, cinci moduri de adresare.

Adresare directă

Adresa efectivă (AE) a operandului este reprezentată de deplasamentul conținut în instrucțiune.

Fig. 2.8 Adresare directă. AE, adresă efectivă. AS, adresă segment. AF, adresă fizică.

Adresare indirectă prin registre

În câmpul calculat nu se află operandul, ca la adresarea directă, ci o altă adresă de operand.

Memorie

Fig. 2.8. Adresare indirectă prin registre.

Sintaxa instrucțiunilor în limbajul de asamblare utilizează pentru adresarea indirectă operatorul [ ]. De exemplu: mov ax, [bx], se deplasează la adresa conținută de bx.

Adresare indexată

La calculul adresei participă și un registru index (SI sau DI în cazul procesoarelor 8086).

Memorie

Fig. 2.9. Adresare indexată

Adresa se obține din suma registrului index și deplasamentul din instrucțiune.

Acest mod de indexare este utilizat, în cele mai multe cazuri, pentru referirea elementelor unui vector. Deplasamentul marchează începutul vectorului iar registrul index selectează elementul prin poziția sa relativă în cadrul vectorului. Deoarece toate elementele vectorului sunt de aceeași lungime, prin operații aritmetice elementare asupra registrului index se va selecta orice element. De aceea se poate specifica un factor de scală (1,2,3,4) pentru index, pentru a referi vectori cu componente de lungime fixă de 1,2,3,4 octeți.

Fig. 2.10. Referirea vectorilor de lungime fixă în adresarea indexată.

Adresare imediată

În acest caz operandul se află chiar în instrucțiune.

Fig. 2.11. Adresare imediată.

2.5.5.5. Adresarea porturilor de intrare/ieșire

Porturile de intrare/ieșire se adresează unde aceeași adresă se găsește în instrucțiune, pe 8 biți, cu 256 de adrese.

Fig. 2 11. Adresarea porturilor intrare/ieșire

2.5.6. Procesoare 286

Față de procesoarele 8086, procesoarele 286 au o serie de modificări importante.

a)Se introduc două moduri de lucru:

-modul KERNEL;

-modul USER.

În modul KERNEL, care este un mod protejat, se pot executa toate instrucțiunile procesorului, inclusiv cele privilegiate. Este un mod specific sistemului de operare.

În modul USER nu toate instrucțiunile se pot executa. Este un mod specific aplicațiilor utilizator.

b) Spectrul de adrese crește la 16MB , acest lucru realizându-se prin adăugarea a patru linii de adrese. În acest fel numărul de linii de adrese este 14.

16 MB = 24.210 B = 214 B

nr. linii de adrese = log 2 214 = 14

c) Se îmbunătățește tehnica pipeline. În varianta 286, procesorul are patru unități funcționale:

-unitatea de interfață cu magistrala;

-unitatea de instrucțiuni;

-unitatea de execuție;

-unitatea de adresare.

Unitatea de interfață cu magistrala realizează toate operațiile de transfer pe magistrală, adică extragerea instrucțiunilor și citirea/scrierea operanzilor. Instrucțiunile sunt citite în avans și sunt transferate către unitatea de instrucțiuni.

Unitatea de instrucțiuni decodifică instrucțiunile și le plasează într-o coadă de instrucțiuni decodificate.

Unitatea de execuție preia aceste instrucțiuni și le execută, în funcție de codul fiecărei instrucțiuni.

Unitatea de adresare calculează adresele de memorie în funcție de diferitele moduri de adresare. Adresele de memorie sunt transmise către unitatea de interfață cu magistrala pentru efectuarea transferurilor.

2.5.7. Procesoare 386

La aceste procesoare s-au introdus unele îmbunătățiri.

a) Arhitectura de bază este extinsă la 32 biți. Atât magistrala cât și registrele interne sunt de 32 biți.

b) Se poate adresa o memorie de 46 B, utilizându-se în acest scop 32 linii de adresă.

46 B = 22.230 B = 232 B

nr linii de adresă = log 2 232 =32

c) S-a introdus mecanismul de paginare în microprocesor. Cipul MMU (Memory Management Unity), care la 8086 și 286 era separat de procesor, a fost plasat în interiorul microprocesorului.

d) Tehnica pipeline este îmbunătățită cu două module: unitate de paginare și unitatea de preîncărcare a instrucțiunilor.

Fig. 2.12. Schema pipeline pentru procesorul 386.

2.5.8. Procesoare 486

La procesoarele 486 s-au adus următoarele îmbunătățiri:

a) S-a înglobat în procesor așa numitul coprocesor matematic, pentru calcului în virgulă mobilă.

b) S-a înglobat memorie cache de level 1 de 8kB și, de asemenea, o unitate de management a memoriei Cache.

c) Structura pipeline a fost extinsă prin divizarea unității de extragere și execuție a instrucțiunilor în cinci nivele. Fiecare nivel poate să prelucreze o altă instrucțiune, traversarea unui nivel făcându-se într-o perioadă de ceas.

d) Pentru raționalizarea consumului de energie s-a introdus un mecanism de management ce permite comutarea procesorului în regim de consum redus.

Fig. 2.13. Schema bloc a procesorului 486.

2.5.9. Procesoare PENTIUM

Familia de procesoare PENTIUM se bazează pe o arhitectură pipeline superscalară, ceea ce înseamnă că utilizează mai multe linii de prelucrare pipeline autonome ce lucrează în paralel. La varianta de bază există două linii de asamblare (liniile U și V). Versiunile mai noi au trei linii de asamblare.

Controlorul de întreruperi APIC (Advanced Programable Interrupt Controller) a fost inclus în structura microprocesorului.

În ceea ce privește lungimea cuvântului și a magistralelor , intern procesorul a rămas pe 32 biți și magistrala principală externă are 64 biți. Anumite magistrale interne, însă, au 128 sau chiar 256 biți.

S-a introdus un mecanism de protecție a salturilor care se bazează pe memorarea ultimelor salturi efectuate în cadrul secvenței de program. Citirea în avans a instrucțiunilor și introducerea lor în linia de prelucrare se face pe baza probabilității de realizare a unor salturi.

2.5.9.1. Microarhitectura familiei de procesoare PENTIUM

Fig. 2.14. Schema de principiu a arhitecturii PENTIUM.

Microarhitectura specifică procesoarelor de tip PENTIUM PRO, PENTIUM II și PENTIUM III conține trei unități de tip pipeline care comunică prin intermediul unui REZERVOR DE INSTRUCȚIUNI :

-unitatea de extragere și decodificare a instrucțiunii care se ocupă de extragerea în avans a instrucțiunilor și transformarea lor în secvențe de microoperații;

-unitatea de dispecerizare și execuție care selectează microoperațiile ce pot fi executate și le distribuie pentru execuție;

-unitate de retragere care asamblează rezultatele parțiale în ordinea prestabilită de program.

Această arhitectură se bazează pe execuția instrucțiunilor într-o ordine dictată de disponibilitățile datelor și a unităților de execuție. În acest sens unitatea de extragere și decodificare ca și unitatea de retragere sunt unități „in order”, adică unități care respectă ordinea de prelucrare a instrucțiunilor prestabilită în program. Unitatea de dispecerizare și execuție este o unitate „aut of order” care nu respectă această ordine. Datorită unită-ii de retragere, care reordonează rezultatele parțiale pe baza ordinii inițiale, se elimină multe din situațiile de blocare temporară a liniei de prelucrare pipeline cauzate de așteptările provocate de transferurile externe de date.

La procesoarele PENTIUM, odată cu apariția lui PENTIUM PRO, se introduce conceptul de execuție dinamică. Aceasta este o combinație de trei tehnici:

-predicția salturilor;

-execuție speculativă;

-analiza fluxului de date.

Cele trei tehnici soluționează majoritatea situațiilor de blocare a liniilor de prelucrare și procesorul poate să lucreze la capacitatea maximă de 3 instrucțiuni într-o perioadă de tact. La aceasta mai contribuie și existența mai multor unități de execuție care lucrează în paralel.

Această arhitectură elimină în mare parte neajunsurile unei arhitecturi pipeline clasice prin evitarea situațiilor de întârziere a liniei pipeline. Întârzierea poate să survină din diverse cauze:

-linia este golită în urma unei instrucțiuni de salt;

-operanzii solicitați nu sunt disponibili;

-nu există o unitate de execuție.

Prezența rezervorului de instrucțiuni oferă unității de dispecerizare și execuție o anumită perspectivă ce permite optimizarea ordinii de execuție a instrucțiunilor astfel încât să se reducă timpii de așteptare.

2.5.9.2. Unitatea de extragere și decodificare a instrucțiunilor

Dela BIU (Basic Interface Unit)

Spre rezervorul de microinstrucțiuni

Fig. 2.15. Unitatea de extragere și decodificare a instrucțiunilor.

Instrucțiunile se extrag din Cache-ul de instrucțiuni la nivelul 1(L1). Adresarea instrucțiunilor se face cu ajutorul modului Next IP care folosește în acest scop informațiile conținute în blocul de memorare a ultimelor adrese de salt. Astfel vor fi extrase secvențele de instrucțiuni care au probabilitatea cea mai mare de a fi executate în vectorul apropiat.

Pe fiecare perioadă de tact se extrage câte o linie de memorare cache de 32 biți. Se marchează începutul fiecărei instrucțiuni, după care extras este transmis către cele trei modul de decodificare independente. Există două module de decodificare simple și unul pentru instrucțiunile complexe.

În urma procesului de decodificare, o instrucțiune este transformată într-o secvență de microoperații triadice. O operație triadică este o operație elementară care are maximum trei operanzi: doi operanzi sursă și unul rezultat.

Instrucțiunile simple se decodifică în unu până la patru microoperații. Instrucțiunile complexe sunt decodificate în secvențe predefinite de microoperații păstrate în modulul de secvențiere a microoperațiilor. Decodificatorul poate genera până la 6 microoperații pe o perioadă de tact.

Deoarece sunt utilizate un număr restrâns de registre interne, pot să apară dependențe false între variabilele care utilizează temporar același registru intern. Aceste dependențe conduc la întârzieri în linia de prelucrare pipeline. Pentru a evita astfel de situații, unitatea de decodificre alocă microoperațiilor un registru alias dintr-un set de registre invizibile pentru programator. Registrele alias pot fi utilizate în operații aritmetice și logice. Fiecărei microoperații îi sunt atașați biți de stare, necesari în procesul de execuție.

Microoperațiile sunt plasate în rezervorul de instrucțiuni, rezervor care face legătura între cele trei unități independente de prelucrare din această arhitectură superscalară.

2.5.9.3. Unitate de dispecerizare și execuție

În Unitatea de dispecerizare și execuție există diferite module:

UEI – unitate de execuție pentru numere întregi;

UEF – unitate de execuție pentru numere în virgula flotantă;

UE-MMX – unitate de execuție a operațiilor MMX;

UES – unitate de execuție a salturilor;

UGA – unitate de generare a adreselor pentru citirea operanzilor și scrierea rezultatelor.

Stație de rezervare

i

i

Fig.2.16. Unitate de dispecerizare și execuție.

Stația de rezervare extrage din rezervorul de instrucțiuni microoperații ale căror condiții de execuție sunt îndeplinite și le alocă în funcție de specificul operației. O microoperație este executabilă dacă operanzii cu care lucrează sunt disponibili și dacă unitatea de execuție pe care o solicită este liberă. Pentru a determina disponibilitatea operanzilor se folosește o metodă de analiză a fluxului de date, în urma căreia se generează un graf al dependențelor de ordine existente între mai multe operații care utilizează aceleași variabile. Dacă mai multe microoperații sunt simultan disponibile, atunci se folosește un algoritm de planificare de tip FIFO care favorizează execuția în secvență a microoperațiilor.

Stația de rezervare dispune de 5 porturi prin care poate să comunice cu unitățile de execuție. Pot fi executate simultan maximum 5 microoperații. Sunt disponibile mai multe unități de execuție care pot să lucreze în paralel:

-două unități pentru numere întregi:

– o unitate pentru numere în virgulă mobilă;

-o unitate de execuție a salturilor;

-două unități pentru MMX;

-două unități pentru scrierea și citirea operanzilor.

Microoperațiile executate, împreună cu rezultatele obținute, sunt plasate din nou în rezervorul de instrucțiuni.

Pentru instrucțiunile de salt, se verifică dacă previziunea cu privire la adresa de salt a fost corectă. În caz contrar, unitățile de execuție a salturilor invalidează toate operațiile care urmează după instrucțiunea de salt, spre a fi eliminate din rezervor.

2.5.9.4. Unitatea de retragere

Fig. 2.17. Unitate de retragere.

Unitatea de retragere are rolul de a restabili ordinea inițială (aceea a programului inițial) între rezultatele parțiale generate în urma executării microoperațiilor. În acest scop se extrag din rezervorul de instrucțiuni microoperațiile a căror execuție este terminată și care urmează în ordinea secvențială de execuție. Rezultatele păstrate în registrele alias sunt transferate în registrele interne sau în memorie. Unitatea de retragere poate extrage trei microoperații într-o perioadă de tact.

UNITATE CENTRALĂ DE TIP RISC

2.6.1. CISC versus RISC

Din punct de vedere al complexității instrucțiunilor, procesoarele pot fi de două tipuri:

-CISC (Complex Intruction Set Computer);

-RISC (Reduced Instruction Set Computer).

Modelele CISC sunt caracterizate printr-un set foarte mare de instrucțiuni cod mașină, prin formate de instrucțiuni de lungime variabilă, și prin numeroase moduri de adresare foarte sofisticate. Desigur că această complexitate arhitecturală are repercursiuni negative asupra performanțelor computerului. Arhitecturile CISC au fost concepute începând cu anii 1960, pe baza datelor tehnologice din epocă . Atunci compilatoarele nu puteau utiliza bine registrele, microinstrucțiunile se executau mai rapid decât instrucțiunile (pentru că se situau în memorii cu semiconductori în timp ce instrucțiunile se situau in memorii toroidale), memoria centrală era de dimensiuni limitate etc.

Modelele RISC încearcă să corecteze neajunsurile modelelor CISC și, de aceea, sunt caracterizate printr-o simplitate și eficiență mărite. Ideea de bază este utilizarea unui număr redus de instrucțiuni, cu mult mai mic decât în modelele CISC, instrucțiuni care sunt cele mai frecvent utilizate și care conferă o mai mare flexibilitate în funcționare. Primele microprocesoare RISC au fost proiectate la Universitățile de Stanford (coordonator profesorul John Hennessy) și Berkeley (cooordonator profesorul John Patterson, cel care a și propus denumirea de RISC), în 1981.

Caracteristicile de bază ale modelului RISC sunt următoarele:

-timp de proiectare și erori de construcție mai reduse decât la CISC;

-unitate de comandă hardware cablată, fără microprogramare, ceea ce mărește rata de execuție a instrucțiunilor;

-utilizarea tehnicilor de procesare pipeline;

-utilizarea instrucțiunilor LOAD/STORE cu referire la memorie, ceea ce înseamnă că nu mai există instrucțiuni cu operanzi în memorie ci numai în registrele generale;

-există un format fix al instrucțiunilor, codificate pe un singur cuvânt de 32 biți sau, mai recent, pe 64 biți;

-datorită unor particularități ale procesării pipeline și anume datorită, mai ales, hazardurilor pe care aceasta le implică, apare necesitatea unor compilatoare optimizate (schedulere), cu rolul de a reorganiza programul sursă pentru a putea fi procesat optimal din punct de vedere al timpului de execuție;

-numărul de registre generale este substanțial mai mare decât la arhitectura CISC, deoarece la arhitectura RISC se lucrează cu „ferestre” (register WINDOWS); numărul mare de registre generale este util și pentru mărimea spațiului intern de procesare, tratarea optimizată a evenimentelor de excepție și modelul ortogonal de programare.

Microprocesoarele RISC scalare reprezintă modele cu adevărat evolutive în istoria tehnicii de calcul. Primul articol despre modelele RISC , semnat de David Petterson și Carlo Sequin, a apărut în 1981, și numai peste 6-7 ani toate marile firme producătoare de hardware realizau microprocesoare RISC scalare, în scopuri comerciale sau de cercetare. Performanța acestor microprocesoare crește cu 75% în fiecare an.

2.6.2. Setul de instrucțiuni

În proiectarea setului de instrucțiuni aferent unui microprocesor RISC intervine o multitudine de considerații:

-compatibilitatea cu seturile de instrucțiuni ale altor tipuri de procesoare pe care s-au dezvoltat produse soft consacrate; portabilitatea acestor produse pe noile procesoare este condiționată de această cerință care, în general, vine în contradicție cu cerințele de performanță a sistemului;

-setul de instrucțiuni este în strânsă dependență de tehnologia folosită care, de obicei, limitează sever performanțele (constrângeri legate de aria de integrare, numărul de ……., cerințe specifice tehnologiei etc);

-minimizarea complexității unității de comandă și a fluxului de informație procesor-memorie;

-în cazul multor procesoare RISC setul de instrucțiuni este ales ca suport pentru implementarea unor limbaje de nivel înalt.

Setul de instrucțiuni din procesoarelor RISC este caracterizat prin simplitatea formatului precum și de un număr limitat de moduri de adresare. De asemenea se urmărește ortogonalalizarea setului de instrucțiuni.

În primul procesor RISC 1 BERKELEY exista un set de 31 instrucțiuni grupate în patru categorii:

-aritmetice/logice;

-acces la memorie;

-salt/apel subrutine

-instrucțiuni speciale.

Formatul unei astfel de instrucțiuni este dat în figura 2.18.

Fig.2.18. Formatul instrucțiunii Berkley RISC 1.

IMM = 0 cei mai puțini semnificativi 5 biți ai câmpului SOURCE 2

codifică al doilea registru operand ;

IMM =1 SOURCE 2 semnifică o constantă pe 13 biți cu extensie

semn pe 32 biți;

SCC (Store Condition Code) semnifică validare/invalidare a

activităților de condiție, corespunzător operațiilor

aritmetice/logice executate.

Cu toate că setul său de instrucțiuni este redus, procesorul Berkley RISC 1 poate sintetiza o multitudine de instrucțiuni „aparent” inexistente. Practic nu se pierd instrucțiuni ci doar „opcode-uri”. Dar prin aceasta se simplifică foarte mult logica de decodificare și unitatea de comandă.

Iată mai jos câteva exemple de instrucțiuni emulate de RISC 1 în comparație cu un calculator CISC, VAX 11/780:

2.6.3. Principiul de procesare pipeline

într-un procesor RISC

Procesarea pipeline a instrucțiunilor reprezintă o tehnică prin intermediul căreia fazele aferente multiplelor instrucțiuni sunt suprapuse în timp. Arhitectura RISC este mai bine adaptată la procesarea pipeline decât cea CISC, datorită lungimii fixe a instrucțiunilor, modurilor de adresare specifice, structurii interne bazate pe registre generale ș.a. În general, există 4-6 niveluri. Iată un exemplu cu 5 niveluri:

1. Nivelul IF (Instruction fetch)

Este ciclul de încărcare a instrucțiunii, care constă în calculul adresei instrucțiunii ce trebuie încărcată din cache sau memorie și din aducerea efectivă a instrucțiunii din cache sau memorie în procesor.

2. RD (ID)

Se decodifică instrucțiunea adusă și se citesc operanzii din setul de registre generale.

3. Nivelul ALU

Se execută operația ALU asupra operanzilor selectați, în cazul instrucțiunilor aritmetice/logice. Se calculează adresa la memoria de date pentru instrucțiunile LOAD/STORE.

4. Nivelul MEM

Este nivelul în care se face acces la memoria principală sau CACHE, dar numai pentru instrucțiuni LOAD/STORE.

În cazul citirii, apar probleme datorate neconcordanței între rata de procesare și timpul de acces la memoria principală. Rezultă, teoretic, că într-un sistem pipeline cu N niveluri, memoria trebuie să fie de N ori mai rapidă decât într-un sistem clasic. Acest lucru se realizează, de obicei, prin implementarea de memorii rapide, în special CACHE.

La scriere, această problemă nu apare, datorită procesorului de ieșire specializat (DWB), ce va fi studiat la memoria CACHE.

5. Nivelul WB (write buffer)

Se scrie rezultatul în registrul destinație din setul de registre generale al microprocesorului.

Fig 2.19. Principiul procesării pipeline într-un procesor RISC.

Prin procesarea pipeline se urmărește o rată ideală de o instrucțiune pe ciclu mașină, ca în figura 2.19., deși, după cum se observă, timpul de execuție pentru o instrucțiune dată nu se reduce.

Se observă necesitatea suprapunerii a două nivele concurențiale: nivelul IF și respectiv MEM, ambele cu referire la memorie. Deseori această situație se rezolvă prin legături (busuri) separate între procesor și memoria de date respectiv de instrucțiuni .

O deficiență importantă a acestor microprocesoare este că nu orice instrucțiune trece prin cele 5 nivele de procesare. De exemplu prin nivelul MEM trec doar instrucțiunile LOAD/STORE . Corectarea acestui neajuns se face, uneori, prin comprimarea a două niveluri.

2.6.4. Structura unui Procesor RISC

Structura hardware a unui procesor RISC, prezentată în continuare, permite procesarea pipeline a instrucțiunilor. Interconectarea nivelurilor (IF/ID , ID/EX, EX/MEM; MEM/WB) sunt implementate sub forma unor registre de încărcare, actualizați sincron cu fiecare ciclu de procesare. Memorarea anumitor informații de la un nivel la altul este absolut necesară, pentru ca informațiile conținute în formatul instrucțiunii curente să nu se piardă prin suprapunerea fazelor de procesare.

Adresă de salt

4 IF/ID ID/EX sum EX/MEM MEM/WB

/ 2

32

sum 5 /

1 / 32

/ /

5 32 ALU

.

S1+S2

/

19 /

S2 32

/

13

5 DEST

CLK

Adr. Reg, DEST.

Data in reg.

Fig.2,20. Schema de principiu a unui procesor RISC.

Câmpul DEST este memorat succesiv din nivel în nivel și este rebuclat la intrarea setului de registre generale. Utilitatea acestui câmp devine oportună abia în faza WB, când și data de înscris în setul de registre generale devine disponibilă (cazul instrucțiunilor aritmetico/logice sau STORE)

Multiplexorul de la intrarea ALU are rolul de a genera registrul sursă 2, în cazul instrucțiunilor aritmetice/logice, indexul de calcul adresă (constanta pe 13 biți cu extensie semn), în cazul instrucțiunilor LOAD/STORE. Sumatorul sum 2 calculează adresa de salt în cazul instrucțiunilor salt (branch) după formula

PCnext=PC+Ext.semn(IR18-=0

Multiplexorul 2:1 de la ieșirea nivelului MEM/WB multiplexează rezultatul de ALU în cazul unei instrucțiuni aritmetice/logice, respectiv data citită din memoria de date în cazul unei instrucțiuni LOAD. Ieșirea acestui multiplexor se va înscrie în registrul destinație codificat de instrucțiune. Evident, întreaga structură este comandată de o unitate de control.

2.6.5. Problema hazardurilor în procesoarele RISC

Hazardurile sunt situațiile care pot apărea în procesarea pipeline și care determină blocarea procesării, având o influență negativă asupra ratei de execuție a instrucțiunilor. Există trei categorii de hazarduri:

-structurale;

-de date;

-de ramificație.

2.6.5.1. Hazarduri structurale

Aceste hazarduri sunt determinate de conflictele la resurse comune, adică atunci când mai multe procese simultane, aferente mai multor instrucțiuni în curs de procesare, accesează o resursă comună.

Pentru a le elimina prin hardware, este nevoie ca numărul de resurse să fie mărit. Prin multiplicarea resurselor hardware s-a creat posibilitatea execuției mai multor operații, fără a avea conflicte la resurse.

2.6.5.2. Hazarduri de date

Aceste hazarduri apar când o instrucțiune depinde de rezultatele unei instrucțiuni anterioare în banda de asamblare. Există trei categorii de hazarduri de date, funcție de ordinea acceselor de citire respectiv scriere, în cadrul instrucțiunilor:

-hazardul RAW (Read After Write);

-hazardul WAR (Write After Read);

-hazardul WAW (Write After Write).

a) Hazardul RAW

Apare atunci când instrucțiunea 2 încearcă să citească o sursă înainte ca instrucțiunea 1 să o scrie în sursă. Este foarte frecvent în actualele procesoare pipeline. De exemplu:

Dată disponibilă

I1 LOAD R1 Memorie

I2 LOAD R1+R2→R2

.

Dată necesară

În acest caz, R1 fiind sursa, data ce urmează a fi încărcată în R1 este disponibilă abia la sfârșitul ciclului MEM aferent instrucțiunii I1 , prea târziu, deoarece pentru procesarea corectă a lui I2 ar fi nevoie ca data să fie disponibilă cel târziu la începutul nivelului ALU din I2 . Ar fi necesar ca I2 să fie stagnată cu un ciclu mașină. Se cunosc mai multe metode pentru a preîntâmpina hazardul RAW.

-Prin înscrierea unei instrucțiuni NOP (metodă software) se stagnează a doua instrucțiune; timpul nu mai este critic. În exemplul ales, programul devine:

I1

NOP

I2

-Prin tehnica scoreboarding (metodă hardware), se stagnează hardware a doua instrucțiune, stagnare determinată de detecția hazardului RAW de către unitatea de control. Această tehnică de întârziere a fost propusă de Saymour Cray în 1964. Se impune ca fiecare registru al procesorului să aibă un bit de scor asociat:

bit de scor =0 registru disponibil

bit de scor =1 registru ocupat

Dacă pe un anumit nivel al procesării este necesar accesul la un anumit registru având bitul de scor 1, respectivul nivel va fi întârziat, permițându-i-se accesul numai când bitul respectiv a fost șters de către procesul care l-a setat.

Pentru exemplul anterior, se arată în figura 2.21 cum se testează și se setează bitul de scor și în figura 2.22 cum se face resetarea procesării instrucțiunilor.

De remarcat că ambele soluții bazate pe stagnarea fluxului de instrucțiuni (NOP și score boarding) scad performanțele.

I1 LOAD R1 Memorie

R1

R2

R3

Rn

Fig.2.21. Detecția hazardului pe baza bitului de scor.

.

R1

R2

R3

Rn

Fig. 2.22. Restartarea procesării instrucțiunilor.

-Prin tehnica forwarding (bypassing), în anumite situații, hazardul RAW se rezolvă fără să se cauzeze stagnări ale fluxului de procesare. Această tehnică se bazează pe „pasarea anticipată” a rezultatului instrucțiunii. Fie următoarea secvență:

ADD R1 R2 R3 R2 + R3 = R1

SUB R4 R1 R5 R1 – R5 = R4

ADD pt. R1

R2

R3

SUB pt. R4

R5

A B

ALU DIF

R SUM

Fig. 2 23. Implementarea forwardingului.

Rezultatul ALU aferent primei instrucțiuni R2 + R3 este memorat în tampoanele ALU la finele fazei ALU a instrucțiunii ADD. Dacă unitatea de control va detecta hazardul RAW , va selecta pe parcursul fazei ALU aferente instrucțiunii SUB, la intrarea A din ALU, tamponul care conține R2+R3 ( în urma fazei ALU a instrucțiunii ADD), evitând astfel hazardul RAW.

Este necesară implementarea proceselor de forwarding nu numai de la ieșirile ALU spre intrări ci și din nivelele următoare (de exemplu MEM) spre intrările ALU. Această situație corespunde unor instrucțiuni dependente RAW dar nesuccesive strict în program. Valoarea „pasată” uneia din intrările din ALU, în acest caz, reprezintă rezultatul ALU memorat în nivelul următor (MEM) pentru instrucțiunile aritmetice/logice sau data citită în memoria CACHE de date pentru unele instrucțiuni LOAD.

În implementarea controlului mecanismului de forwarding, pot apărea situații conflictuale care trebuie rezolvate pe baze de arbitrare-priorizare.

Se consideră secvența de instrucțiuni:

I1 SUB R2 R1 R3

I2 AND R2 R2 R5

I3 ADD R6 R2 R4

În acest exemplu apar necesare două „pasări” anticipate de valori, de la I1 la I3 (R3) pe intrarea A de la ALU și respectiv de la I2 la I3 (R2) pe aceeași intrare A de la ALU. Trebuie acordată prioritate nivelului pipeline mai apropiat de ALU, informației produsă de ieșirile ALU și nu celei situate în nivelul următor (aici MEM). Se preia pe intrarea A a unității ALU rezultatul produs de I2 și nu cel produs de I1 . Rezultă deci că și astfel de potențiale situații conflictuale trebuie implementate în logica de control a mecanismelor forwarding.

b) Hazardul WAR

Apare atunci când o instrucțiune scrie o destinație înainte ca aceasta să fie citită pe post de sursă de către o instrucțiune anterioară. Poate avea loc dacă într-o structură pipeline există o fază de citire posterioară unei faze de scriere. De exemplu, modurile de adresare indirectă cu predecrementare pot introduce acest hazard și de aceea nici nu sunt implementate în calculatoarele RISC.

Aceste hazarduri de tip WAR mai pot apărea și datorită execuției instrucțiunilor în afara ordinii lor normale din program, în așa numita execuție Out of Order. Această procesare este impusă de necesitatea creșterii performanței și se poate realiza atât prin mijloace hardware cât și software.

c)Hazardul WAW

Apare atunci când o instrucțiune scrie un operand înainte ca acesta să fie scris de o instrucțiune anterioară, scrierile fiind făcute într-o ordine eronată.

Hazardul WAW poate apărea în structurile care au mai multe niveluri de scriere sau care permit unei instrucțiuni să fie procesată chiar dacă o instrucțiune anterioară este blocată. Modul de adresare indirect cu postincrementare poate introduce acest hazard, fapt pentru care acest mod de adresare nu este implementat în mașina RISC. De asemenea, hazardul WAW poate apărea în cazul execuției Aut of Order a instrucțiunilor cu aceeași destinație.

Hazardurile WAW, ca și cele WAR de altfel, nu reprezintă hazarduri reale, ci mai degrabă conflicte de nume. Ele pot fi eliminate de către compilator (scheduler) prin redenumirea resurselor utilizate de program. De aceea se mai numesc autodependente, cele WAW, și dependente de ieșire cele WAR.

Exemple:

I1 MULF Ri Rj Rk Rj * Rk → Rj

I2 ADD Rj Rp Rm Rp+Rm → Rj

În acest caz poate să apară hazard WAR deoarece instrucțiunea I1 fiind o instrucțiune de coprocesor (cu virgulă mobilă) se va încheia în execuție după I2 care este o instrucțiune de procesor (cu operanzi întregi) Pentru că numărul de niveluri aferent structurii pipeline a coprocesorului este mai mare decât numărul de nivele aferentprocesorului, instrucțiunile I1 și I2 se termină „Out of Order” (I2 înaintea lui I1). Secvența care elimină hazardul WAR, reorganizată prin software este:

MULF Ri Rj Rk

ADD Rx Rp Rm

MOV Rj Rx

c) Graful dependenelor de date

Mai jos este dat un exemplu de reorganizare a unui program în vederea eliminării hazardurilor de date și a procesării optimale, folosind graful dependențelor de date.

I0 ADD R3 R1 R2

I1 LD R9 A(R7)

I2 ADD R4 R3 R2

I3 ADD R5 R4 R6

I4 LD R4 A(R6)

I5 LD R2 A(R4)

R3 R4

R4

R4

Fig. 2. 24. Graful dependențelor de date

aferent secvenței de instrucțiuni din exemplul ales

O primă secvență de reorganizare a programului ar fi

I0 ADD R3 R1 R2

I1 LD R9 A(R7)

I4 LD R4 A(R6)

I2 ADD R4 R3 R2

I3 ADD R5 R4 R6

Se observă că în această reorganizare execuția aut of order a instrucțiunilor I4 și I2 determină o procesare eronată a programului prin hazardul de tip WAW prin R4 .De asemenea, între I3 și I4 exestă hazard WAR prin același registru. Așadar detecția hazardului WAW între instrucțiunile I2 și I4 determină impunerea unei relații de precedență intre aceste instrucțiuni, adică procesarea lor trebuie să se realizeze în ordinea din program (order). Exte necesar ca I3 , dependent RAW de I2 , să se execute înaintea instrucțiunii I4 . Aceste restricții au fost evidențiate prin linii punctate în graful dependențelor de date.. În aceste condiții secvența reorganizată corect este:

I0 ADD R3 R1 R2

I1 LD R9 A(R7)

I2 ADD R4 R3 R2

I3 ADD R5 R4 R6

I4 LD R4 A(R6)

NOP

I5 LD R2 A(R4)

Hazardul WAR între I3 și I4 ar putea fi eliminat prin redenumirea registrului R4 în instrucțiunea I4 . deoarece hazardurile WAR și WAW nu reprezintă conflicte reale ci doar conflicte de nume. Considerând un procesor cu mai multe registre fizice decât logice, precedențele impuse de aceste hazarduri pot fi eliminate ușor prin redenumirea registrelor logici cu cei fizici (Register Reaming). Principiul constă în existența unei liste a registrelor active, adică folosite momentan, și o altă listă cu registrele libere. Fiecare schimbare a conținutului unui registru logic prin program se va face asupra unui registru fizic disponibil în lista registrelor libere registru care va fi trecut în lista registrelor active. In acest caz secvența se va rescrie astfel:

I0 ADD R3a R1a R2a

I1 LD R9a A(R7a)

I2 ADD R4a R3a R2a

I3 ADD R5a R4a R6a

I4 LD R4b A(R6a)

I5 LD R2b A(R4b)

În acest caz în optimizare nu ar mai avea importanțădecât dependențele RAW, celelalte fiind eliminate. În baza grafului dependențelor de date, procesarea optimă ar însemna, în exemplul ales, secvența:

I0 I1 I4 I2 I3 I5

2.6.5.3. Hazarduri de ramificație

Sunt generate de către instrucțiunile de salt (ramificație). Cauzează pierderi de performanță mult mai importante decât hazardul de date.

Diverse statistici arată că instrucțiunile de salt necondiționat au o frecvență de 2-8% din instrucțiunile unui program, iar cele de salt condiționat 11-17%. De asemenea salturile condiționate simple au o probabilitate de apariție de 50% iar buclele de 90%.

În principiu, efectele defavorabile ale instrucțiunilor de ramificație (Branch) pot fi reduse prin:

.metode soft, care reorganizează programul sursă;

-metode hard, în care se determină în avans dacă saltul se va face sau nu și se calculează în avans noul Program Counter,

O primă soluție pentru o procesare corectă ar fi aceea de a dezvolta unitatea de control hardware în vederea detectării prezenței saltului și de a întârzia procesarea instrucțiunilor următoare cu un număr de cicluri egal cu latența BSD-ului, până când adresa ar fi disponibilă. Soluția implică, însă, reducerea performanțelor. Același efect l-ar avea și „umplerea” BSD-ului de către scheduler cu instrucțiuni NOP

Efectul defavorabil al unei instrucțiuni de salt este sugerat în fig.2.24. pentru o structură pipeline cu 5 nivele în care la finele nivelului RD adresa se salt este disponibilă. Evident că în alte structuri Branch Delay Slot (BDS) poate fi mai mare decât un ciclu.

Fig. 2.25. Hazardul de ramificație pe un procesor scalar.

În principiu, efectele defavorabile ale instrucțiunilor de ramificație (branch) pot fi reduse prin:

-metode soft, care reorganizează programul sursă;

-metode hard, în care se determină în avans dacă saltul se va face sau nu și calculează în avans noul Program Counter.

a) Metode soft. Metoda Gross Hennesy (1982).

Se definește o instrucțiune de salt situată la adresa b spre o instrucțiune aflată la adresa a ca un „salt întârziat de ordinul n” dacă, atunci când se face saltul, sunt executate instrucțiunile situate la adresele b, b+1, b+2,………b+n și a .

O primă soluție de optimizare ar fi mutarea instrucțiunii de salt cu „n instrucțiuni mai sus”. Acest lucru este posibil doar când nici una dintre precedentele instrucțiuni nu afectează condițiile de salt. Atunci se poate muta instrucțiunea de salt cu k instrucțiuni mai „în sus”, unde k reprezintă numărul maxim de instrucțiuni anterioare care nu afectează condițiile de salt. Se duplică primele (n-k) instrucțiuni, plasate începând de la adresa de destinație a saltului, imediat după instrucțiunea de salt. Se modifică corespunzător adresa de salt, la acea adresă care urmează imediat după cele (n-k) instrucțiuni originale (figura 2.25)

În cazul în care saltul necondiționat nu se execută, este necesar ca nici una dintre cele (n-k) instrucțiuni adiționale să nu afecteze execuția următoarelor (1+n-k) instrucțiuni.

Fig. 2.25. Soluționarea unui hazard de ramificație prin duplicarea instrucțiunilor.

b)Metode hardware. Predicții prin hardware

Cele mai performante strategii actuale de gestionare a ramificațiilor de program sunt predicțiile hardware. Au la bază un proces de predicție „run-time” a ramurii de salt condiționat precum și determinarea în avans a noului Program Counter (PC).

Notând cu BP (Branch Penalty) numărul mediu de cicluri de așteptare pentru fiecare instrucțiune din program, introduși de salturile fals predicționate, se poate scrie relația:

BP=C(1-Ap)b IR

unde:

C = numărul de cicluri de penalizare introduși de un salt prost predicționat

Ap = acuratețea predicției

p= procentele de instrucțiuni de salt instrucțiunile procesate în program

IR = rata medie de lansare în execuție a instrucțiunilor.

Se observă că BP(Ap=0)=CbIR iar BP(Ap=1)=0, predicția ideală. Impunând BP=0.1 și considerând valorile tipice C=5, IR=4, b=22,5 %=0,225 rezultă Ap =0,977=97,7%. Este necesară o predicție aproape perfectă pentru a nu se simți efectul defavorabil al ramificațiilor de program asupra performanțelor procesoarelor.

O metodă consacrată în acest sens este metoda „Branch Prediction Buffer” (BPB). BPB reprezintă o mică memorie adresată cu cei mai puțin semnificativ biți ai PC-ului aferent unei instrucțiuni de salt condiționat. Cuvântul BPB este constituit în principiu dintr-un singur bit. Dacă acesta este 1 logic, se prezice că saltul se va face iar dacă este 0 logic, e prezice că saltul nu se va face. Evident că nu se poate ști în avans dacă predicția este corectă. Oricum structura va considera predicția corectă și va declanșa aducerea instrucțiunii următoare pe ramura prezisă. Dacă predicția se dovedește a fi fost falsă, structura pipeline se evacuează și se inițiază procesarea celeilalte ramuri de program. Totodată valoarea bitului de predicție din BPB se inversează.

C N

START:

C (C-1)

NU DA

Fig. 2.25. O buclă tipică.

BPB cu un singur bit are un dezavantaj care se manifestă cu precădere în cazul buclelor de program ca cea din figura 2.25., în care saltul se va face de (N-1) ori; o dată, la ieșirea din buclă nu se va face. În acest caz, vom avea două predicții false: una la intrarea în buclă (prima parcurgere) și alta la ieșirea din buclă (ultima parcurgere a buclei). Acuratețea predicției va fi de (N-2).100/N% iar saltul se va face în proporție de (N-1).100/N%. Pentru a elimina acest dezavantaj se utilizează 2 biți de predicție modificabili conform graficului de tranziție de mai jos (numărător saturat). În acest caz acuratețea predicției unei bucle care se face de (N-1) ori va fi (N-1).100/N%.

Prin urmare, în cazul în care se prezice că branch-ul va avea loc, aducerea noii instrucțiuni se face de îndată ce conținutul noului PC este cunoscut. În cazul unei predicții incorecte, se evacuează structura pipeline și se atacă cealaltă ramură a instrucțiunii de salt. Totodată biții de predicție se modifică în conformitate cu graful din figura 2.26.

DA

NU

DA

DA NU

NU NU

DA

Fig. 2.26. Automat de predicție de tip numărător saturat pe 2 biți.

Similar Posts