¿Por qué fallan las computadoras o los sitios web?

Las computadoras y los sitios web modernos no lo hacen, muy a menudo.

No es raro que un programa se bloquee debido a una excepción no controlada. Eso a menudo se debe a un error del programador o una falta de previsión. Por ejemplo, un programa puede pedirle al usuario dos números, A y B, luego dividir A por B e imprimir la respuesta. Todo va bien cuando el usuario intenta 6/3, 5/2, 1/3, etc. hasta que prueba 5/0. Eso es matemáticamente imposible y produce un infinito, que el hardware de la computadora no puede manejar. La unidad de coma flotante genera una excepción: en una computadora anterior, en realidad, habría un cable que causó una interrupción para detener la CPU y hacer que procese la condición de error en lugar de seguir dividiendo números. Por lo general, un buen programador escribirá un controlador de excepciones. Después de todo, ¿por qué un usuario no debe ingresar “0”? Es un entero perfectamente bueno. El controlador hace que el programa diga algo como “Entrada inválida para B, no puedo dividir por cero, por favor intente nuevamente” y continúe. Pero si no hay un controlador, el sistema operativo lo resolverá al finalizar el programa: el programa se ha “bloqueado” con un error del sistema como “error SIGDIV de división por cero en la dirección 0xA452002”. Si no hay un sistema operativo (el sistema es muy antiguo o simple), la computadora se ha bloqueado. Hay una serie de excepciones que la computadora puede atrapar aparte de dividir por cero. Por ejemplo en Unix

Interrupción SIGINT
SIGILL instrucción ilegal (intentó ejecutar datos en lugar de código)
Error de bus SIGBUS
Violación de segmentación SIGSEGV
Se invoca la llamada al sistema SIGSYS inexistente
Señal de terminación del software SIGTERM

Una violación de la segmentación puede ser el resultado de un “desbordamiento del búfer”: leer más datos de los que un programa ha dejado espacio. O puede ser un simple error de programación; esencialmente un programa ha intentado acceder a una ubicación de memoria que no tiene permitido. Normalmente, el sistema operativo manejará todas estas señales, incluso si un programa de aplicación como un servidor web no lo hizo, y no se bloqueará. Si un programa de aplicación se comporta mal, por ejemplo, usa demasiada memoria, el sistema operativo lo matará (Linux tiene una cosa llamada “OOM-killer”).

El sistema operativo en sí es modular: hay un núcleo a cargo de la programación, además de controladores cargables para manejar diferentes tipos de hardware, como unidades de disco, tarjetas de red, tarjetas de video, y hay varias aplicaciones del sistema, como una interfaz gráfica, un servidor de impresión , administrador de red, etc. En general, un error no controlado en cualquiera de estos no hará que la computadora se bloquee, el núcleo seguirá ejecutándose y puede volver a intentar la operación fallida. Por ejemplo, una unidad de disco defectuosa (falla de hardware) puede generar errores que serán reintentados por el sistema operativo: la computadora se vuelve muy lenta, pero no se bloquea.

Sin embargo, si hay un error irrecuperable dentro del núcleo mismo, quizás debido a fallas de hardware como RAM defectuosa, el núcleo puede detenerse, bloqueando la máquina. Ver Kernel panic – Wikipedia. Estos son bastante raros hoy en día.

Muchas razones diferentes. Principalmente debido a errores del programador.

Por ejemplo, puede estar usando demasiada memoria, nunca liberar lo que se hizo, o liberarlo demasiado tarde. Podría realizar alguna acción que no es posible (por ejemplo, dividir por cero). Podría esperar algún valor de datos que no se inicializó / verificó correctamente. Vaya más allá del contenido de una lista / matriz. Agregar tipos incompatibles juntos. Compare valores que no son coincidencias exactas (por ejemplo, puntos flotantes). Cuando muchas entradas controlan un programa, los formatos pueden corromperse y causar resultados inesperados. Muchos otros problemas similares son los principales culpables de los accidentes. Estos son los tipos de cosas que los programadores tienden a tratar de eliminar durante las sesiones de depuración y prueba, pero muchas de ellas aún se escapan, especialmente si el programa / página se apresura demasiado.

Eso es solo con programas simplistas. Cuando se ejecutan múltiples procesos o subprocesos concurrentes (es decir, tratando de usar esas CPU de múltiples núcleos al máximo), un nuevo conjunto completo de posibles problemas también levanta sus cabezas feas. Más allá de lo normal.

Un programa de computadora es asombrosamente más complicado de lo que la mayoría de la gente creería. Por lo general, los programas crecen de la idea a la ejecución más o menos así:

  • Alguien piensa qué debería hacer el programa
  • un equipo de pocas personas amplía la idea general
  • otro equipo más grande pone todo en detalle
  • Un equipo mucho más grande interpreta la documentación del equipo anterior y escribe el código.
  • la computadora traduce el código a un código más simple (en términos de una computadora)
  • La computadora se traduce a un lenguaje informático básico (por ejemplo, Assembler), y luego tenemos el código que descargas, o tienes en un DVD, etc.
  • Otra computadora, con diferente sistema operativo y hardware, así como otro software previamente instalado, tiene que ejecutar el código y presentarle gráficos, sonido, dispositivos de entrada, etc.

Y esto no está considerando que otros programas se estén ejecutando al mismo tiempo, modificaciones a mitad de camino, modificaciones debidas a errores, modificaciones debidas a cambios en el negocio. y un montón de otras variables.

En realidad, estoy realmente sorprendido de que los programas realmente funcionen. Es una maravilla de la humanidad, haber archivado un proceso tan sorprendente.