A processzor logikai felépítése, az utasításvégrehajtás

 

A processzor a memóriában egymás utáni sorrendben, kódolva tárolt utasításokat hajtja végre. Annak érdekében, hogy megértsük a processzor részegységeinek faladatai, nézzünk meg egy utasítás végrehajtásának logikáját:

Vegyünk egy matematikai műveletet, például a 3+5-öt, ezt emberi szóval így mondjuak: Adjuk össze a hármat és az ötöt, vagyis először a műveletet nevezzük meg (adjuk össze), utána pedig a művelethez szükséges számok jönnek (három és öt). A processzor esetében a műveletet utasításnak, a művelet végrehajtásához szükéges adatokat pedig operandusoknak nevezzük.  Az utasítást természetesen kódolva, egy szám formájában tároljuk. A memóriában is szigorúan ez a tárolási sorrend: Először az utasítás kódját tároljuk, utána jönnek az operandusok ilyen formán:+,3,5

A művelet végeredményét a processzor (valamelyik regiszterében) eltárolja. E végeredményen is lehet további műveleteket végrehajtani, például adjunk hozzá 8-at: +,E,8 Ilyenkor a processzor az utasításhoz szükséges egyik operandust (E) egy regiszterből, a másikat (8) egy memóriarekeszből veszi. Honnan tudja a CPU, hogy az egyik esetben mindkét operandust, a másik esetben meg csak a második operandust kell a memóriából venni? Ez az utasítás kódja mondja meg, tehát a két összeadó utasításnak más és más a kódja. A mai processzorok képesek arra, hogy ha sok ugyanolyan utasítást kell végrehajtaniuk, akkor egy műveletkódhoz több operanduspárt rendelnek hozzá.

Honnan tudja az utasítás, hogy hol található a következő művelet a memóriában? Ezt egy utasításszámlálónak nevezett regiszter jelöli ki, az ebben a regiszterben található cím jelöli ki azt a rekeszt, amelyből a következő utasítás kódját ki kell olvasni.

A fentebb vázolt logika megvalósításához a processzor a következő részegységekből épül fel:

  • ALU: (Arithmetic and Logical Unit – Aritmetikai és Logikai Egység). Ez a processzor „számológépe”, alapvető matematikai és logikai műveleteket hajt végre. Az ALU végrehajtási sebessége növelhető egy koprocesszor (FPU, Floating Point Unit, lebegőpontos műveleteket végző egység) beépítésével, ami egyes feladatokat gyorsabban hajt végre, mint az ALU. Az ALU minden mikroprocesszor alapvető részegységévé vált, a mai processzorok mindegyike tartalmaz lebegőpontos végrehajtóegységet is.

  • CU: (Control Unit - vezérlőegység). Ez szervezi, ütemezi a processzor egész munkáját. Például, lehívja a memóriából a soron következő utasítást, értelmezi, összeszedi az utasításhoz szükséges operandusokat, majd végrehajtásra átadja az ALU-nak.

  • Regiszter: A regiszter a processzorba beépített nagyon gyors elérésű, kisméretű memória. A regiszterek addig (ideiglenesen) tárolják az információkat, amíg a processzor dolgozik velük. A mai gépekben 32 vagy 64 bit méretű regiszterek vannak. A processzor adatbuszai célszerűen akkorák, amekkora a regiszterének a mérete, így egyszerre tudja az adatot betölteni ide. Például egy 32 bites regisztert egy 32 bites busz kapcsol össze a RAM-al. A regisztereket három csoportba soroljuk: adat-, cím- és állapotregiszterek. Az előzőekben említett eredményt például egy adatregiszterben mentjük el, az utasításszámláló egy címregiszter, míg az például, hogy az előző utasítás túlcsordulást váltott-e ki (vagyis nem fért be a végeredmény a regiszterbe), egy állapotregiszter tárolja.

A csővonal elv (pipeline)

Felvetődhet az a kérdés, hogy mit csinál a CU, miközben az ALU az utasítást hajtja végre. Az első processzoroknál még semmit, utána viszont úgy tervezték át a processzorokat, hogy a CU elkezdi a következő utasítás beolvasását és dekódolását, miközben az ALU dolgozik az előző utasításon. Az elvet tovább finomítva egy utasítás végrehatását több elemi lépésre is szétbonthatjuk, és amennyiben ezeket a lépéseket külön egységek hajtják végre, elérhető, hogy a processzor egyidőben több egymást követő utasítást hajt végre. Az elv neve: csővonal elv (pipeline). Hasonlít a megoldás egy futószalagra, amelyen egyszerre több (pl.) autó készül, minden egyes fázisban más és más munkafolyamatot hajtanak végre, a futószalag végén a már majdnem kész autók vannak. A következő ábra a csővonal működését mutatja. Az utasítás végrehajtását 4 elemi lépésre bontottuk szét (utasítás lehívása, dekódolása, végrehajtása, eredmény regiszterekbe írása), és ezeket hajtjuk végre párhuzamosan. A különböző színű négyzetek az egymást követő utasításokat jelzik. Amikor a CPU a második (lila) utasítást hívja le a memóriából, akkor már az első (zöld) utasítást dekódolja, vagyis egyszerre két (majd a későbbikeben már négy) utasítást hajt végre.

