Categorias

50 anos de Unix e o Y2K38

Oficialmente, o Unix nasceu em 1969, quando os cientistas da computação  Ken Thompson e Dennis Ritchie desenvolveram um sistema operacional que fosse leve e econômico para um modesto computador largado na Bell Labs. Aquele projeto inicialmente modesto e sem maiores pretensões se tornaria uma revolução na computação e a base de grande parte dos servidores que sustentam essa mesma internet que você está usando agora, mais de 50 anos depois.

Portanto, costuma se celebrar o aniversário do Unix em outubro e, em outubro de 2019, ele teria completado 50 anos de existência.

Entretanto, para quem conhece as profundezas de Unix, existe uma outra data tão importante quanto: primeiro de janeiro de 1970. Essa data em específico completou meio século agora e todos os desenvolvedores, os analistas de sistemas, o mercado e, em última instância, o usuário, devem estar atentos: começou uma contagem regressiva para o Unix e ela termina em 2038.

Para os não-iniciados, janeiro, 1, de 1970 determina o início da contagem do tempo POSIX, fundamental para o universo UNIX e a linguagem C. Esse é o  marco zero de uma contagem em segundos que ainda não terminou. Em termos leigos, o sistema operacional UNIX e seus derivados (incluindo o popular Linux) armazenam valores de data e tempo como o número de segundos que transcorreram desde 1970-01-01 00:00:00 UTC.

Você pode saber esse valor exato a qualquer momento no seu sistema operacional UNIX, com a seguinte linha de comando:

$ date +%s

Certamente, será um número bem alto. Se você não utiliza um sistema operacional baseado em UNIX (como o Windows), é possível consultar a marcação POSIX, também chamado de tempo Epoch, em diversos serviços online, como o Epoch Converter. No momento em que consultei o serviço, estávamos em 1579635481 segundos desde primeiro de janeiro de 1970.

A princípio pode parecer que utilizar um sistema tão hostil para a leitura humana não foi uma das melhores ideias de Ken Thompson e Dennis Ritchie, mas o fato é que suas aplicações e vantagens excederam o fato de não ser amigável. Para fazer a conversão, qualquer rotina já resolve facilmente. Enquanto isso, no núcleo do sistema, muitos problemas são evitados dessa forma. Lembra do Bug do Milênio? De como a mudança de ano de 1999 para 2000 poderia provocar pane generalizada em sistemas que armazenavam somente os dois últimos dígitos? Por razões óbvias, sistemas UNIX passaram incólumes por esse susto.

O tempo Posix é guardado em formato 32 bits. A partir da quantidade de segundos transcorridos desde o marco zero, é perfeitamente recuperável a data exata de determinado evento.

Porém, essa abordagem, depois de 50 anos, já demonstra problemas no horizonte. Para entender o que vai acontecer em 2038, é necessário entendermos os limites do 32 bits. Esse valor seria, em teoria, 2 ^32, o que nos deixaria com um limite de 4294967296 segundos. Parece muito, mas não é.

Na prática, o UNIX usa um bit para acomodar o sinal de negativo, já que ele precisa estar preparado para lidar com valores negativos. Desta forma, o valor seria 2 ^31, totalizando um total de 2147483648 segundos. Considerando que a contagem começou no zero, o UNIX, em formato Epoch, só pode armazenar datas até 2147483647 segundos depois de primeiro de janeiro de 1970. Depois desse limite, a contagem zera novamente, o que pode gerar um problema similar ao Bug do Milênio mais pra frente.

Então, o que parecia uma excelente ideia em 1969, a longo, longo prazo não se provou imune à falhas. Em tecnologia, esses erros são comuns do que se imagina: supor que uma determinada aplicação está preparada para escalar infinitamente, quando nada está, na verdade. A Lei de Moore atingiu seu limite, o IPv4 atingiu seu limite, o número de telefones disponíveis com uma determinada quantidade de dígitos atingiu seu limite, as frequências disponíveis em 4G também.

Cinquenta anos é um recorde bastante aceitável para o UNIX, então talvez Epoch não tenha sido uma má ideia. O futuro apenas chegou e nada escapa do tempo.

O que tudo isso significa na prática? Em 19 de janeiro de 2038, os sistemas baseados em UNIX vão acreditar estarem em 1901, com toda sorte de falhas catastróficas que isso pode oferecer. Esse é o chamado Bug Y2k38. Felizmente, temos 18 anos para resolver esse problema, o que é tempo de sobra se o trabalho não for deixado para a última hora. Em contrapartida, há aplicações legadas cujos criadores podem não estar mais por perto para resolver e debugar essa caixa-preta e 50 anos de “não mexe porque está funcionando” pode se revelar uma tarefa hercúlea.

Nesse exato segundo, desenvolvedores de kernel já estão debruçados sobre esse dilema. A opção mais óbvia seria migrar para representações de 64 bits dos valores, o que colocaria esse limite em um futuro tão distante que tudo que conhecemos de tecnologia já teria se tornado obsoleto. Calcula-se que o uso de valores de 64 bits atingiria seu limite daqui a 290 bilhões de anos…

Porém, o desafio ainda é mais complexo do que parece, como tudo em tecnologia. Essa abordagem poderia provocar quebra da compatibilidade binária de softwares, dados armazenados e de qualquer sistema que manipule datas representadas no formato binário.