A pontos idő 1234567890
További Szoftver cikkek
„Ti ünnepeltek, vagy rettegtek?” – kérdezi olvasóitól az ubuntu.hu portál. „Elszáll fölöttünk az idő vasfoga... még négy éve sem volt 1111111111” – keseregnek a hup.hu hozzászólói. Alfageekek és -nördök, linuxosok és egyéb bitbűvészek világszerte hasonló kommentárokkal várták a nevezetes egymilliárd-kétszázharmincnégymillió-ötszázhatvanhétezer-nyolcszázkilencvenedik másodpercet, amit a Unix-idő az egyezményes világidő (korábban greenwichi középidő, mostanában UTC) szerint 2009. február 13-án este 11 óra 31 perckor és 30 másodperckor mutat majd. Péntek tizenharmadika, 1234567890 – véletlen? Aligha. Vagy mégis az, mert a mi időzónánkban például nem is következik be az ördögi együttállás: nálunk csak szombaton, 0 óra 31 perc 30 másodperckor lesz 1234567890.
Most másodperc-emberkék dáridója tart
A Unix-idő – vagy az operációs rendszer szabványa után POSIX-idő – a számítástechnikában kissé önkényesen az 1970. január 1. éjfél óta eltelt másodperceket mutatja, a szökőmásodperceket nem számolva. A hetvenes évek kezdete tehát a Unixban olyan, mint egy időszámítás origója, szokták is „Unix epoch”-nak nevezni ezt. Most tehát Unix után 39-ben járunk.
A Unix-időt leggyakrabban egész számként ábrázolják, bár tárolása 32 biten történik, szóval nullákkal és egyesekkel is fel lehet írni, és ennek lesz még jelentősége. 1970 óta több százmillió másodperc telt el (minden nap 86400), például 1970. január 21. éjfélkor, tehát alig 20 nappal a Unix epoch után máris 20 * 86400, azaz 1728000 volt a Unix-idő. Az 1970 előtti dátumokat negatív számmal jelzi ez a dátumtípus, 1970. január 1. előtt 20 nappal tehát -1728000-et mutatott a Unix-óra. Petőfi pedig -3843547200-kor szavalta el a Pilvaxban a Nemzeti dalt, de lehet, hogy -3843547543 volt a pontos idő, ezeknél a költőknél sohasem lehet tudni.
Egy ilyen folyamatosan változó szám magas labda a számmisztikára kicsit is érzékenyeknek. 2001. szeptember 9-én, a UTC szerint 1 óra 46 perc 40 másodperckor például már tíz számjegyű volt a Unix-idő, éppen egymilliárdot mutatott. Ez volt a Unix-billennium, amit a Unix-alapú operációs rendszerek elkötelezett hívei – így például a linuxos fundamentalisták – kellő tisztelettel megünnepeltek. De említhetnénk 2005. március 18-át, 1 óra 58 perc 31 másodpercet (UTC) is, ami a Unix-idő szerint 1111111111 volt. Ezek után szinte természetes, hogy 1234567890 is helyet kap a unixos legendáriumban, a következő nagy eseményre viszont még évtizedeket kell várni. A vicces nevű bibillennium, vagyis a Unix-idő szerinti 2000000000 ugyanis csak 2033. május 18-án jön el.
1234567890-t leginkább viccelődő cikkekkel ünneplik, a Gizmodo például beharangozta a világvégét. Mások bulikkal köszöntik a nevezetes számot, a nagy eseménynek természetesen van saját honlapja (sőt, twitteroldala) is, ahol követhetjük, hogy hol lesznek az 1234567890-partik Vancouvertől Bécsig. Budapest is szerepel a listán (a magyar geekek a Szilvupléban örülnek majd együtt), és miért is ne szerepelne: még Jon „Maddog” Hall, a Linux International ügyvezetője is jelezte, hogy bedob egy sört a nagy ijedtségre.
A Y2,038K-probléma
Az esemény jó apropó arra is, hogy a Unix-idővel dolgozó programozók újra elővegyenek egy kellemetlen témát, a 2038-as év problémáját. Ugyanis 2038. január 19-én 3 óra 14 perc és 7 másodperc (UTC) lesz az utolsó másodperc, ami ábrázolható Unix-időben, legalábbis 32 biten. A probléma oka, hogy ez a 32 bit kevés: a bináris számrendszerben – ahol a 2 hatványait jelző egyesekkel és nullákkal írják le a számokat – hamar fogynak a helyiértékek.
A Unix-idő esetében ez úgy néz ki, hogy a 32 bitből az első előjelbit – ami jelzi, hogy a szám pozitív (0) vagy negatív (1) –, és a maradék 31-en tárolódik a másodpercek száma. 2038. január 19-én 3 óra 14 perc 7 másodperckor (Unix-idő szerint 2147483647-kor) ez a 32 bit így fog kinézni:
01111111 11111111 11111111 11111111.
2038. január 19-én 3 óra 14 perc 8 másodperckor pedig így:
10000000 00000000 00000000 00000000.
Vagyis az első előjelbit 1-re vált, a számot tároló 31 bit viszont lenullázódik. Ez súlyos galibákat fog eredményezni a Unix-időt használó rendszerekben, már ha nem készülnek fel rá időben: a Unix-idő által jelzett dátum rendszertől függően 1970-re vagy 1901-re állhat vissza.
A probléma távolinak tűnik, de a Unix-idő nagyon beépült a számítástechnikába. Ez számít szabványnak a Unix-alapú operációs rendszereknél, de más rendszereket is érint a probléma, mert az egyik legnépszerűbb programozási nyelv, a C is ezt használja a time_t adattípusban. 32 bites Unix-időt használó kódok milliói születnek még idén is, közülük több beágyazott rendszerekben, és ezek simán elélhetnek változtatás nélkül 2038-ig.
A problémára egyszerű, de nem könnyű megoldás lenne, ha a rendszerek áttérnének a 64 bites ábrázolásra. Az említett adattípus 64 bitesre való megváltoztatása ugyanis megrendítheti a rendszer kompatibilitását, de az előjel nélküli 32 bites ábrázolás sem jó megoldás, mert könnyen megzavarhatja az időkülönbséget számoló programokat. A szakemberek szerint mégsincs nagy baj, 2038-ig meg fog történni a 64 bites átállás, a legtöbb 64 bites architektúrát használó operációs rendszer például már most 64 biten tárolja a time_t-t.
Egyébként egyszer a 64 bites Unix-idő is túlcsordul majd, bő kétszázkilencvenmilliárd év múlva, egészen pontosan 292 277 026 596. december 4-én vasárnap, 15 óra 30 perc 8 másodperckor (UTC). De addigra már tényleg eljön a világvége, legalábbis a Nap vörös óriássá alakul és elnyeli a Földet, szóval ez lesz a legkisebb bajunk.