Galerija

32 ili 64 bita, da li je baš isto?

Ako neko od slušaoca sedi kod kuće i razmišlja o tome da postane informatičar, ali ne zna baš šta je za to potrebno, evo jednog pokušaja da preko konkretnog primera objasnim to donekle. Kada sam ja pre nekoliko desetina godina to isto pitao svoje roditelje, dobio sam sterilan i dostra nekoristan odgovor: „pa treba da završiš elektrohnički ili matetematički fakultet i to je to“. Ali šta se to na njemu uči? Da bi se postao programer, potrebno je da se nauče dva važna aspekta. Teorije algoritama, struktura podataka, operativnih sistema s jedne strane i puno znanja o konkretnom hardveru s druge strane. Ko zna samo ono prvo, osuđen je mu programi rade u teoriji, ali verovatno će biti spori i zahtevati jake hardverske resurse. Ko zna samo ono drugo biće odličan praktičar, ali će zato sve morati sam da otkriva od početka, trebaće mu deset puta više vremena nego onom koji zna i teoriju. Samo ako poznajete oba aspekta, pisaćete korisne programe u realnom vremenu tako da će neko i želeti da vas plati.

Hajde da obradimo temu koja je aktuelna u zadnjih nekoliko godina i koja će to ostati i u narednim. Hardverski procesori na 32 ili 64 bita. Svi znaju da je najvažniji razlog pravljena 64 bitnih procesora to što mogu da koriste memoriju preko 4 GBa. No, to je tek puki početak. Proceosri na 64 bita, uglavnom imaju i adresnu i podatkovnu magistralu na 64 bita, a najčešće i unutrašnje registre iste dužine. Ako uporedimo 32bitne i 64 bitne procesore sa sva tri aspekta, onda to izgleda odprilike ovako:

što se tiče količine memorije 32 ima 4 gigabajta, dok 64 ima 16 miliona terabajta.

što se tiče širine memorije uglavnom 32 prebacuju 4 bajta po ciklusu, dok 64 prebacuju po 8. To znači da bilo koje kopiranje memorije je duplo brže na 64tvorci.

I na kraju, elementarne operacije su brže na 64tvorci. Ako bi trebalo sabirati ili množiti cele brojeve preko milion, 32bitni troše veliki broj ciklusa da bi to uradili, dok 64bitni to rade u jednom ciklusu.

No možda najveća prednost 64tvorke je u tome što praktično eliminiše problem fragmentacije memorije programskim jezicima sa jakim pointerima, a to su C, C++ ili asembler. Kako uopšte i nastaje fragmentacija? Slično kao i kod hard diska. Svi programi više manje koji koriste dinamičko alociranje memorije posle nekoliko minuta ili sata rada, kako ko, neprekidno traže i vraćaju blokove memorijskom procesoru, koji čak i radeći taj posao najbolje što može, pre ili kasnije može da dođe do kolapsa. Što znači da može da prijavi da nema slobodnu memoriju, čak i kada je ima. To se dešava kada je memorija rascepkana na komade slobodnih i alociranih blokova bez ijednog kontinuiranog bloka novo tražene dužine. Može se dogoditi i apsrud da neko ima 4 GB memorije, samo 2 GB alocirane memorije i da program nije u stanju da alocira novi blok od samo 32 KB, čak i pored toga što ima još 2 GB slobodne memorije. To se dešava kada je memorija na maksimumu svoje rasepkanosti kada bi bila sačinjena od niza blokova gde bi jedan bio slobodan a drugi alociran, jedan za drugim bez izuzetka. U tom slučaju će program krahirati bez nade za oporavkom. To se dešava svaki put kada je količina memorije koju može da adresira jednaka količini fizičke memorije. Na početku 32bitnih procesora, kada je količina RAMa bila 4 ili 8 MB, to se nije moglo desiti lako, no danas smo dostigli maksimum 32 bita. To će se u teroji desiti i 64bitnim procesorima kada budu imali 16 miliona terabajta fizičke memorije. No, dok god je količina fizičke memorije daleko ispod količine adresibilne memorije, fenomen fragmentacije je skoro nemoguć. Zato što se uvek može naći neki novi blok u ogromnom svetu virtelnog adresiranja da popuni rupu u fizičkoj.

Šta to praktično znači? To znači da ako bi programeri preveli svoje sadašnje programe bez ikakve promene sa 32 na 64 bita, trenutno bi poboljšali stanje sa memorijom, i uspeli bi da iskoriste svaki bajt slobodne memorije do kraja, i korisnici bi dobili sabilnije programere bez povećanja količine fizičke memorije. Nije mala stvar. No, razlog zašto se to ne dešava tako često je zato što programeri su uglavnom nedisciplinovani i ne pišu programe koji se mogu automatski prevesti na 64 bita, bez promene. Ali ne radi se o teorijskom, već praktičnom limitu zasnovanom na neznanju, a često samo na lenjosti.

Programi koji su pisani u jezicima sa mekim pointerima, kao što su Java ili C# (si šarp) nisu patili od problema fragmentacija ni na 32 bita, pa neće ni na 64. Njihova arhitektura je imuna na taj problem.

Ovo, na prvi pogled izgleda kao prilog za usku publiku. No, nije, ovaj prilog je lakmus prilog, namenjem svima. Ko ga razume, on će sad malo sesti na internet pa će nakon nekoliko minuta, sati ili dana doći do još detaljnijeg opisa ovog fenomena, pa će čak i napisati i kratke test programe koji bez promene krahiraju na 32bita i preživljavaju na 64 , dok će svi ostali da se okanu ovog posla i shvatiti da možda programiranje nije za njih. I jedno i drugo je dobro.  Ne moraju svi da budu programeri. Ali bolje je to saznati pre nego što spalite godine na nekom tehničkom fakultetu i tek onda shvatite da vas to i ne zanima. A onima koji su u sredini, neodlučni, evo jednog novog pristupa problemu. Informatika nije mrtvo slovo na papiru. Na prvi pogled kompleksne i apstraktne teorije o fragmentaciji memorije, imaju veoma praktičnu primenu u svakodnevnom životu aplikacije. Sledeći put kad vam crkne program, možda ćete se upitati, da li je to bilo zbog fragmentacije memorije ili jednostavnog glupog baga, odgovor možda nećete naći, ali već i samo pitanje će vas možda odvesti do ove fine profesije. Srećno!

Ako želite da odslušate, prilog počinje na 13 min 40 sek

Ja pišem vama, a vi meni recite šta mislite. Zanima me šta mislite o…

Advertisements

One comment on “32 ili 64 bita, da li je baš isto?

  1. Povratni ping: Kraj besplatnog ručka, multi-core | Markus Maki

Zatvoreno za komentare.