pipeline

Minél több lépésre bontjuk szét az utasításvégrehajtást, annál hatékonyabb lehetne a módszer, ha nem adódna egy probléma. Nem biztos, hogy mindig egymás utáni utasításokat kell végrehajtania a processzornak. Tegyük fel, hogy az első utasítás (a zöld) egy feltételes elágazó utasítás, és a végrehjatása után derül ki, hogy ugrani kell. Ilyenkor fölöslegesen dolgoztuk fel előre az utánajövő három utasítást, tehát a csővonalat ki kell üríteni, és az új helyről kell feltölteni. Minél hosszabb a csővonal, annál több utasítást kell eldobni. Háromféle megoldást dolgoztak ki a probléma megoldására, az első esetben mind a két ág utasításait elkezdi feldolgozni a CPU, és csak a rossz ág utasításait dobja el, a második esetben egy ugráselőrejelző áramkör megpróbálja megjósolni (90-95%-os valószínűséggel sikerül is), hogy melyik ágon kell majd folytatni az utasításvégrehajtást, míg a harmadik esetben a feltételes elágazó utasítás dekódolása után már nem kezdi végrehajtani a következő utasításokat, hanem üres (NOP) utasításokkal tölti fel a csővonalat, amíg ki nem derül, hol is kell folytatni a programot.

Szuperskalár architektúra

A  teljesítmény növelése érdekében több csővonalat építettek be egy idő után a processzorba, így ezek dolgozták föl párhuzamosan az utasításokat. Az ilyen felépítésű processzorokat nevezzük szuperskalár processzoroknak. Gyakorlatilag úgy kell felfogni, mintha több futószalagon futna az utasítások végrehajtása. Itt is adódik egy gond. Ha az egyik utasításnak szüksége van egy másik utasítás eredményére, és ezek az utasítások különböző futószalagon vannak, akkor az első utasításnak be kell várnia a másodikat, és ez jelentős késlekedést okoz. A processzorokba ezért beépítették a spekulatív végrehajtás lehetőségét, ami gyakorlatilag annyit jelent, hogy a processzor átrendezi a végrehajtandó utasítások sorrendjét annak érdekében, hogy az egymástól függőek végrehajtása ne szenvedjen késlekedést.

A HyperThreading architektúra

A Hyperthreading technológiával rendelkező processzorok úgy jelennek meg a programok számára, mint több logikai egység (=logikai processzor). Ez úgy történik, hogy a processzor két szimmetrikus állapottároló, a külső egységek számára hozzáférhető egységgel rendelkezik, melyek osztoznak a processzor végrehajtó egységein. Miért hasznos ez? A folyamat megértéséhez tudni kell, hogy a számítógépen futtatott programokat az operációs rendszer felügyeli, ütemezi. A programokat az operációs rendszer mint szálakat (thread) látja, és ezekkel a szálakkal "eteti meg" a processzort. (A szálak természetesen utasítások sorozata.) Az operációs rendszer (ha fel van rá készítve) optimálisabban tudja a szálakat ütemezni, ha már eleve több processzort lát. (A technológia a Pentium IV-es processzorokban jelent meg először.)


Többmagos processzorok


A többmagos processzorok alapvető előnye, hogy egyidejűleg több szálat képesek párhuzamosan feldolgozni. Tehát nem csak logikailag lát két processzort az operációs rendszer, hanem fizikailag is kettőt építenek egy CPU-ba. Az egy processzorba épített két magnak köszönhetően az egyidejű számítások megduplázódnak egy azonos órajelű, egymagos processzorhoz képest. Ennek ellenére a kétszeres gyorsulás ritkán érzékelhető a gyakorlatban, mert különböző programok különböző mértékben képesek profitálni belőle. Egyes programok csak egyszálú, lineáris végrehajtást támogatnak, így futtatásukhoz a második mag számítási kapacitását nem tudjuk kihasználni.
Felvetődhet a kérdés (jogosan), hogy ez nem ugyanaz, mint a szuperskalár architektúra? Hasonlóak, de a többmagos processzorokban sokkal több egységet többszöröznek meg, mint a szuperskalárban. (Az első kétmagos processzor, az Intel Pentium Extreme Edition 2005 második felében jelent meg, és mivel tartalmazta a Hyper Threading technológiát is, az operációs rendszer felé 4 logikai processzort mutatott.)

Multiprocesszoros rendszerek


Fölvetődhet a kérdés, hogy miért nem egyszerűen több processzort építünk egy gépbe, ezzel érve el a teljesítménynövelést. A gond az, hogy ilyenkor nem elég a processzorok számát megnövelni, hanem minden mást (memória, memóriavezérlő, perifériavezérlő, buszok, stb) is tájékoztatni kell, hogy "több dudás van a csárdában", tehát osztozkodniuk kell ezeken az egységeken. Vagyis nem elég a processzor felépítését (architektúráját) megváltoztatni, hanem a körülötte lévőkét is. Az jelentősen megdrágítja a rendszert, ezért ezzel csak nagygépes vagy szerver környezetben találkozunk. (Bár volt erre példa, gondoljunk csak az ABIT BP6-ra...)


