Podcast on Processzor és utasításciklus
Processzor és utasításciklus: A CPU működésének alapjai
Podcast
A számítógép agyában
Délka: 10 minut
Kapitoly
Bevezető: Utasítás vagy adat?
A Neumann-architektúra alapjai
A processzor: A gép agya
A regiszterek titkos élete
Az utasításciklus: Lekérés és dekódolás
Az egyszerű gépi kód
Két szám összeadása lépésről lépésre
Az eredmény tárolása
Összegzés és lezárás
Přepis
Lily: A legtöbben azt gondolják, hogy egy számítógépben az utasítások és az adatok két teljesen külön dolog, mint a recept és a hozzávalók. De mi van, ha azt mondom, hogy a géped memóriájában mindkettő csak egy nagy adathalmaz, és a processzornak kell kibogarásznia, hogy éppen melyik micsoda?
Jack: Pontosan. Kicsit olyan, mintha a bevásárlólistádon a „végy tejet” utasítás ugyanúgy nézne ki, mint a „2 liter” adat. Elég meglepő, igaz? A mai modern számítógépek pont így működnek. Ez a Neumann-architektúra egyik alapelve.
Lily: Wow, ez tényleg meglepő. Akkor merüljünk is el benne! A Studyfi Podcast adását hallgatjátok, ahol a bonyolult témákat is érthetővé tesszük.
Jack: Szóval, a Neumann-architektúra, amit Neumann János írt le még 1945-ben, forradalmasította a számítástechnikát. A legfontosabb ötlete a tárolt program elve volt. Ez azt jelenti, hogy a programkód, vagyis az utasítások, és az adatok ugyanabban a memóriában laknak.
Lily: Várj, ez miért volt annyira nagy dolog? Ma már ez teljesen természetesnek hangzik.
Jack: Azért, mert korábban a programokat hardveresen kellett beállítani, kapcsolókkal vagy lyukkártyákkal. Képzeld el, hogy minden egyes programfuttatáshoz át kellene drótoznod a gépedet. A tárolt program elvével a programozás szoftveres feladattá vált, ami elképesztő rugalmasságot adott.
Lily: Oké, ez így már érthető. És milyen fő részekből áll egy ilyen architektúra?
Jack: Öt fő logikai egység van. Van a központi feldolgozó egység, vagyis a CPU – a gép agya. Aztán a memória, ahol az adatok és a programok vannak. Kellenek bemeneti egységek, mint a billentyűzet, és kimeneti egységek, mint a monitor. Végül pedig a buszrendszer, ami egyfajta autópálya-hálózat, ami összeköti ezeket az egységeket.
Lily: Koncentráljunk a CPU-ra, a gép agyára. Mi van benne, ami ilyen okossá teszi?
Jack: A CPU-n belül is van egyfajta munkamegosztás. Három kulcsfontosságú része van. Az első az aritmetikai-logikai egység, vagyis az ALU.
Lily: Az mit csinál? A neve elég tudományosan hangzik.
Jack: Valójában ő a matekzseni. Az ALU végzi az összes matematikai műveletet, mint az összeadás vagy szorzás, és a logikai műveleteket is, mint az „ÉS” vagy a „VAGY”. Ő a számítások motorja.
Lily: Rendben, van egy matekosunk. Ki a következő?
Jack: A vezérlőegység, vagyis a CU. Ő a CPU karmestere. Nem számol, hanem irányít. Olvassa az utasításokat, értelmezi őket, és megmondja a gép többi részének – az ALU-nak, a memóriának –, hogy mit, mikor és hogyan csináljon.
Lily: Szóval ő a főnök!
Jack: Abszolút! A harmadik rész pedig a regiszterek. Ezek szupergyors, de apró belső tárolók a CPU-n belül, amik ideiglenesen tárolják az adatokat, amikkel a CPU éppen dolgozik. Gondolj rájuk úgy, mint a CPU saját kis jegyzetfüzetére.
Lily: Említenél pár fontos regisztert? Milyen jegyzetek kerülnek ebbe a füzetbe?
Jack: Persze. Az egyik legfontosabb a programszámláló, a PC. Olyan, mint egy könyvjelző a programkódban. Mindig a következő végrehajtandó utasítás címét tárolja.
Lily: Praktikus. Így a CPU sosem felejti el, hol tartott.
Jack: Pontosan. Aztán ott van az utasításregiszter, az IR. Amikor a CPU beolvas egy utasítást a memóriából, azt ide teszi. Ez a „most ezt csinálom” feladatlistája.
Lily: Oké, PC a következő, IR a jelenlegi feladat. Mi van még?
Jack: Van két regiszter, ami a memóriával kommunikál. A memóriacím-regiszter, a MAR, tárolja annak a memóriacellának a címét, ahonnan olvasni vagy ahova írni akarunk. A memóriapuffer-regiszter, az MBR pedig magát az adatot tárolja, ami jön a memóriából vagy megy oda.
Lily: Rendben, a részek megvannak. De hogyan áll össze mindez egyetlen utasítás végrehajtásává? Mi az az utasításciklus?
Jack: Az egész egy ismétlődő folyamat, mint egy tánc. Az első lépés a lekérési fázis. A vezérlőegység fogja a programszámlálóban (PC) lévő címet, és beteszi a memóriacím-regiszterbe (MAR).
Lily: Tehát megmondja a memóriának, hogy „hé, innen kérek valamit!”
Jack: Pontosan. A memória megkeresi a kért címen lévő utasítást, és betölti azt a memóriapuffer-regiszterbe (MBR). Onnan az utasítás átkerül az utasításregiszterbe (IR). Közben a vezérlőegység növeli a programszámlálót, hogy az már a következő utasításra mutasson.
Lily: És miután az utasítás megérkezett az IR-be?
Jack: Jön a dekódolási fázis. A vezérlőegység, a mi karmesterünk, megnézi az utasítást, és „lefordítja”. Kitalálja, hogy ez egy összeadás, egy adatmozgatás vagy valami más, és előkészíti a terepet a végrehajtáshoz.
Lily: Szóval lekéri, megérti, és utána jön a cselekvés. Egyszerűnek hangzik, de elképesztő, hogy ez másodpercenként több milliárdszor megtörténik. És mi történik a végrehajtás során? Erről fogunk beszélni a következő részben?
Lily: Oké, szóval az utasítás bekerült a regiszterbe, és a vezérlőegység dekódolta. Mi jön ezután? Ez a végrehajtás, igaz?
Jack: Pontosan! És itt történik a varázslat. A dekódolás után a vezérlőegység tudja, mit kell tennie. Olyan, mint egy karmester, aki int a zenekarnak.
Lily: A zenekar pedig a processzor többi része?
Jack: Így van! A vezérlőegység jeleket küld, és az Aritmetikai Logikai Egység, vagyis az ALU, elvégzi a műveletet. Ez lehet összeadás, kivonás, vagy akár egy logikai ÉS vagy VAGY művelet.
Lily: Tehát az ALU a matekzseni a csapatban.
Jack: Abszolút! Az eredmény pedig általában egy speciális regiszterbe, az úgynevezett akkumulátorba, vagy vissza a memóriába kerül.
Lily: Ezt el tudnád magyarázni egy konkrét példán keresztül? Mondjuk... egy nagyon egyszerű gépi kóddal?
Jack: Persze! A gépi kód a processzor anyanyelve, csupa egyes és nulla. De az egyszerűség kedvéért használjunk most sima számokat a műveleti kódokra, azaz az opkódokra.
Lily: Szuper, ez barátságosabban hangzik. Milyen utasításaink vannak?
Jack: Legyen mondjuk öt egyszerű parancsunk. LOAD, ami betölt egy értéket a memóriából. STORE, ami elmenti. ADD, ami hozzáad. SUB, ami kivon. És végül HALT, ami leállítja a programot.
Lily: LOAD, STORE, ADD, SUB, HALT. Megvan. Készen állok a programozásra!
Jack: Akkor vágjunk is bele! A feladat: adjunk össze két számot.
Lily: Oké, hol vannak ezek a számok?
Jack: Tegyük fel, hogy a memóriában vannak, a 0x10-es címen van az 5-ös, a 0x11-es címen pedig a 3-as. Az eredményt a 0x12-es címre akarjuk írni.
Lily: Rendben. Hogy néz ki a program?
Jack: Először is be kell töltenünk az első számot. Az utasítás: LOAD 0x10. A processzor lekéri, dekódolja, majd végrehajtja. Beteszi az 5-ös számot az akkumulátorba.
Lily: Szuper, az akkumulátorban van az 5-ös. Mi a következő lépés?
Jack: Következik az ADD 0x11 utasítás. A ciklus újra lefut. A processzor lekéri, dekódolja, majd az ALU-val hozzáadja a 0x11-es címen lévő 3-ast az akkumulátorban lévő 5-öshöz.
Lily: És az eredmény... 8! Ami most az akkumulátorban van.
Jack: Pontosan! Az utolsó lépések a STORE lennének, amivel a 8-at elmentjük a 0x12-es címre, majd egy HALT, ami leállítja a programot. És kész is vagyunk!
Lily: Lenyűgöző! Tényleg olyan, mint egy apró, szupergyors futószalag. Minden utasítás ugyanazokon a fázisokon megy keresztül.
Jack: Így van. És ez a ciklus ismétlődik másodpercenként több milliárdszor egy modern processzorban. Na de mi történik, ha a programnak döntenie kell, és nem csak sorban halad? Erről szólnak az ugróutasítások.
Lily: Oké, tehát összeadtuk a két számot, az akkumulátorban most 8 van. Mi a következő a programunk listáján?
Jack: Így van, a PC 4-en áll, az akkumulátorban pedig az eredményünk, 0008. A következő utasítás a STORE. Ez arra utasítja a CPU-t, hogy mentse el az akkumulátor tartalmát.
Lily: Hova menti? A memóriába?
Jack: Pontosan! A CPU beolvassa a STORE parancsot, majd a címet, ami 0x12. Így a 0008-at az akkumulátorból a 0x12-es memóriacímre teszi.
Lily: Értem. Tehát most a Memória értéke 0008. És a programszámláló is tovább lépett, igaz?
Jack: Hát persze. A PC most 0x06-on áll. És itt jön a nagy finálé. A CPU beolvassa a következő utasítást... ami a HALT.
Lily: Ez nagyon drámaian hangzik. HALT!
Jack: Csak annyit jelent, hogy állj. A CPU elvégezte a dolgát. A program befejeződött.
Lily: Tehát, hogy összefoglaljuk a végső állapotot: a PC 7-en áll, az akkumulátorban továbbra is 0008 van, és a 0x12-es memóriacím is 0008-at tárol. Sikerült!
Jack: Bizony. És tényleg ez a lényege annak, ahogy minden egyes program fut. Lekérés, dekódolás, végrehajtás. Újra és újra.
Lily: Micsoda utazás volt, az egyszerű utasításoktól a teljes programfuttatásig. Jack, nagyon köszönjük, hogy ezt így lebontottad nekünk. És köszönjük mindenkinek, hogy velünk tartottatok a Studyfi Podcastben. Találkozunk legközelebb!