2020 é um ano significativo para o Unix: no início do ano, o sistema operacional original completava 50 anos. A hora do Unix, também conhecida como “datas da era”, é o número de segundos decorridos desde 1º de janeiro de 1970. Mas o que incomoda os desenvolvedores de kernel sobre o 50º aniversário do Unix?
Embora alguns dos primeiros desenvolvimentos do Unix tenham precedido o início oficial de sua “era”, em 1º de janeiro de 1970 permanece o ponto zero no tempo POSIX. Portanto, com o início de 1º de janeiro de 2020, a plataforma completou 50 anos oficialmente.
Tempo Unix versus tempo humano
Do ponto de vista do tempo humano, 50 anos é um longo período. Do ponto de vista do tempo do Unix, não há nada de especial em 50 anos, e 43 anos não seriam menos significativos. Os sistemas Unix (incluindo Linux) armazenam os valores de data e hora como o número de segundos decorridos desde 1970-01-01 00:00:00 UTC, com um registro em 32 bits.
Para determinar quantos segundos se passaram desde esse tempo e, portanto, o valor atual do tempo do Unix, você pode executar o comando:
$ date +%s
1576883876
O argumento% s após o comando date exibe a data e a hora atuais como o número de segundos desde o início de 1970-01-01.
Qual é a data máxima que os sistemas Unix podem armazenar?
Para entender quanto tempo um sistema Unix pode aguentar, é necessário avaliar a capacidade de um campo de 32 bits. Isso pode ser calculado da seguinte maneira:
$ echo ‘2^32’ | bc
4294967296
No entanto, como o Unix também preserva números negativos, um bit é reservado para o sinal, reduzindo o tempo para:
$ echo ‘2^31’ | bc
2147483648
E como a numeração do Unix começa em 0, isso significa que temos 2.147.483.648 valores, mas o maior é 2.147.483.647 – o valor da data e hora do Unix não pode exceder esse número. Assim como o odômetro de um carro não pode mostrar mais de 999.999 quilômetros – adicione 1 e o valor será redefinido para zero.
Quanto tempo dura um ano em segundos?
O número de segundos por ano pode ser calculado da seguinte forma:
$ expr 24 \* 60 \* 60 \* 365
31536000
Em um ano bissexto, mais um dia é adicionado:
$ expr 24 \* 60 \* 60 \* 366
31622400
Como o Unix mostra seu 50º aniversário?
1 de janeiro de 2020 às 12:00 da manhã, haverá tempo 1577836800. O cálculo é um pouco mais complicado, porque os anos bissextos devem ser levados em consideração. Houve 12 anos desde o início da era Unix, começando em 1972 e terminando em 2016. Ou seja, anos comuns se passaram 38.
É assim que o comando expr parece contar segundos nos últimos 50 anos:
$ expr 24 \* 60 \* 60 \* 365 \* 38 + 24 \* 60 \* 60 \* 366 \* 12
1577836800
Ou então, levando em consideração os cálculos anteriores:
$ expr 31536000 \* 38 + 31622400 \* 12
1577836800
Essa maneira de registrar o tempo tornou os sistemas Unix imunes ao problema do ano 2000, o que fez as pessoas se preocuparem, no final de 1999, que a mudança para 2000 poderia prejudicar os sistemas de computadores. As dificuldades acabaram sendo muito menos do que o esperado.
De fato, somente os aplicativos que registram anos em um formato de dois dígitos encontraram zerar a data. Muitos desenvolvedores fizeram um trabalho extra para garantir que seus aplicativos não sejam afetados pelo problema do Y2K.
Quando o tempo do Unix terá problemas?
Os sistemas Unix esperam dificuldades semelhantes não antes de 2038, quando as datas armazenadas no formato descrito acima excederem o espaço de 32 bits. Ainda faltam 18 anos, mas os desenvolvedores do kernel já estão trabalhando para evitar futuras falhas.
O problema de 2038 às vezes é chamado de problema do Y2K38. Se não for resolvido antes da terça-feira, 19 de janeiro de 2038, após essa data, os sistemas poderão pensar que 1901 chegou. Uma maneira de resolver esse problema é alternar para uma representação de 64 bits das informações de data e hora. Alguns acreditam que isso será muito mais difícil do que parece.
De qualquer forma, é muito cedo para entrar em pânico. E hoje, o 50º aniversário dos sistemas Unix, que são reconhecidos como um dos sistemas operacionais mais importantes da história, é realmente importante.