sabato 28 febbraio 2009

1234567890, io c'ero!

Grazie ad un annuncio in MailingList del MontelLUG di Daneel, qualche giorno fa (13 - 02 - 09 alle 23.31 UTC), ho potuto partecipare anch'io, come potete vedere dallo screenshot :D, al coolepoccountdown ("actually up" come suggerisce il title della pagina). In pratica quel numero che vedete li, rappresenta i secondi passati dal primo gennaio 1970 alle ore 00.00 UTC, che sarebbe (è) una sorta di annozero per gli orologi Unix.
Quel numero in particolare non è niente di troppo serio, infatti è solo una semplice combinazione fortunata di numeri delle 2^32 possibili!, ma può essere un buono spunto per iniziare a fare un altro tipo di riflessione, e cioè il fatto che il numero delle combinazioni possibili è finito (2^32 appunto).
Perché proprio 2^32?
Come ben saprete, _tutte_ le informazioni nei pc non sono altro che serie di numeri (in particolare, numeri in base 2), per cui anche quel "tempo", non è altro che un numero che ogni secondo viene incrementato di uno.
Altra cosa da sapere è che nei pc non è possibile rappresentare l'infinito, perché per rappresentare l'infinito servirebbe memoria infinita e ciò è materialemente impossibile da ottenere (c'è da dire che tuttavia esiste una convenzione che indica come rappresentare, in FloatingPoint, infinito (con segno) e cioè: esponente 255 (tutti 1) e mantissa = 0 (tutti 0)).
Ok, mettendo a sistema il tutto, si può dedurre che: il tempo è finito!
Quanto finito?
Riprendendo da Wikipedia "The standard Unix time_t (data type representing a point in time) is a signed integer data type, traditionally of 32 bits" che vuol dire che i numeri sono rappresentati con 4 byte cioè 2^32 possibili diversi numeri. da 00000000000000000000000000000000 a 11111111111111111111111111111111. Sono circa 4 miliardi e rotti.
Se leggiamo attentamente c'è scritto "signed integer" quindi bisogna considerarne circa metà per i positivi e metà per i negativi (circa perché c'è anche lo 0 in mezzo). A questo punto, tirando le somme, si può dedurre che il più grande numero intero con segno a 32 bit rappresentabile è 2^31 - 1 e cioè esattamente +2.147.483.647. Se sapete che questi sono secondi e fate due conticini scoprirete che giovedì 19 gennaio 2038 alle 4 di mattina circa (in Italia) ci sarà lo Unix millenniunm bug! ovvero, non essendoci più cifre/bit a disposizione avverà un Overflow e torneremo indietro nel 1901!!! http://en.wikipedia.org/wiki/Year_2038_problem qui potete vedere meglio, grazie ad un' applet, quello che accadrà.

Conclusioni: premesso che a mio parere l'argomento sembra molto interessante e degno di approfondimenti maggiori, bisognerebbe capire meglio le dinamiche che hanno portato alla scelta di rappresentare il tempo con un intero signed e non usigned, quali potrebbero essere i danni reali del problema, se è realmente un problema[1] e cosa/se si sta facendo per risolverli.
[1]Il 2038 sembra molto lontano (avrò quasi 49 anni!!! O_o) e 29 (2038 - 2009) anni fa nascevano i primi personal computer (1981 primo personal computer dell' IBM) quindi potremmo aspettarci di tutto.

Al prossimo post!

P.S. Il corso architettura degli elaboratori 1 promette molto bene :D

Nessun commento: