Unix memorizza il tempo come il numero di secondi dal 1 ° gennaio 1970. E questo significa anche Linux. Spieghiamo questo sistema apparentemente strano, e perché il giorno del giudizio è stato programmato per il 2038.
La prima epoca UNIX
Goethe ( 1749-1832. ) dichiarato "ogni secondo è di valore infinito". È vero, ognuno di noi ha solo tanti secondi qui sul pianeta Terra, e non sappiamo quando il nostro ultimo secondo sarà. Ma conosciamo il nostro compleanno, e quando è iniziato il nostro conto alla rovescia mortale.
Unix. -come il Regina britannica -Ha due compleanni. O, più accuratamente, ci sono state due occasioni separate su cui ha iniziato a contare i secondi della sua esistenza. La prima volta che Unix ha iniziato a contare da era a mezzanotte 1 gennaio 1971.
Possiamo vederlo abbastanza chiaramente rivedendo una sezione della prima edizione del
Manuale del programmatore UNIX
, datato il 3 novembre 1971. Scorri verso il basso fino a pagina 13 di quella sezione, e vedrai una descrizione del (ora defunto)
tempo
comando. Ci hanno detto che "
tempo
Restituisce il tempo da 00:00:00, 1 gennaio 1971, misurato in sessi anni di secondo. "
I sistemi di calendari e i sistemi di tempo misurano il tempo a partire da un punto significativo in passato, come un evento cosmologico, la fondazione di un impero, o il successo di una rivoluzione. Nei sistemi operativi, un tempo e una data arbitraria sono scelti come punto da cui inizia il conteggio. Questo è il epoca per quel sistema operativo.
UNIX ha utilizzato un numero intero non firmato a 32 bit per tenere il conteggio del 60 ° di secondo dall'epoca. Questa è una variabile numerica in grado di contenere valori nell'intervallo da 0 a 4,294.967.295 (2 32. -1). Sembra molto. Ma il contatore incrementato a 60 volte al secondo e, poiché il manuale del programmatore sottolinea: "L'utente cronologico notò che 2 ** 32 sessi anni di secondo è solo di circa 2,5 anni."
Con un tasso di consumo di 60 numeri al secondo, il contatore avrebbe raggiunto il suo valore massimo l'8 aprile 1973, poco meno di 829 giorni dopo.
La seconda epoca UNIX
Inutile dire che questo è stato agito rapidamente. Il numero intero non firmato è stato sostituito con un 32 bit firmato numero intero. Potrebbe sembrare una scelta sorprendente perché un numero intero firmato è in grado di tenere un numero minore di valori positivi-2,147.483.647 (2 31. ) -Chan un intero non firmato. Tuttavia, la velocità del consumo è stata ridotta anche da 60 ° di secondo a pochi secondi.
Ci vuole più tempo per contare da 0 a 2.147.483.647 contando un numero al secondo rispetto a quello che deve contare da 0 a 4.294.967.295 a 60 conteggi al secondo. E da un bel margine. Il nuovo schema non ha colpito il suo valore massimo per poco più di 68 anni. Questo sembrava finora in futuro che l'epoca era persino resettata a un momento precedente. La nuova epoca è stata messa a mezzanotte il 1 gennaio 1970, UTC.
Quel punto 68 anni in futuro è ora innerviato. Per essere precisi, lo raggiungeremo alle 03:14:07 UTC il 19 gennaio, 2038.
Uno schema semplice ma efficace
Utilizzando un singolo numero intero per il contare il numero di passaggi di tempo da un determinato punto nel tempo è un modo efficiente per memorizzare il tempo. Non è necessario memorizzare strutture complicate di anni, mesi, giorni e tempi. ed è indipendente da paese, locale e fuso orario.
Moltiplicare il numero nel numero intero da parte della dimensione del tempo step-in questo caso, un secondo ti dà il tempo dall'epoca e la conversione da quella a formati specifici della locale con le regolazioni del fuso orario è relativamente banale.
Però ti dà un limite superiore incorporato. Prima o poi, premi il valore massimo è possibile contenere il tipo di variabile scelta. Al momento della stesura di questo articolo, l'anno 2038 è a soli 17 anni di distanza.
È simile ma leggermente diverso dal problema con i primi sistemi informatici del secolo scorso utilizzando due cifre per immagazzinare anni. Quando il calendario ha rotolato nel nuovo anno e nuovo secolo del 2000, un valore anno sarebbe stato immagazzinato come "00" essere interpretato come il 2000, o il 1900?
Correggere il cosiddetto " Bug Millennio "Si stima che abbia costato l'U.S. da solo oltre $ 100 miliardi e per aver preso migliaia di anni di uomo per affrontare a livello globale. Ci sono stati alcuni problemi nei primi giorni del Gennaio 2000, ma niente come i disastri che avrebbero avuto luogo se il bug fosse stato ignorato.
Il giorno del giudizio è posticipato
Poiché Linux e tutti i sistemi operativi Unix-LookAlike condividono lo stesso problema, il problema dell'anno 2038 è stato preso sul serio per un po 'di tempo, con correzioni aggiunte al kernel dal 2014. Questo è in corso con le correzioni essere aggiunto al kernel Di recente del 20 maggio del 2020 per affrontare il problema intero a 32 bit.
Naturalmente, un computer Linux funzionante contiene molto più di un kernel. Tutte le utility operative e le applicazioni userland che utilizzano il tempo di sistema attraverso le varie API e le interfacce devono essere modificate per aspettarsi valori a 64 bit. Anche i file systems. deve essere aggiornato Accettare timestamp da 64 bit per file e directory.
Linux è ovunque . Un guasto catastrofico in Linux significherebbe errori in tutti i tipi di sistemi basati su computer. Linux esegue la maggior parte del web, la maggior parte della nuvola pubblica e persino il veicolo spaziale. Gestisce case intelligenti e auto auto-guida. Gli smartphone hanno un kernel derivato UNIX nel loro cuore. Praticamente i firewall, i router e i router e i router e i modem della banda larga praticamente come i sistemi operativi incorporati all'interno della corsa di Linux.
È bello che Linux stia bene per essere riparato. Installeremo gli aggiornamenti e questo sarà quello. Ma quali sono le possibilità che tutti questi dispositivi saranno rattoppati e aggiornati? Molti di loro non saranno nemmeno in servizio da allora quindi sarà un punto moot, ma alcuni verranno ancora collegati. Nascosto in rientranze scure e polverose nelle stanze del server e nelle sale server e negli armadietti del rack forse, ma saranno lì, lavorando in silenzio, mentre i secondi scelgono di spuntare fino a circa un quarto di tre anni della mattina del 19 gennaio, 2038.
Ma i dispositivi del genere dovrebbero essere una minuscola minoranza. La stragrande maggioranza dei sistemi vedrà il tempo di crunch venire e andare senza incidenti. Ancora una volta, saremo in grado di rilassarci. Almeno, fino all'anno 2486 si avvicina, portando con sé lo stesso problema per i sistemi che utilizzano numeri interi basati su 64 bit per contare il tempo dall'epoca.
Il comando della data
Noi possiamo
utilizzare il
Data
comando
Per verificare Linux e altri derivati UNIX utilizzano ancora lo schema originale e semplice di memorizzare il valore di tempo come numero di secondi dall'epoca.
Usando il
Data
Comando senza parametri Stampa la data e l'ora corrente sulla finestra del terminale. Hai anche mostrato il fuso orario che il tempo è regolato per. EDT è l'ora legale orientale, il che significa che il nostro computer di prova è nel fuso orario orientale e
l'ora legale
è in effetti. Quando l'ora legale non è in vigore, il fuso orario orientale utilizza il tempo standard orientale.
Per vedere il valore intero sottostante, possiamo utilizzare una stringa di formato di visualizzazione. Formato Le stringhe hanno un segno più "+" come primo carattere. Il token del formato "% s" significa "mostra i secondi dall'epoca."
Se prendiamo il valore dei secondi restituito da
Data
e nutrirlo di nuovo nel
Data
comando con il.
-D
(Visualizzazione del tempo descritto da una stringa), lo convertirà in una data e un'ora regolare.
Data
Data +% s
Date -D @ 1633183955
Possiamo dimostrare che il valore intero rappresenta davvero il tempo visualizzando il numero di secondi, dormendo per 10 secondi e mostrando il nuovo numero di secondi. I due valori interi saranno diversi da esattamente 10.
Data +% s & amp; & amp; Sleep 10 & amp; & amp; Data +% s
Abbiamo visto che possiamo passare un numero di secondi al
Data
comando e converte in un tempo e data per noi. Se facciamo solo quello usando zero secondi come input il nostro valore,
Data
dovrebbe stampare la data e l'ora dell'Unix Epoch.
TZ = 'UTC' DATE -D @ 0 + '% X% R'
Il comando si rompe in questo modo:
-
TZ = 'UTC'
: L'epoca è stata impostata utilizzando il tempo universale coordinato (UTC, quindi dobbiamo dire
Datausare UTC. Il costrutto "TZ =" imposta solo il fuso orario efficace per il comando corrente. -
Data
: Il
Datacomando. -
-D
@ 0.
: Diciamo
DataPer utilizzare una stringa come input, non il tempo "in questo momento." La stringa che passiamo contiene zero secondi. -
+ '% X% r'
: La stringa di formato di output. Il token del formato "% x" dice
Dataper visualizzare l'anno, il mese e il giorno. Il token del formato "% r" indicaDataPer utilizzare il formato 24 ore per le ore e i minuti. Poiché ci sono spazi nella stringa di formato, avvolgiamo l'intera stringa in virgolette singole """In modo che la corda trattata come un singolo oggetto.
Come previsto, l'uscita è a mezzanotte il 1 ° gennaio 1970.
IMPARENTATO: Come visualizzare la data e l'ora nel terminale Linux (e usarlo in Script di Bash)
Fino alla prossima volta
Semplice è spesso il migliore. Il conteggio dei secondi da un dato fisso è il modo più semplice per segnare il passare del tempo. Ma il passaggio del tempo porta nuove sfide. Con le correzioni che sono state messe in atto, sembra che siamo chiari fino all'anno 2486.
Penso che sia sicuro dire che ci preoccuperemo di questo un po 'più vicino al tempo.