From Wikipedia, the free encyclopedia
Ez a szócikk a számítógép-architektúráról szól. Lásd még: deep color (64 bites) színmélység.
A számítógép-architektúrák területén 64 bites egészek, memóriacímek és más adategységek azok, melyek legfeljebb 64 biten (8 oktett) kifejezhetők, illetve ilyen szélesek. 64 bites mikroprocesszor-, illetve ALU-architektúrák továbbá azok, melyek ilyen méretű regisztereket, címsíneket és adatsíneket használnak. Szoftveres megközelítésben, a 64 bites számítástechnika 64 bites virtuális memóriacímzésű gépi kód használatát jelenti.
A számítógépek 64 bites generációja az az időszak, amelyben a 64 bites processzorok a megszokottak. A 64 bites gépi szóméret meghatározza a számítógép architektúráját, adat- és címsínjeit, processzorát, és végső soron a rajta futó szoftvert is. A 64 bites CPU-k először a szuperszámítógépekben jelentek meg az 1970-es években (Cray-1, 1975), ezt követték a RISC-alapú munkaállomások és kiszolgálók az 1990-es évek elején, méghozzá a DEC Alpha, a Sun UltraSPARC, a Fujitsu SPARC64 és az IBM PowerPC-AS. 2003-ban jelentek meg a (korábban 32 bites) személyi számítógépekben használható 64 bites CPU-k az x86-64 és a 64 bites PowerPC processzorarchitektúrák formájában, majd 2012-ben[1] a korábban inkább csak beágyazott rendszerek gyártójaként számon tartott ARM által bejelentett, az ARMv8-ban használt AArch64 processzorarchitektúra.
Egy 64 bites regiszter 264 (több mint 18 trillió) különböző értéket vehet fel. Egy 64 bites memóriacímzésű CPU közvetlenül címezhet 264 bájtnyi (=16 exbibyte[2]) bájtcímzésű memóriát.
Alapértelmezés szerint 64 bites architektúra alatt 64 bites adattípusokat és címeket lehetővé tevő 64 bites egész regisztereket és címzési regisztereket értünk. Egy processzor külső adatbuszai és címbuszai azonban a regiszterektől eltérő méretűek is lehetnek, akár nagyobbak is (a 32 bites Pentiumnak például 64 bites adatsínje volt). A 64 bites kifejezés utalhat az alkalmazott alacsony szintű adattípusokra is, pl. 64 bites lebegőpontos számokra.
A processzorok regisztereit különböző csoportokra szokás osztani: vannak „integer” – egész-, egészértékű, fixpontos (szinonimák) ill. általános célú, „lebegőpontos”, „SIMD”, „vezérlő-” (control) regiszterek, továbbá gyakoriak még a címzési aritmetikát kiszolgáló speciális regiszterek, amik változatos neveket viselnek, mint „cím-”, „index-” vagy „bázisregiszterek”. A modern rendszerekben ezeket a funkciókat gyakran az általánosabb célú, egész számos / fixpontos regiszterekre testálják. A legtöbb processzorban kizárólag az általános célú és/vagy címregiszterekkel lehet a memóriában lévő adatokat megcímezni, a többi fajta regiszterrel nem. Ezeknek a regisztereknek a mérete ezért korlátozza a közvetlen módon megcímezhető memória nagyságát, még akkor is, ha más regiszterek, pl. a lebegőpontos regiszterek szélesebbek náluk.
A legtöbb nagy teljesítményű 32 vagy 64 bites processzor (néhány régebbi vagy beágyazott ARM és 32 bites MIPS-architektúra kivételével) rendelkezik integrált lebegőpontos hardverrel, ami gyakran, de nem minden esetben, 64 bites adategységeken végez műveleteket. Az x86/x87 architektúra utasításai például 64 bites (és 32 bites) lebegőpontos értékeket olvasnak be vagy írnak ki a memóriából, a lebegőpontos számok belső tárolási formátuma azonban 80 bites, míg az általános célú regiszterek 32 bitesek. Ezzel ellentétben a 64 bites Alpha család 64 bites lebegőpontos regisztereket és ugyanekkora egész regisztereket használt.
A legtöbb processzort úgy tervezik, hogy egyetlen regiszterében elférjen a számítógép virtuális memóriájában lévő bármely adat címe. Így a virtuális memória címeinek számát – a számítógép munkaterületén tárolható adatmennyiséget – ezen regiszterek mérete határozza meg. Az 1960-as évekbeli IBM System/360-nal kezdődően (mely maga egy kivétel volt a szabály alól, lévén a gépi szó alsó 24 bitjét használta csak címzésre, ami 16 MiB-os címteret eredményezett), az 1970-es évek DEC VAX (és sok másféle) miniszámítógépével, majd az 1980-as évek közepén az Intel 80386-ossal kialakult az a de facto konszenzus, hogy a 32 bit egy jól használható regiszterméret. A 32 bites címregiszter azt jelenti, hogy 232 memóriacím, tehát 4 GiB RAM címezhető meg. Amikor ezeket az architektúrákat tervezték, 4 GiB memória messze meghaladta a realisztikusan szóba jövő memóriamennyiséget, hogy 4 MiB memória több mint elégnek tűnt egy tipikus számítógép számára. A 32 bittel elérhető kb. 4,29 milliárd címet más szempontból is megfelelő méretűnek tartották: a legtöbb adatbázisban vagy más alkalmazásokban ennyi különböző érték már elegendő egyedi hivatkozások létrehozására.
Egyes szuperszámítógép-architektúrák már az 1970-es, 1980-as években 64 bit széles regisztereket használtak. Az 1980-as évek közepén kezdődött meg az Intel i860[3] fejlesztése, a megjelenés egészen 1989-ig (a Windows NT számára[4] túl soká) húzódott. Azonban egészen az 1990-es évek elejéig a 32 bit maradt a norma – ekkorra a memória előállítási árának folyamatos csökkenése lehetővé tette a 4 GiB memóriaméretet megközelítő számítógépek építését, és egyes problémák kezelésére kívánatossá vált a 4 GiB-ot meghaladó virtuálismemória-méret. Az igényre válaszul a MIPS és a DEC kifejlesztették 64 bites mikroprocesszor-architektúráikat, kezdetben csúcskategóriás munkaállomások és szervergépek számára. Az 1990-es évek közepére a HAL Computer Systems, a Sun Microsystems, az IBM, a Silicon Graphics és a Hewlett-Packard is rendelkezett 64 bites architektúrájú munkaállomásokkal és kiszolgálókkal. Az IBM mainframe rendszerei szabályt erősítő kivételek voltak 32 bites adat- és 31 bites címzési méreteikkel; csak 2000-ben kaptak 64 bites processzort. Az 1990-es években több olcsó 64 bites mikroprocesszor volt használatban szórakoztató elektronikai és beágyazott alkalmazásokban. A Nintendo 64[5] és a PlayStation 2 konzolokba jóval a PC-s változatok megjelenése előtt már 64 bites mikroprocesszorokat szereltek. A csúcstechnológiás nyomtatókba és hálózati eszközökbe, továbbá az ipari számítógépekbe is kerültek 64 bites CPU-k, például a Quantum Effect Devices R5000-ese. A személyi számítógépek piacán 2003-tól kezdett lassan terjedni a 64 bites számítástechnika, amikor az Apple Macintosh termékvonala átállt a PowerPC 970 processzorokra (az Apple terminológiája szerint „G5”) és az AMD megjelentette első 64 bites, x86-64 processzorát.
Elméletben egy 64 bites mikroprocesszor 16 exbibájt memóriát címezhet meg. A gyakorlatban ez általában jóval kevesebb.
Például az AMD64 architektúra 2011-ben 52 bitet tett elérhetővé a fizikai memória, 48 bitet a virtuális memória megcímzésére[6] (a virtuális memória 2013-ra 64 bites is lehet). Ezek a határok 4 PB-ot (4 × 10245 bájt), illetve 256 TB-ot (256 × 10244 bytes) jelentettek. Egy asztali számítógépbe jelenleg nem lehetséges 4 petabájt memóriát elhelyezni (már csak a memóriacsipek fizikai mérete miatt is), de az AMD hatalmas szerverekben, osztottmemória-fürtökben és a belátható jövőben esetleg megvalósuló egyéb felhasználási területekben gondolkozott, ezért alkalmazta az 52 bites korlátot, ami rengeteg teret ad a növekedésre, de nem építi be a csipek árába a teljes 64 bites címzési tartomány kezelésének költségeit. Hasonló okokból korlátozták a virtuális címméretet a 4 GiB-os korlát 65 536-szorosát jelentő 48 bitre.
A 32 bites architektúráról 64 bitesre való átállás olyan alapvető változtatás, ami miatt a legtöbb operációs rendszert nagy mértékben át kell írni, hogy képes legyen az új architektúrát kiszolgálni – a rendszerszoftvernek kell ugyanis elsősorban közvetlenül kezelnie a tényleges memóriacímzéssel foglalkozó hardvert.[21] Más szoftvereket is át kell írni vagy át kell ültetni az új lehetőségek kihasználásához; a régebbi, 32 bites szoftverek támogatása megoldható „hardverkompatibilitási üzemmód” segítséggel, ahol az új processzorok támogatják az utasításkészlet régebbi, 32 bites változatát is a 64 bites mellett, szoftveres emulációval, vagy akár egy valódi 32 bites processzormag megvalósításával a 64 bites processzoron belül, ahogy azt az Intel tette az Itanium processzorcsaládban, melyek egy IA-32 processzormaggal futtatják a 32 bites x86-alkalmazásokat. A 32 bitesről 64 bitesre fejlesztett architektúrák operációs rendszerei általában támogatják mind 32, mind 64 bites alkalmazások futtatását.[22]
Egy jelentős kivétel ez alól az AS/400, melynek a szoftvere egy virtuális utasításkészleten, a TIMI-n (Technology Independent Machine Interface) fut, amit programindításkor egy alacsony szintű szoftver fordít le natív gépi kódra. Új platformra való átálláskor egyedül ezt az alacsony szintű fordítószoftvert kell módosítani ahhoz, hogy a teljes operációs rendszer és az alkalmazások működjenek az új platformon. Pontosan ezt tették, amikor az IBM áttért a korábbi 32/48 bites „IMPI” utasításkészletről a 64 bites PowerPC-AS utasításkészletre, az „Amazon”-ra (az IMPI utasításkészlet nagyon különböző volt a 32 bites PowerPC utasításkészlethez képest is, így ez komolyabb átállás volt, mintha csak egy processzorcsalád 32 bites utasításkészletéről álltak volna át 64 bitesre).
Az x86-64 (AMD64) 64 bites hardvereken a legtöbb 32 bites operációs rendszer és alkalmazás kompatibilitási problémák nélkül lefuttatható. Bár a 64 bites architektúrák nagyobb címtere megkönnyíti a nagy adatmennyiségekkel dolgozó alkalmazások (digitális videofeldolgozás, tudományos számítások, nagy adatbázisok kezelése) dolgát, komoly vita alakult ki arról, vajon más feladatokra a 32 bites kompatibilitási üzemmódok elérik vagy meghaladják-e majd a natívan 32 bites rendszerek teljesítményét.
Egy bájtkódra fordított Java program módosítás nélkül futtatható akár 32, akár 64 bites Java virtuális gépen. A beépített típusok hosszát és pontosságát a szabvány határozza meg, nem függ a kódot futtató architektúrától. A 64 bites Java virtuális gépen futó programok mindenesetre nagyobb címtérhez férhetnek hozzá.[23]
A sebesség nem az egyetlen szempont, ami a 32/64 bites processzorok összehasonlításánál felmerülhet. A multitasking – többfeladatosság, fürtözés, stressztesztelés – a nagy teljesítményű számítástechnika területén – feladataira a 64 bites architektúrák alkalmasabbak lehetnek.
Összegzés:
Gyakori tévedés, hogy a 64 bites architektúrák csak 4 GB memóriaméret fölött lehetnek előnyösebbek a 32 biteseknél.[24] Ez nem teljesen igaz:
int a, b, c, d, e;
for (a=0; a<100; a++)
{
b = a;
c = b;
d = c;
e = d;
}
A 64 bites architektúrák fő hátránya, hogy a 32 bites architektúrákhoz képest ugyanaz az adatmennyiség több helyet foglal a memóriában (a pointerek és esetleg más adattípusok nagyobb mérete, valamint a padding – szóhatárhoz igazítás – miatt). Ez megnöveli adott folyamat memóriaigényét, és a gyorsítótárazás hatékonyságát is csökkentheti. A probléma kezelésének az egyik, viszonylag jól használható módja a részleges 32 bites modell megengedése. Például az ezt az utat járó z/OS operációs rendszer megköveteli, hogy a programkód a 31 bites címtérben foglaljon helyet, míg az adatok a 64 bites régiókban is tárolhatók.
Jelenleg (2013) a legtöbb tulajdonosi x86 szoftvert 32 bites kódra, egy kisebb részüket pedig 32 és 64 bitre egyaránt lefordítanak. Ilyenformán a legtöbb szoftver nem használja ki nagyobb címtér vagy a 64 bites és megnövelt számú regiszterek előnyeit. A legtöbb RISC platformon, illetve a szabad/nyílt forrású operációs rendszerek és programok esetén (ahol a forráskód rendelkezésre áll és 64 bites compilerrel újrafordítható) már évek óta kihasználják a 64 bites számítási környezet előnyeit. Nem minden ilyen alkalmazás igényli a nagyobb címteret vagy a 64 bites adatelemek manipulációját, az ilyen alkalmazások számára főleg az x86-64 architektúra megnövelt számú regisztere jelent nyereséget.
Az x86-32-höz kötődő 64 bites rendszerekhez (x86-64 és IA-64) néha problémát okoz beszerezni a 32 bites architektúrákra írt programok megfelelőit. A legsúlyosabb gond Microsoft Windows alatt az eszközmeghajtók inkompatibilitása. A legtöbb 32 bites alkalmazói szoftver képes kompatibilitási vagy emulációs módban futni, amilyen a Microsoft WoW64 Technology for IA-64 and AMD64. A 64 bites Windows Native Mode[25] eszközmeghajtó-környezet azonban a 64 bites NTDLL.DLL fölött fut, ami nem képes a 32 bites Win32-alrendszerben végződő hívásokat végrehajtani (pl. olyan eszközökhöz, ahol a tényleges hardverfunkciót felhasználói módú szoftver váltja ki, mint a Winmodemek vagy Winprinterek). Mivel a legtöbb gyártó nem tette elérhetővé 2007 elejéig, a Vista x64 megjelenéséig a 64 bites illesztőprogramokat termékeihez, a 64 bites Windowsok futtatása gyakran nehéz kompromisszumokkal járt. A trend azóta a 64 bites számítástechnika támogatásának irányába mozdult el, ahogy a memóriaárak esése gyakoribbá tette a 4 GB-nál több memória használatát a számítógépekben. A legtöbb gyártó most már elkészíti a 32 bites mellett a 64 bites drivert is az új eszközökhöz, így a 64 bites driverek hiánya már sokkal kisebb probléma – kivételt képeznek a régebbi eszközök, amikhez a gyártók jellemzően nem tesznek 64 bites drivert elérhetővé, így 64 bites rendszereken nem is lehet használni azokat.
A driverek kompatibilitása a nyílt forrású eszközmeghajtóknál kisebb gondot jelent, mivel a forráskód birtokában a 32 bites verziókat viszonylag könnyen át lehet írni 64 bitesre. 2007 előtt a nyílt forrású platformokon inkább a felhasználók alacsony száma miatt volt problémás a 64 bites rendszerek támogatása.
A Mac OS X Tiger és a Mac OS X Leopard gépek kernele 32 bites volt, de 64 bites processzorokon képes volt 64 bites felhasználói módú kódok futtatására. A Mac OS X Snow Leopardhoz 32 és 64 bites kernel is készült, és a legtöbb Mac gép még 64 bites processzoron is a 32 bites kernelt futtatta; ez lehetővé tette, hogy a 64 bites felhasználói programok futtatása mellett továbbra is 32 bites eszközmeghajtókat használjanak – a kompatibilitási nyereség mellett elveszítve a 64 bites driverek teljesítményelőnyét. A Mac OS X Lion több Mac modellen futott 64 bites kernellel, az OS X Mountain Lion pedig már kizárólagosan 64 bites kernellel futott. A 64 bites CPU-jú hardvereken a 32 és 64 bites OS X kernelek is képesek a 32 bites felhasználói kódok futtatására, és az OS X összes verziójába beépítették a 32 bites alkalmazások által használt 32 bites programkönyvtárakat, hogy azok teljes értékűen használhatók legyenek ezeken a rendszereken.
DOS-on elvben a kezdetektől fogva lehetséges volt a 32 és 64 bites programok futtatása, noha utóbbira nagyon kevés gyakorlati példa létezik. Mindez nem a kernel valamilyen extra hozzáadott funkciója, hanem minimalista jellege miatt van így. A kernel maga, valamint a beépített, opcionális és harmadik féltől származó driverek egyaránt, ide értve az IBM-kompatibilis számítógépek DOS-korszakát ugyanúgy, mint a mai, modern drivereket, a memóriában vannak ugyan, de futni csak akkor futnak, amikor egy program meghívja őket. Ennek köszönhetően volt lehetséges az önmagában 16 bites operációs rendszeren 32 bites programokat futtatni már a 32 bites méret megjelenésekor, esetenként egy-egy speciális driver is lehet 32 bites (pl. Ruslan Starodubov HDA Audio driverei az HX.DOS runtimeban) A 64 bites architektúrával hasonló a helyzet. Egy processzoron futtatni a különböző méretű kódokat azonban sok elpazarolt ciklust jelent a módok váltogatása okán. Több processzoros vagy többmagos rendszereken lehetőség van a különböző méretű kódok különböző CPU-kon való futtatására DMMI interface segítségével, amely ezt a problémát kiiktatja.
A Linux és a többi Unix-szerű operációs rendszer többsége, valamint a hozzájuk tartozó C és C++ fejlesztői eszközkészletek már a Microsoft kiadásai előtt évekkel támogatták a 64 bites processzorokat, illetve adtak ki 64 bites operációs rendszereket. A legtöbb alkalmazás és programkönyvtár ezeken a platformokon nyílt forrású, C-ben vagy C++-ban íródott, tehát ha „64-bit-safe” módon íródtak (tehát nem tesznek feltételezéseket pl. arra nézve, hogy egy int
típus 32 vagy 64 bites[26]), akkor könnyen fordítható belőlük 64 bites változat. A forrás-alapú, új kiadásokat gyakran megjelentető terjesztési modell csökkenti a 64 bites alkalmazások elérhetőségének problémáját ezeknél az operációs rendszereknél.
A 32 bites programokban a pointerek és az adattípusok (pl. egész) általában ugyanakkora méretűek; ez a 64 bites számítógépeken nem feltétlenül igaz.[27][28][29] Az egyes programozási nyelvekben, pl. C és leszármazottaiban, mint a C++ és Objective-C alkalmazott adattípus-keverés így 32 bites implementációkban működőképes lehet, 64 biten nem feltétlenül.
A 64 bites gépeken futó, C-alapú vagy C-leszármazott alapú programozási környezetekben az „int” változók sok esetben továbbra is 32 bitesek, de a „hosszú” egészek és mutatók (long integer, long pointer) 64 bitesek. Ezt „LP64” adatmodellnek is nevezik. Ennek alternatívája az „ILP64” adatmodell, ahol mindhárom adattípus 64 bites, sőt a „SILP64”, ahol még a „rövid egész” (short integer) típus is 64 bites. A legtöbb esetben azonban a szükséges módosítások viszonylag kis számúak és nyilvánvalóak, és a jól megírt programok nagy részét egyszerű újrafordítás után futtatni lehet a 64 bites környezetben. Egy másik lehetőség az „LLP64” modell, ami a 32 bites kompatibilitást azzal biztosítja, hogy az int-et és a long típust is 32 bitesnek hagyja meg. Az „LL” a „long long integer” típusra utal, ami legalább 64 bites az összes platformon, beleértve a 32 bites környezeteket.
Adatmodell | short (integer) | int | long (integer) | long long | pointer/ size_t |
Példa operációs rendszer |
---|---|---|---|---|---|---|
LLP64/ IL32P64 |
16 | 32 | 32 | 64 | 64 | Microsoft Windows (X64/IA-64) |
LP64/ I32LP64 |
16 | 32 | 64 | 64 | 64 | A legtöbb Unix és Unix-szerű rendszer, pl. Solaris, Linux, BSD és OS X; z/OS |
ILP64 | 16 | 64 | 64 | 64 | 64 | A HAL Computer Systems Solaris-átültetése SPARC64-re |
SILP64 | 64 | 64 | 64 | 64 | 64 | UNICOS |
Sok jelenlegi 64 bites fordítóprogram alkalmazza az „LP64” modellt (köztük a Solaris, az AIX, a HP-UX, a Linux, az OS X, a BSD és az IBM z/OS natív fordítói). A Microsoft Visual C++ fordítóprogramja az LLP64 modellt használja. Az LP64 modell hátránya, hogy long típust int-en tárolva túlcsordulás jöhet létre. Más részről, egy pointer long változóba töltése működik. Az LLP modellben ennek a fordítottja igaz. Ezek a problémák nem lépnek fel a teljesen szabványos módon megírt kód esetén, de a programozók gyakran implicit feltevésekkel élnek az egész típusok méretével kapcsolatban.
Az egyes adatmodellek közötti választás a fordítóprogram szintjén dől el, tehát ugyanazon az operációs rendszeren több adatmodell is együtt létezhet. Általában azonban az OS API-jai által használt elsődleges modell dominál egy-egy platformon.
Egy másik figyelembe veendő kérdés az eszközmeghajtók által használt adatmodell. A driverek a modern operációs rendszerek kódjának jelentős részét alkotják (bár az operációs rendszer futásakor ezek nagy részét nem kell betölteni). A legtöbb eszközmeghajtó erősen támaszkodik a pointerekre az adatműveletek során, és egyes esetekben adott méretű pointereket kell a hardverbe töltenie, hogy azok DMA-műveleteket végezhessenek. Például egy 32 bites PCI eszköz meghajtóprogramja hiába kérné az eszközt, hogy DMA-val töltsön adatokat egy 64 bites számítógép 4 GB fölötti memóriaterületére, az nem lenne erre képes, mert az azokhoz a címekhez tartozó pointerek nem férnének bele az eszköz DMA-regisztereibe. Ezt az operációs rendszer vagy úgy küszöböli ki, hogy az eszköz korlátozott memória-hozzáférését figyelembe veszi a DMA-kéréseknél, vagy IOMMU használatával.
A jelenleg (2011) is gyártásban lévő, 64 bites mikroprocesszor-architektúrák közé tartoznak::
A legtöbb, 32 bites processzor-architektúrából származtatott 64 bites architektúra az előd architektúra 32 bites kódjait natívan, teljesítménycsökkenés nélkül képes futtatni. Az ilyen jellegű támogatást bi-architekturális vagy multi-architekturális támogatásnak is nevezik.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.