3
Arhitectura calculatoarelor
ŢIUNI INTRODUCTIVE 1.1.
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 UC
UM
U I/E
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.
4
Sorin Adrian Ciureanu -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 UCului. -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
5 Arhitectura calculatoarelor î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.
1.2.
SCHEMA NIVELELOR CONCEPTUALE A UNUI CALCULATOR Un calculator virtual actual are şapte nivele conceptuale. Nivelul 7
Nivelul orientat pe aplicaţie
Nivelul 6
Limbaje de nivel înalt
Nivelul 5
Nivelul 4
Nivelul 3
Limbaj de asamblare
Sistemul de operare Interpretare Arhitectura setului de instrucţiuni
Microprogram executat direct de hard
Nivelul 2
Microarhitectură
Nivelul 1
Nivelul logic digital
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. Limbaj superior(Lsup)
Limbaj inferior (Linf)
6
Sorin Adrian Ciureanu 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.
7 Arhitectura calculatoarelor 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.
1.3.
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.
1.3.1. 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. 1.3.1.1.
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ă
8
Sorin Adrian Ciureanu 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
9 Arhitectura calculatoarelor zecimale, şi un timp de instrucţiune de 6 secunde. Intrarea şi ieşirea se făceau pe bază de hârtie perforată.
1.3.1.2.
Generaţia întâi, maşini cu tuburi electronice (19451955)
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);
10
Sorin Adrian Ciureanu -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.
11 Arhitectura calculatoarelor 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 (19651980) Î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,575µ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
12
Sorin Adrian Ciureanu 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)
Arhitectura calculatoarelor
13
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 An 1642 1834 1904 1906 1936 1943 1944
Nume Blaise Pascal Charles Babbage J.A.Flemming Lee de Forest Konrad Zuse Guvernul englez H.Aiken
Eveniment Prima maşină de calculat mecanică Maşina analitică Inventarea diodei Inventarea triodei Primul calculator cu relee-Berlin COLOSSUS,primul calculator cu tuburi Primul calculator………….Mark 1
14
Sorin Adrian Ciureanu
1946 1948 1948 1949
J.Mauchley şi J.P. Eckert Bardeen, Brattains şi Sockley Norbert Wiener M.Wilkes
1951 1951 1952 1955 19551960 !960/61 1962 1963 1964 1964 1965 1970 1970/71 1972 1974 1978 1978 1979 1980 1982 1983 1984 1985 1987 1989 1992 1993 1995 1996 1997 1998 1999 1999 2000
MIT J.Mauchley şi J.P. Eckert John von Neumann Laboratoarele Lincoln IBM
ENIAC Pensilvania University Inventarea tranzistorului Cibernetica EDSAC primul calculator cu program înregistrat WHIRLWIND primul calculator în timp real UNIVAC primul calculator comercializat IAS Princetown TX-0 primul calculator cu tranzistoare IBM 704
DEC IBM BORROGHS IBM CDC DEC DEC INTEL INTEL CRAY INTEL DEC MOTOROLA IBM INTEL SUA MOTOROLA INTEL MOTOROLA INTEL Lab CERN GENEVA INTEL SUNMYCROSYSTEMS CYRYX AMD AMD INTEL AMD AMD
PDP 1 IBM 7094 (32 biţi) Limbajul ALGOL IBM 360 CDC 6600 primul calculator paralel PDP-8 PDP-11 4004 primul microprocesor pe 4 biţi 8008 primul microprocesor pe 8biţi CRAY 1 primul supercalculator 8080 UC pe un cip VACS primul minicalculator pe 32 biţi 68000 Primul PC 286 Reţeaua LAN 68020 primul microprocesor pe 32 biţi 386 68030 486 WWW(World Wide Web) PENTIUM JAVA 686 RISC K5,K6 K6 PENTIUM III ATHALON/47 SHARPTOOTH/K6-3
1.3.2. Concepte noi în evoluţia calculatoarelor
Arhitectura calculatoarelor
15
Î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.
16
Sorin Adrian Ciureanu
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ă.
Unitate de control
Dispozitiv de intrare
Memorie
Unitate logică şi aritmetică
Dispozitiv de ieşire
Fig. 1.3. Modelul funcţional al maşinii John von Neumann
Arhitectura calculatoarelor
17
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.
Procesor
C
S
SR
Fig. 1.4. Modelul funcţional al maşinii Turing; SR-sistem reprezentativ; C/P-cip citire/scriere.
18
Sorin Adrian Ciureanu -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”
19 Arhitectura calculatoarelor (Neumann Bottleneck). Spargerea acestei limitări este realizată prin arhitectura paralelă. UC
UP
MM
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).
UP1 UP2 UC
FD1 FD2
MM! MM2
FI
UPn
FDn
MMn
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
20
Sorin Adrian Ciureanu 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)
Arhitectura calculatoarelor -memorie pentru date (DM) IM
21
CU (orizontal)
PU DM
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. IM
CU
PU
DM
(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)
22
Sorin Adrian Ciureanu IM
CU
PU
PU
DM
(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. CU PU
PU
PU
DM
DM
DM
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. CU
PU + DM
Fig. 1.11. Maşina VI Shore Exemplu: calculatoare cu memorii asociative.
Arhitectura calculatoarelor
23
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.
1.7.
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 4050% 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.
24
Sorin Adrian Ciureanu
Tabelul 1.2. Evoluţia procesoarelor Intel între 1972 şi 2000 anul numele Frecvenţa Tranzistor (nr./cip) 1972 8008 200KHz 3500 1974 8080 2MHz 6000 1976 8085 5MHz 6500 1978 8086 10MHz 29000 1982 286 12MHz 134.000 1985 386 16MHz 275.000 1989 486 25MHz 1,2.106 1993 P 60MHz 3,1.106 1997 PII 300MHz 3,3.106 1999 PIII 600MHz 9,5.106 2000 PIV 1,5GHz 42.10.6
Î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.
Arhitectura calculatoarelor
25
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.
26
Sorin Adrian Ciureanu Schema unei UAL este dată în figura 2.1.
Set de registre Registru acumulator
Registru tampon
Σ
Sumator
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.
Arhitectura calculatoarelor c) Registrele generale (RG)
27
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.
2.2.1. 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:
28
Sorin Adrian Ciureanu -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 f n= N 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: 2 GHz f n= = = 4.10 9 = 4 1 miliarde instrucţiuni pe secundă N 2 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)
Arhitectura calculatoarelor -paralelism la nivel de procesor.
29
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: n d= L + ( n − 1)T sau, la limită: lim d =T −1 n →∞
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
30
Sorin Adrian Ciureanu S1
S2
S3
S4
S5
(a) S1 S2 S3 S4 S5
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2
7 6 5 4 3
8 7 6 5 4
9 8 7 6 5
10 9 8 7 6
Timpi de execuţie a segmentelo r
t1
t2
t3
t4
t5
t6
t7
t8
t9
t10
11 10 9 8 7 t11
(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. S2
S3
S4
S5
S2
S3
S4
S5
S1
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.
31 Arhitectura calculatoarelor 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 UAL
UAL
S1
S2
S3
lLOAD
S5
STORE
VIRGULĂ FLOTANTĂ
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
32
Sorin Adrian Ciureanu î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.
2.3.
MODURI DE ADRESARE
După posibilitatea găsirii operanzilor, există mai multe moduri de adresare: -adresare imediată; -adresare directă; -adresare indirectă; -adresare indexată. a) Adresare imediată Operandul se află chiar în câmpul instrucţiunii.
OPERAND
Instrucţiune
Câmp operand MOV R 20000 Se transferă valoarea 20000 în registrul R. b) Adresare directă Operandul se găseşte la o adresă care există în instrucţiune Câmp adresă
ADRESĂ
OPERAND MOV R 100 20000
100
33 Arhitectura calculatoarelor Î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Ă
ADRESĂ MOV 100 200
R
OPERAND
100 200 20000
La adresa 100 din câmpul instrucţiunii se află altă adresă, 200, iar la această adresă se află operandul. c) 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 100 700 Adresa calculată: 600 + 700 = D00 D00 20000
2.4.
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);
34
Sorin Adrian Ciureanu
Bus local în UC INDEX ADRMEM
Bus memorie
M RI
U M E M
PC
A
T
RG RG 1 RG 2
Σ SUMATO RG 16
IC Z S C D
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
35 Arhitectura calculatoarelor 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: RG 1 0 RG 5 10 RG 9 20 RG 13 30 RG 2 4 RG 6 14 RG 10 24 RG 14 34 RG 3 8 RG 7 18 RG 11 28 RG 15 38 RG 4 C RG 8 1C RG 12 2C RG 16 3C
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
36
Sorin Adrian Ciureanu 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 COD 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101
MNEMONIC ADD MOV CMP C1 DDn DSn SM2 SAU SI INC DEC SWAP SALTNEC SALTCOND
1110 1111
DDCn DSC n
ACŢIUNE SURSĂ+DESTINAŢIE→DESTINAŢIE SURSA→DESTINAŢIE SURSA compară cu DESTINAŢIE→poziţionează Z SURSA→complement……………DESTINAŢIE SURSA deplasare dreapta cu n poziţii →DESTINAŢIE : n SURSA deplasare stânga cu n poziţii → DESTINAŢIE : n SURSA suma modulo 2 DESTINAŢIE → DESTINAŢIE SURSA sau DESTINAŢIE → DESTINAŢIE SURSA şi DESTINAŢIE → DESTINAŢIE SURSA + 1 → DESTINAŢIE SURSA – 1 → DESTINAŢIE SURSA1-16 →DESTINAŢIE17-32 SURSA17-32 → DESTINAŢIE1-16 SALT LA ADRESA DATĂ DE SURSĂ DACĂ Z=1 SALT LA ADRESA DIN SURSĂ, Z=0 PROGR CONTINUĂ ÎN SECVENŢĂ SURSA deplasare circulară dreapta cu n poziţii→DESTINAŢIE n SURSA deplasare circulară stânga cu n poziţii→DESTINAŢIE n
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
37 Arhitectura calculatoarelor Î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 PC → PC + 4 RI7-18 → A RI21-32 → T A+T → A A → RI
000A805B 104
0000 002A 0000 005B 0000 0085 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 M → RI
0404103C 0404103C
38
RI7-18
Sorin Adrian Ciureanu PC → PC + 4 204 → ADRMEM 10
ADRMEM
M ← RG5 RI21-32 → ADRMEM
ABCDEF01 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 M → RI PC → PC + 4 RI7-18 → ADRMEM
1A002900 1A002900 204 800
ADRMEM
M ← M →
800 ADRMEM
F00 F00
ADRMEM
M ← F00 M → A RI21-32 → ADRMEM
ABCDEF01 ABCDEF01 900
ADRMEM
M ← 900 M → ADRMEM
E00 E00
ADRMEM
M ← E00 ABCDEF01 M → T ABCDEF01 A compara cu T → pozit lui Z=1 prm Σ
Arhitectura calculatoarelor
2.5.
39
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. 2.5.1.
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.
40
Sorin Adrian Ciureanu -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 AH
AL
BH
BL
Cx
CH
CL
Dx
DH
DL
Bx
Σ
Ax
Registre de date
offset CS DS
DI
ES
SJ BP
SS
Registre de adrese
IP
SP Bus intern
4biţi Interfaţă Bus-uri
RT
A16.-19 AD0-15 BD0-15 BC
Registre temporare
Decodificare operaţie Comandă
ALU
Coadă de aşteptare Instrucţiuni (Q)
F Registru flaguri
UE UI Fig. 2.6. Arhitectura internă a microprocesorului 8086. b)Structura UI
Arhitectura calculatoarelor
41
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;
42
Sorin Adrian Ciureanu 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: 16 biţi 8 biţi 8 biţi Ax AH AL Bx BH BL Cx CH CL Dx DH DL 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) .
43 Arhitectura calculatoarelor 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.
44
Sorin Adrian Ciureanu 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.
2.5.3. Adresarea memoriei. Segmentarea memoriei.
Arhitectura calculatoarelor
45
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: 1) adresa logică ABC4 : EFB8 adresa fizică = ABC40 + EFB8 = BACF8 2) 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
46
Sorin Adrian Ciureanu
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. 1 2
3
4
5
6
COD OPERAŢIE
7
8
D W
9
10
MOD
11
12
REG
13
14
15
16
OFFSET
R/M
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: r/m 000 001 010 011 100 101 110 111
registru (w=0) (w=1) cuvânt octet Ax AL Cx CL Dx DL Bx BL SP AH BP CH SI DH DI BH
Arhitectura calculatoarelor 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.
47
R/M conţine: -adresa unui registru (pentru MOD=11) -o codificare utilizată pentru calculul adresei efective. R/M Adresa efectivă 000 BX + SI + deplasament 001 BX + DI + deplasament 010 BP + SI + deplasament 011 BP + DI + deplasament 100 SI + deplasament 101 DI + deplasament 110 BP + deplasament 111 BP + deplasament 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.
2.5.5. Moduri de adresare Există, în principal, cinci moduri de adresare. 2.5.5.1.
Adresare directă
Adresa efectivă (AE) a operandului deplasamentul conţinut în instrucţiune.
este
reprezentată
deplasament MEMORIE AE
+
AS
AF
OPERAND
de
48
Sorin Adrian Ciureanu
Fig. 2.8 Adresare directă. AE, adresă efectivă. AS, adresă segment. AF, adresă fizică. 2.5.5.2.
Adresare indirectă prin registre
În câmpul calculat nu se află operandul, ca la adresarea directă, ci o altă adresă de operand. Cod operaţie
Deplasament
BX
AE
Memorie
BP SI
+
AF
OPERAND
DI AS
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. 2.5.5.3.
Adresare indexată
La calculul adresei participă şi un registru index (SI sau DI în cazul procesoarelor 8086). 7
07 COD OP
015 MOD R/M
DEPLASAMENT
SI DI
+
AE Memorie
+ AS
AF
OPERAND
49
Arhitectura calculatoarelor
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. Memorie Adresare efectivă
V[6 ] V[5 ]
Deplasament
V[4 ] V[3 ] V[2 ]
+
V[1 ] V[0 ] Registru index
Fig. 2.10. Referirea vectorilor de lungime fixă în adresarea indexată. 2.5.5.4.
Adresare imediată
50
Sorin Adrian Ciureanu În acest caz operandul se află chiar în instrucţiune. OPERAND
AE
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. COD OP
SI
AE sursă
DI
AE destinaţie
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
51 Arhitectura calculatoarelor 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. Unitatea de segmentare
Unitate de execuţie
Unitatea de paginare
Unitate de interfaţă
Unitate de decodificare
Unitate de preîncărcare a instrucţiunilor
52
Sorin Adrian Ciureanu
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. Unitate de segmentare
Procesor virgulă fixă
Unitate de programare
Unitate cache
Unitate de interfaţă cu magistrala
Procesor virgulă mobilă Decodificare instrucţiuni
Preîncărcare instrucţiuni
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.
53 Arhitectura calculatoarelor 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
UNITATE DE EXTRAGERE ŞI DECODIFICARE INSTRCŢIUNI
UNITATE DE DISPECERIZARE ŞI EXECUŢIE
UNITATE DE RETRAGERE
REZERVOR DE INSTRUCŢIUNI
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
54
Sorin Adrian Ciureanu 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)
L1
I CACHE
NEXT IP
Bloc de memorie a adresei de salt
DECODIFICARE DE INSTRUCŢIUNI
Secvenţîator de microinstrucţiuni Alocator de registre alias
Arhitectura calculatoarelor
55
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ă.
56
Sorin Adrian Ciureanu 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
Staţie de rezervare
UEI
UEF
UEMMX
UEI
UES
UEMMX
UGA
i Citire operanzi
Port 0
i
Rezervor de instrucţiuni
Port 1
Port 2
UGA
Scriere operanzi
Port 3, 4
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.
57 Arhitectura calculatoarelor 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 D Cache
Staţie de rezervare
UIM (unitate de interfaţă cu memoria) FER (Fişierul de registre de retragere)
Rezervor de instrucţiuni
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.
58
Sorin Adrian Ciureanu
2.6.
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
59 Arhitectura calculatoarelor 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.
60
Sorin Adrian Ciureanu Formatul unei astfel de instrucţiuni este dat în figura 2.18. 0 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 OP S DEST SOURCE 1 I SOURCE 2 CODE C M C M
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: Instrucţiunea Incrementare Decrementare Încărcare contor Complement faţă de 1
VAX11/780 INC Ri DEC Ri MOVL, #N, Ri MCOMPL Ri , Rj
RISC 1 ADD Ri, ≠ 1, Ri SUB Ri , ≠1, Ri ADD R0, #N, Ri XOR Ri , ≠1, Rj
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)
61 Arhitectura calculatoarelor 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ă întrun 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.
IF
RD
ALU
MEM
WB
IF
RD
ALU
MEM
WB
IF
RD
ALU
MEM
WB
IF
RD
ALU
MEM
WB
IF
RD
ALU
MEM
WB
IF
RD
ALU
MEM
Sensul fluxului de date
Un ciclu maşi nă
Fig 2.19. Principiul procesării pipeline într-un procesor RISC.
WB
62
Sorin Adrian Ciureanu 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 mux 2:1 ID/EX / 32 sum 1
5 / / 5
S1 S2 SET REG D
.
PC
S1+S2 / 19 S2 / 13
Adr MEM I
5 CLK
/ 32 / 32
D IN Ext. semn mux 2:1 DEST
/ 32
sum 2
EX/MEM
MEM/WB
mux 2:1
IF/ID
ALU
mux 2:1
4
adr M E M D D in
Arhitectura calculatoarelor
63
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.
64
Sorin Adrian Ciureanu 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 .
IF
RD
ALU
M EMMI
WB
IF
RD
MEM
ALU
WB
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:
65 Arhitectura calculatoarelor 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 !F
RD
ALU
MEM
WB
1
R1
x
R2
x
R3
x
Rn
Fig.2.21. Detecţia hazardului pe baza bitului de scor. . resetare I1 LOAD R1 memorie !F
RD
ALU
MEM
WB
0 x x
I2 ADD R1 + R2 → R1 !F
DELAY
RD
ALU
MEM
R1 R2 R3
WB x
Rn
Restartare procesare
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.
66
Sorin Adrian Ciureanu Această tehnică se bazează pe „pasarea anticipată” a rezultatului instrucţiunii. Fie următoarea secvenţă: ADD R1 R2 R3 R2 + R 3 = R 1 SUB R4 R1 R5 R1 – R5 = R4 ADD
!F
RD
ALU
MEM
pt. R1
WB
R2 R3
SUB
pt. R4 !F
RD
ALU
MEM
WB
READ REGISTRU 2
WRITE REGISTRU
SET REGISTRI GENERALI READ REGISTRU 1
DATA IN DATA AUT 1
DATA AUT 2
R5
MUX 2:1
A
B ALU R
TAMPOANE ALU R2 + R3
DIF SUM
Arhitectura calculatoarelor
67
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 arbitrarepriorizare. 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.
68
Sorin Adrian Ciureanu 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 I2
MULF Ri Rj Rk ADD Rj Rp Rm
Rj * Rk → Rj 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 ADD MOV
Ri Rj Rk Rx Rp Rm Rj Rx
c) Graful dependenelor de date
69 Arhitectura calculatoarelor 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 I1 I2 I3 I4 I5
ADD LD ADD ADD LD LD
R3 R9 R4 R5 R4 R2
R1 R2 A(R7) R3 R2 R4 R6 A(R6) A(R4)
I
I
I
0
1
4
R3
R4 R4
I
I
R
2 4
5
I 3
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 I1 I4 I2 I3
ADD LD LD ADD ADD
R3 R9 R4 R4 R5
R1 R2 A(R7) A(R6) R3 R2 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
70
Sorin Adrian Ciureanu ş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 I1 I2 I3 I4
ADD LD ADD ADD LD
R3 R9 R4 R5 R4
R1 R2 A(R7) R3 R2 R4 R6 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
71 Arhitectura calculatoarelor 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.
BRANCH:
I1
IF
RD
ALU
MEM
WB
IF
RD
ALU
MEM
WB
IF
RD
ALU
MEM
I2
1 ciclu
WB
Branch delay slot (BDS)= 1
Dacă saltul se va face, I1 se va executa în mod nedorit
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ă;
72
Sorin Adrian Ciureanu -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. BRANCH (cond), ADR
[
k
BRANCH (cond), ADR M
(n-k) instr. adiţionale
I instr. ADR 1
ADR
(n-k) instr.
[
k
I instr.
ADR 2 (n-k) instr. „originale” ADR M ADR M=ADR+ 1+2(n-k)
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
73 Arhitectura calculatoarelor „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 C= 0
74
Sorin Adrian Ciureanu
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
Prezice DA 00
NU DA
DA
Prezice NU 11
Prezice DA 01
NU
NU
Prezice NU 10
NU
DA Fig. 2.26. Automat de predicţie de tip numărător saturat pe 2 biţi.
Arhitectura calculatoarelor
75