A számítógép felépítése
No ezt most miért?
- merülhet fel benned a kérdés, hiszen autót vezetni is megtanultál (vagy megtanulhatsz ha még nincs jogsid) anélkül, hogy ismernéd a differenciálmű vagy éppen a robbanómotor működését. Semmi pánik, én sem akarok az X nanométeres gyártástechnológiáról vagy egyéb borzalmas hókuszpókuszokról beszélni, bár ha igény lesz rá... nem, akkor sem, mert ehhez én sem értek és rögtön leszögezném, hogy egyáltalán nem probléma beismerni valamiről, hogy nem ismered, hiszen az informatika annyira szerteágazó, hogy már-már képtelenség minden technológiával tisztában lenni (vagy akár csak hallani róla).
Ezen bejegyzésben két részegységét szeretném felületesen bemutatni annak az eszköznek amelyre majd alkalmazásokat fogunk írni. Miért emeltem ki az alkalmazás szót? Mert valójában nem programokat fogunk írni (programozni fogunk, ami maga a folyamat, de nem programokat fogunk írni), hanem alkalmazásokat. A programozási gyakorlatban nagyon fontos a precíz, pontos fogalmazás, hiszen a gép azt fogja csinálni, amit mi mondunk neki és a hibás programműködések 99.8%-ban kiderül, hogy mi követtük el a hibát és nem a gép a "hülye". Bizonyára sokan találkoztatok az ide vágó informatikus viccel:
Az informatikus felesége elküldi a férjét a boltba:
- Hozzál margarint, és ha van tojás, akkor hozz tízet!
Hazajön az informatikus tíz margarinnal:
- Volt tojás!
Alkalmazás vs program
- Program: olyan bináris adathalmaz, melyet a CPU közvetlenül megért. Ezek jellemzően (de nem kizárólagosan) beágyazott rendszerekre készülnek, de ide sorolhatjuk az OS-eket (Operation System: operációs rendszer) is.
- Alkalmazás: olyan program, amely jellemzően egy OS és/vagy egyéb támogató rendszer alá készülnek, igénybe veszik azon programok lehetőségeit, tehát együttműködnek más programokkal, de a kód egésze a támogató rendszer nélkül nem futtatható.
Bár a szabatos fogalmazás nagyon fontos a kód írásakor, a mindennapi beszédben az alkalmazás és program keverése nem főben járó bűn, jó esély van rá, hogy én is inkább a program szót fogom használni a bejegyzésekben az alkalmazás helyett.
Ennél a résznél volt egy hosszabb értekezésünk Álmossal mire a mostani megfogalmazás elnyerte a végső formájlát, és talán ez is jól mutatja, hogy a kettő között mennyire vékony a határvonal.
Nézzük végre azt a két részegységet amiről korábban említést tettem.
CPU: Central Processing Unit (továbbiakban processor vagy processzor: angol mozaikszó, igazából ezt sem, mint oly sok egyéb leginkább angolul hasznát kifejezést nem érdemes lefordítani). Ez az egység felelős a programkód végrehajtásáért. A CPU sok részből áll (pl. ALU: Arithmetical Logical Unit, MMU: Memory Management Unit, stb), ezekről tényleg nem érdemes hosszan cikkezni, ha ebbe az írányba kell valamiért elmozdulnod, akkor a Google a barátod a Wiki meg a barátnőd. A processzor két fő jellemzője:
- család: pl.: x86/x64, ARM, PPC, stb (mint az autóknál pl. az Opel, Fiat, Ford, stb). A család határozza meg, hogy a processzor milyen "nyelvet" ért meg, azaz milyen utasítás-készlettel rendelkezik. Ez az utasításkészlet köszönőviszonyban sincs a programozási nyelvek utasításaival, ne keverjük a kettőt. A programozási nyelvek utasításai le lesznek fordítva a processzor "nyelvére". Az egyetlen programozási nyelv, amely nem igényel "tolmácsot" az a gépi kód, mely számok sorozata. Számunkra nehéz a számok és az azokhoz társuló művelet megjegyzése, ezért ezeket úgynevezett mnemonic-ok segítségével számunkra is megjegyezhető formába öntötték és ezt a programozási nyelvet nevezzük assemblynek. Könnyű belátni, hogy ha mi pl. megtanulunk japánul akkor azt egy orosz ember nem fogja megérteni; ugyanez a helyzet a processzoroknál is: az ARM utasításait egy PPC proceszor nem fogja megérteni (megpróbálja értelmezni, mert mindkét gépi kód csak számok sorozata, de az eredmény katasztrófális lesz). Ennek megfelelően az assembly programozási nyelv processzor családhoz (olykor típushoz is) kötött így használata eléggé korlátozott.
- típus: pillanatnyilag a két legelterjedtebb processzor-család az x86/x64 és az ARM a desktop és mobil vonalon. Ez előbbi az asztali számítógépek piacát dominálja, míg az utóbbi a mobil eszközök (jellemzően telefon és tablet) piacán erős. Az x86/x64 családhoz az Intel és az AMD gyárt processzorokat, míg az ARM-ot bárki licencelheti és gyárthatja. A processzorok típusai csakúgy mint az autóknál különböző "felszereltséget" tükröznek. Milyen sebességgel mennek, mennyi gyorsítótár(ak) van(nak) benne, milyen a tokozásuk (milyen alaplapba lehet belerakni őket), stb.
Pár példa típusra a teljesség igénye nélkül: Intel Celeron, Intel Core i7, AMD Athlon, AMD Ryzen
Memória: ide töltődnek be a programok, melyet a processzor futatt és ide kerülnek az egyéb adatok is amelyekkel a processzor dolgozik. A klasszikus értelemben vett memória addig őrzi meg tartalmát amíg áram alatt van, azaz ha kikapcsoljuk a gépet, akkor tartalmuk törlődik, bekapcsoláskor véletlenszerű (random) "szemetet tartalmaznak". Ennek fényében talán nem ér meglepetésként, hogy amikor a számítógépedet "sleep" üzemmódba rakod, akkor a memória áram alatt marad, hogy megőrizhesse tartalmát. A memóriának többek mellett a két legfőbb jellemzője:
- méret (kapacitás): mert a méret a lényeg... ja nem, és nem is a fizikai méreteket kell alatta érteni, hiszen az évek alatt az alaplapba helyezhető memória fizikai méretei alig változtak, míg kapacitásuk jelentősen nőtt. Ez a jellemző határozza meg a futtatható program méretét illetve, hogy mennyi adattal vagyunk képesek egyszerre dolgozni.
- sebesség: ez határozza meg, hogy milyen gyorsan tudunk adatokat írni bele vagy olvasni ki belőle.
A processzorok mellé lehet co-processzorokat rakni, melyek segítik a CPU munkáját. Ezek olyan képességekkel bővitik ki a rendszer tudását, amelyeket alapból nem tud. Az egyik ilyen co-processzor család az x87 amely az x86 család processzorainak képességeit bővíti oly formában, hogy ne csak egész számokkal tudjon műveleteket végezni (FPU: Floating-Point Unit). Ezeknek a co-processzoroknak külön nyelvük van amit külön meg kell tanulni. Manapság az x86/64 családnál a lebegőpontos aritmetika belekerül a CPU-ba és nem co-processzorként kell külön behelyezni az alaplapba. Az FPU csak 1 a sokféle co-processzor közül és nem is annyira él a köztudatban mint talán a GPU (Graphics Processing Unit) mozaikszó, amely a grafikus megjelenítés támogatására hivatott célprocesszor.
Mit tanultál ebből a cikkből?
- A számítógéped (vagy egyéb eszközöd amiben CPU dolgozik) processzora hajtja végre a programokat, melyek először a memóriába kerülnek (jellemzően egy külső adattárolóról, de nem feltétlenül, érkezhetnek akár hálózaton keresztül is). A CPU-n kívül léteznek egyéb processzorok is amelyek szintén képesek programokat végrehajtani, ezekről a későbbiekben lesz szó.
- a processzor "buta", alig tud pár dolgot végrehajtani (azt viszont családtól és típustól függően gyorsan vagy nagyon gyorsan). Hogy mennyi az az utasítás amit a processzor megért családonként és típusonként változó, a minimális 1 utasítástól a több száz utasításig terjed.
- az utasításaidat le kell fordítani a processzor saját nyelvére (egy utasításod akár több száz vagy több ezer CPU utasításnak felel meg) és pár ritka kivételtől eltekintve nem érdemes megtanulni a CPU saját nyelvét, hiszen kiváló tolmácsaid vannak