A többmagos processzorok és a memória kapcsolata (Forrás: www.beszeljukmac.com, szerző: dombi)

A "memória korlátozás" problémája nem új fogalom a számítástechnikában, már jóval a több magos processzorok előtt is létezett. A probléma abból adódik, hogy egy foglalat feldolgozási szávszélességét (vagyis a felhalmozott másodpercenkénti utasítás szálanként / az összes szál és program figyelembevételével), a foglalat számára elérhető memória szávszélesség korlátozza. Ahogy nő a feldolgozási szávszélesség - mondjuk a processzorok órajelének növekedésével, vagy mert több magot tartalmaz egy processzor - a memória szávszélességének is növekednie kell, hogy lépést tudjon tartani vele. Vagyis hiába zsúfolunk több magot egy processzorba, ha a magokat képtelenek vagyunk ellátni adattal.

A gond az, hogy a memória szávszélessége nem tud lépést tartani ezzel a fejlődéssel. A memória busz szávszélessége (késleltetés és/vagy átvitel) nem fejlődött olyan lépésben, ahogy azt a Moore törvény megkívánná. Ez azt fogja okozni, hogy a processzor majd csak vár és vár, hogy megkaphassa a feldolgozandó adatot. Ez egy klasszikus probléma és pont emiatt nőttek meg a processzorokra épített másodlagos gyorsítótárak méretei annyira az utóbbi időben. Minél több processzor magot használunk, annál több memóriára van szükségünk és annál nagyobb másodlagos gyorsítótárat kell beépíteni, hogy ellensúlyozzuk a memória korlátozás problémáját. Tulajdonképpen a legmodernebb processzorok nem mások mint nagyon gyors memóri egységek, amelyek tetejére feldolgozó egységet építettek (vagy fordítva).

Processzor architektúrák az utasítások bonyolultsága szerint

CISC (Complex Instruction Set Computer): Összetett utasításkészletű számítógép. Ezen processzorok utasításkészlete rendkívül sok (akár több száz) utasítást tartalmaz, köztük sok speciális, összetettebb instrukciót is. Több bonyolult címzési mód lehetséges, ami változó hosszúságú utasítás szavakat eredményez, továbbá a gyakori, memóriát használó utasítások (load, store) végrehajtása is lassú. Viszonylag kevés általános célú regisztert tartalmaz. Látható, hogy a rendszer rendkívül erőforrás-pazarló, illetve nagy probléma még, hogy az összetett utasításokat is ritkán használják. Mindenképp pozitívum azonban, hogy egyszerű gépi szinten programozni. Manapság a CISC processzorok az összetett utasításokat belül átkonvertálják mikroutasítások sorozatává, és ezeket hajtják végre.

RISC (Reduced Instruction Set Computer): Csökkentett utasításkészletű számítógép. Egyszerűbb utasításkészlet a CISC-hez képpest, ezzel mellőzve az összetett instrukciókat. Az erőforrás ésszerű kihasználása végett, fix hosszúságú utasításszavak, és korlátozott számú címzési mód jellemzi. Az egyszerűbb kialakítás következtében több általános célú regiszter, vagy nagyobb méretű gyorstár elhelyezésére van lehetőség.

Megjegyzés: A mai CISC elvű processzorok, többnyire RISC magot használnak a feldolgozásnál. Az is lehetséges, hogy egy RISC processzor pár CISC-re jellemző tulajdonsággal rendelkezik.

risc_cisc

Kérdések

  1. Mutassa be a processzor utasításvégrehajtásának folyamatát a 3+5 példán keresztül!
  2. Honnan tudja a processzor, hogy a + utasítás egy vagy két operandusú?
  3. Mi az utasításszámláló? Mi a feladata?
  4. Sorolja fel a processzor részeit!
  5. Mi a feladata a CU-nak?
  6. Mi a feladata az ALU-nak?
  7. Milyen típusú regiszterek léteznek?
  8. Mutassa be a csővonal elvet!
  9. Milyen elemi részekre bontható fel egy utasítás végrehajtása?
  10. Milyen probléma merül fel a csővonal elv használatakor? Hogyan próbálják megoldani?
  11. Mutassa be a szuperskalár architektúrát!
  12. Milyen probléma merül fel a szuperskalár architektúra használatakor? Hogyan oldják meg?
  13. Mi a HyperThreading architektúra?
  14. Milyen processzorokat nevezünk többmagos processzoroknak?
  15. Miért drágák a többprocesszoros rendszerek?
  16. Milyen probléma jelenik meg a korszerű CPU-k és a memória között? Hogyan próbálják megoldani?
  17. Az utasítások bonyolultsága szerint hogyan osztályozzuk a CPU-kat?
  18. Mutassa be a CISC processzorokat!
  19. Mutassa be a RISC processzorokat!




Advanced Programmable Interrupt Controller

​ 

Visit the new site http://lbetting.co.uk/ for a ladbrokes review.