El bug del 2038

El efecto 2038 será un acontecimiento que nos llamará la atención a todos en el mundo de la informática mindial, nadie podrá escapar a ÉL, a menos que la migración de las arquitecturas sea un hecho para los millones de equipos en todo el mundo.

Aquí les dejo un pequeño post sobre este curioso efecto que no es más que una jugarreta más del caos de los números. En matemáticas se piensa que el origen del caos es en sí la explicación de porque existe esta ciencia…

efecto-2038

¿  19 de enero del año 2038 otro caos informático  ?

Unix
y Unix-como sistemas operativos no calculan el tiempo en el calendario Gregoriano,  ellos cuentan  simplemente el tiempo en segundos desde su
“cumpleaños arbitrario”,  GMT 00:00:00, jueves, de enero el 1, 1970 GMT.

Las máquinas de 32 bits,  como son la gran mayoría de máquinas que se
utilizan en estos momentos,  el 19 de enero de 2038 a las 03:14:07 se
dará una curiosa circunstancia y es que se llegará al tope de fecha
posible para almacenar con este sistema  y un segundo después   “03:14:08″
se desbordaría la memoria volviendo probablemente al 1 de enero de 1970
a las 00:00:00.

efecto-del-2038
Para esas fechas se habrán actualizado la gran mayoría de los aparatos y habrá soluciones para evitar este “efecto”

Algunos vendedores de Unix han comenzado ya a utilizar un time_t
firmado 64-bit
, esta arquitectura de 64 bits soluciona totalmente el
problema que no volvería a reproducirse porque usar un entero de 64
bits retrasaría la fecha del problema unos 290 mil millones de años.

“el siguiente es un extracto de Wikipedia”

Efecto 2038 fin de la arquitectura 32 bits

En informática, el problema del año 2038 podría causar que una parte del software fallara en ese año. El problema afecta a los programas que usen la representación del tiempo basada en el sistema POSIX, que se basa en contar el número de segundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 (ignorando los segundos intercalares).

Esta representación es un estándar de facto en los sistemas tipo Unix y también en los programas escritos para muchos otros sistemas operativos debido al gran alcance del lenguaje de programación C. 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 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.

64-bits2

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.

basurero_teclados1

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. Sin embargo, cientos de millones de
sistemas de 32 bits son utilizados todavía en el 2008, muchos en sistemas integrados, y no es posible asegurar que todos ellos habrán sido reemplazados antes del 2038.

Usar un entero de 64 bits retrasaría la fecha del problema unos 290 mil millones de años, mucho tiempo después de que el sol se haya extinguido.


¿  Porque se genera el efecto 2038  ?

“32bits” significa que el máximo valor que podrá tomar será el valor representable con 32 dígitos en binario, o sea 32 unos.
11111111111111111111111111111111 (32 unos), si convertimos ese numero
binario a decimal obtenemos 4294967295, pero debemos tomar en cuenta
que también entran los números negativos entonces la mitad seria para
los negativos y la otra mitad para positivos.

El rango seria entre -2.147.483.648 y 2.147.483.647, esto quiere decir
que el máximo valor del contador de segundos seria 21474837 luego
ocurriría un desborde convirtiéndose en un número negativo -2146483648
produciendo un error en muchos pero muchos programas a nivel global.

Entonces si convertimos 21474837 segundos a fechas tendriamos que la
ultima fecha calculable seria las 03:14:07 del 19 de enero de 2038.

La solución no será sencilla ya que se deberá pensar siempre en la compatibilidad de implementación.

A un tenemos 30 años y de seguro encontraran una solución asi que yo
creo que no hay de que alarmarse. Pero viéndolo desde el punto de vista
analítico esto podría traer muchos problemas en sistemas que no
implementen esa solución.

El efecto 2038 desde Lenguaje C

El problema? En un sistema de 32 bits, como son la mayoría de los
actuales, el tipo de datos “time_t” usado para guardar fechas equivale
a un “long”, un entero largo… y el número de segundos que se puede
contar acaba en 2038, en la madrugada del 19 de enero. Un ejemplo para
probarlo desde C sería éste
programacion_c

#include #include 

int main (){ time_t momento; int i;

 momento = 2147483641; for (i = 0; i < 10; i++) {   momento ++;   printf ( "El instante %ld se convierte en %s\n",     momento, ctime ( &momento ) ); }

 return 0;}

Se supone que es C estándar, debería funcionar tanto desde Windows como desde Linux, y su resultado debería ser algo como:

El instante 2147483642 se convierte en Tue Jan 19 04:14:02 2038
El instante 2147483643 se convierte en Tue Jan 19 04:14:03 2038
El instante 2147483644 se convierte en Tue Jan 19 04:14:04 2038
El instante 2147483645 se convierte en Tue Jan 19 04:14:05 2038
El instante 2147483646 se convierte en Tue Jan 19 04:14:06 2038
El instante 2147483647 se convierte en Tue Jan 19 04:14:07 2038
El instante -2147483648 se convierte en (null)
El instante -2147483647 se convierte en (null)
El instante -2147483646 se convierte en (null)
El instante -2147483645 se convierte en (null)

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s