El año 2038 para los sistemas UNIX: Colapso de sistemas?
Imprime esta anotacion -
09 Marzo, 08 by nacho
¿Cómo funcionan los relojes internos de los PC’s?
La gran mayoría de sistemas informáticos tienen implementado un reloj interno cuyo funcionamiento es el siguiente: tomando una fecha base (se cogió 1970 para la mayoría de sistemas), cuenta los segundos que han pasado desde entonces y los almacena en una variable. Para conocer la fecha, se transforman los segundos almacenados por esa variable en la fecha completa (hora-minuto-segundo; día-mes-año). Esto se consigue a través de un algoritmo muy sencillo (más abajo os dejo algunos códigos), y funciona “perfectamente”.
¿Cual es el problema del año 2038?
Hasta ahora la arquitectura más usada es la que se basa en 32-bits. En la mayoría de sistemas de 32-bits, el tipo de dato time_t usado para guardar el contador de segundos es un entero (nombre que designa un tipo de variable en programación comprendida entre unos valores máximos y mínimos) de 32-bits con signo, es decir, que puede representar un rango de números entre -2.147.483.648 y 2.147.483.647 (-231 y 231-1; 1 bit para el signo, y 31 para el valor absoluto), por lo que el último segundo representable con este formato será a las 03:14:07 UTC del 19 de enero de 2038, cuando el contador llegue a 2147483647. Un segundo después, el contador se desbordará, y saltará al valor -2.147.483.648, que causará el fallo de programas que interpretarán el tiempo como que están en 1901 ó 1970 (dependiendo de la implementación), en vez de 2038. A su vez, esto causaría cálculo y procesamiento incorrecto.
Código simple escrito en C para ver un ejemplo de que pasaría
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
int main (int argc, char **argv)
{
time_t t;
t = (time_t) 1000000000;
printf (”%d, %s”, (int) t, asctime (gmtime (&t)));
t = (time_t) (0×7FFFFFFF);
printf (”%d, %s”, (int) t, asctime (gmtime (&t)));
t++;
printf (”%d, %s”, (int) t, asctime (gmtime (&t)));
return 0;
}
El resultado sería algo parecido a lo que muestra este gif:

¿Soluciones?
No hay una forma sencilla de arreglar este problema para las combinaciones existentes de CPU/SO. Cambiar la definición de time_t para usar un tipo de 64-bits rompería la compatibilidad binaria para el software, almacenamiento de datos, y, por lo general, cualquier cosa que tenga algo que ver con la representación binaria del tiempo. Cambiar time_t a un entero de 32-bits sin signo afectaría a los programas que hacen cálculos con diferencias de tiempo.
La mayoría de sistemas operativos para arquitecturas de 64-bits utilizan enteros de 64-bits para time_t. La migración a estos sistemas está todavía en proceso y se espera que se complete antes del 2038.
Usar un entero de 64 bits retrasaría la fecha del problema unos 290 mil millones de años, quizás mucho tiempo después de que el sol se haya extinguido.
Enlace | 2038bug
Enlace | Explicación en la wikipedia
Curiosidad
Como una mera nota curiosa, el problema es tan grave, que si por ejemplo buscamos 2038 en Google, éste nos devuelve ni más ni menos que 40.600.000 resultados… unos pocos, ¿no?







![El RSS de Soy Gik está validado [Valid RSS]](http://feedvalidator.org/images/valid-rss.png)
Lordvader Comenta: 09.03.08 a las 10:31
Digo yo que en treinta años alguna solución encontrarán, no?
jose87 Comenta: 09.03.08 a las 12:15
Supongo que sí, son bastantes años para que se curren algo, no??
magarto Comenta: 09.03.08 a las 16:04
Ala, ya tenemos el Efecto 2038
z3p0l Comenta: 09.03.08 a las 17:53
Juas, para el 2038 ya se habra implementado de forma masiva la arquitectura de 64 bits…existiendo una tecnologia más avanzada, dudo que no se utilice…
Salu2!
Santi! Comenta: 10.03.08 a las 22:10
Como se ha dicho, dudo que llegue a suceder algo, faltan aún muchos años por venir…
Esto me recuerda el temido Y2K… y al final no pasó nada
Caos Unix - 2038 « Saforas’$ the::beastieux Comenta: 19.03.08 a las 19:00
[…] información en: soygik o […]
Error global en relojes UNIX en el 2038? | Ubuntu Linux Comenta: 22.03.08 a las 9:10
[…] Información completa aquí > […]
Problemas en relojes UNIX en el 2038 « linux at home Comenta: 23.03.08 a las 5:27
[…] leer más de todo esto, en la wikipedia, o en el artículo en SoyGik o en […]
Queni Comenta: 03.07.08 a las 6:11
naaa no le veo gran problema, es claro que en 30 años encontraran una solución sencilla, hoy en dia es un hecho que la tecnología de 32 bits se va yendo poco a poco como sucedió con la de 16, no dudo que un futuro la de 64 le pase lo mismo y así sucesivamente
» Ubuntu Linux para Seres Humanos » Error global en relojes UNIX en el 2038 Comenta: 15.10.08 a las 3:32
[…] Puedes leer más de todo esto, en la wikipedia, o en el artículo en SoyGik. […]