En informática , un bloqueo se produce cuando un proceso o sistema deja de responder a las entradas . Un ejemplo típico es cuando la interfaz gráfica de usuario de una computadora (como Microsoft Windows [a] ) ya no responde cuando el usuario escribe en el teclado o mueve el mouse. El término cubre una amplia gama de comportamientos tanto en clientes como en servidores , y no se limita a problemas de interfaz gráfica de usuario.
Los bloqueos tienen diversas causas y síntomas, entre los que se incluyen defectos de software o hardware , como un bucle infinito o un cálculo ininterrumpido de larga duración, agotamiento de recursos ( thrashing ), hardware de bajo rendimiento ( throttling ), eventos externos como una red informática lenta , configuración incorrecta y problemas de compatibilidad . La razón fundamental suele ser el agotamiento de recursos: los recursos necesarios para que funcione alguna parte del sistema no están disponibles debido a que otros procesos los están utilizando o simplemente son insuficientes. A menudo, la causa es una interacción de múltiples factores, lo que hace que "bloqueo" sea un término genérico más que técnico.
Un bloqueo puede ser temporal si es causado por una condición que se resuelve sola, como un hardware lento, o puede ser permanente y requerir una intervención manual, como en el caso de un error lógico de hardware o software. Muchos sistemas operativos modernos proporcionan al usuario un medio para cerrar forzosamente un programa bloqueado sin reiniciar ni cerrar sesión ; algunos sistemas operativos, como los diseñados para dispositivos móviles, pueden incluso hacer esto automáticamente. En los bloqueos más graves que afectan a todo el sistema, la única solución puede ser reiniciar la máquina, generalmente mediante un ciclo de encendido y apagado con un botón de reinicio.
Un bloqueo se diferencia de una caída , en la que el fallo es inmediato y no está relacionado con la capacidad de respuesta de las entradas. [ cita requerida ]
En un sistema operativo multitarea, es posible que un proceso o subproceso individual se quede bloqueado, como por ejemplo, si se bloquea en un recurso o entra en un bucle infinito, aunque el efecto en el sistema en general varía significativamente. En un sistema multitarea cooperativo , cualquier subproceso que se quede bloqueado sin ceder bloqueará el sistema, ya que se bloqueará a sí mismo como subproceso en ejecución e impedirá que se ejecuten otros subprocesos.
Por el contrario, los sistemas operativos modernos utilizan principalmente multitarea preventiva , como Windows 2000 y sus sucesores, así como Linux y macOS de Apple Inc. En estos casos, un solo hilo que se atasca no necesariamente colgará el sistema, ya que el sistema operativo lo interrumpirá cuando expire su porción de tiempo, lo que permitirá que se ejecute otro hilo. Si un hilo se cuelga, el programador puede cambiar a otro grupo de tareas interdependientes para que no se cuelguen todos los procesos. [1] Sin embargo, un hilo atascado seguirá consumiendo recursos: al menos una entrada en la programación, y si se está ejecutando (por ejemplo, atascado en un bucle infinito), consumirá ciclos de procesador y energía cuando esté programado, lo que ralentizará el sistema aunque no lo cuelgue.
Sin embargo, incluso con la multitarea preventiva, un sistema puede bloquearse, y una tarea malintencionada o con un comportamiento incorrecto puede bloquear el sistema, principalmente al monopolizar algún otro recurso, como la E/S o la memoria, aunque el tiempo del procesador no se pueda monopolizar. Por ejemplo, un proceso que bloquea el sistema de archivos a menudo bloqueará el sistema.
Moverse por una ventana sobre un programa colgado durante un bloqueo puede provocar que se vuelva a dibujar un rastro de la ventana. [2]
El hardware puede provocar que una computadora se bloquee, ya sea porque es intermitente o porque no coincide con otro hardware en la computadora [3] (esto puede ocurrir cuando se realiza una actualización ). El hardware también puede volverse defectuoso con el tiempo debido a la suciedad o al daño por calor.
Un bloqueo también puede ocurrir debido a que el programador tiene condiciones de terminación incorrectas para un bucle o, en un sistema operativo multitarea cooperativo , se olvida de ceder el paso a otras tareas. Dicho de otra manera, muchos bloqueos relacionados con el software son causados por subprocesos que esperan que ocurra un evento que nunca ocurrirá. [4] Esto también se conoce como bucle infinito .
Otra causa de los bloqueos es una condición de carrera en la comunicación entre procesos . Un proceso puede enviar una señal a un segundo proceso y luego detener la ejecución hasta que reciba una respuesta. Si el segundo proceso está ocupado, la señal se verá obligada a esperar hasta que el proceso pueda acceder a ella. Sin embargo, si el segundo proceso estuviera ocupado enviando una señal al primer proceso, ambos procesos esperarían eternamente a que el otro respondiera a las señales y nunca verían la señal del otro (este evento se conoce como un bloqueo ). Si los procesos son ininterrumpibles, se bloquearán y deberán cerrarse. Si al menos uno de los procesos es un proceso crítico del núcleo , todo el sistema puede bloquearse y deberá reiniciarse.
Puede parecer que un equipo se bloquea cuando en realidad su funcionamiento es muy lento. Esto puede deberse a que hay demasiados programas ejecutándose a la vez, a que no hay suficiente memoria ( RAM ) o fragmentación de la memoria , a que el acceso al hardware es lento (especialmente a dispositivos remotos), a que las API del sistema son lentas, etc. También puede deberse a programas ocultos que se instalaron de forma subrepticia, como el software espía .
En muchos casos, los programas pueden parecer bloqueados, pero progresan lentamente y esperar unos minutos permitirá que la tarea se complete.
Los sistemas operativos modernos ofrecen un mecanismo para finalizar procesos bloqueados, por ejemplo, con el comando kill de Unix o mediante un medio gráfico como el botón "Finalizar tarea" del Administrador de tareas de Windows (seleccione el proceso en particular en la lista y presione "Finalizar tarea"). Los sistemas más antiguos, como los que ejecutan MS-DOS , las primeras versiones de Windows o Mac OS clásico, a menudo necesitaban reiniciarse por completo en caso de que se bloqueara el sistema.
En dispositivos integrados donde la interacción humana es limitada, un temporizador de vigilancia puede reiniciar la computadora en caso de que se cuelgue.