¿Por qué un sistema puede dejar de responder?

12

Acabo de ejecutar dot(un programa para dibujar gráficos dirigidos) con un archivo de entrada que era tan grande que no se podía procesar en un tiempo razonable.

Todo mi sistema se congeló. Apenas podía llegar a una consola de texto con Ctrl+ Alt+ F1para matar dot, pero me llevó varios minutos.

¿Por qué el sistema permite algo como esto? ¿Por qué ofrece un programa no crítico como el dot99% del sistema y usa el 1% restante para responder?

Christoph Wurm
fuente
Posible duplicado de E / S de disco pesado unix.stackexchange.com/questions/5565/… y unix.stackexchange.com/questions/11/…
George M

Respuestas:

15

Así es como funcionan GNU / Linux y otros sistemas multitarea, comparten el procesador entre los procesos en ejecución, dotno tendrán el 99%, sino el 100% durante el 99% del tiempo. Cada proceso domina el procesador durante un cierto período de tiempo.

Esto lo manejan los programadores (Linux tiene varios programadores, algunos solo emplean la estrategia habitual, algunos intentan dar más tiempo a las interfaces de usuario, etc.).

Ahora, en su caso, el problema era, probablemente, que dotno tomaba mucho tiempo del procesador, sino mucha memoria. Y cuando un programa usa demasiada memoria, hay una agitación , que es exactamente un proceso que hace que el sistema se congele, no porque dotesté haciendo mucho, sino porque el núcleo tiene que mover las páginas de memoria de un lado a otro entre el disco (intercambio de partición) y la memoria del sistema.

Incluso si dotsolo tomara el 99% del tiempo de CPU, lo más probable es que cambiar a un terminal de texto sea casi inmediato, lo que sucede es que el kernel tiene que sacar dotcosas de la memoria para que pueda Xvolver a la memoria y Xpoder ver las claves simplemente presionas y te mueves al terminal de texto, luego el kernel tiene que Xsalir de la memoria para la dotque aún se está ejecutando, y luego también moverlo dotpara mover los procesos del terminal de texto (¿tal vez login?) de nuevo en la memoria. (Si esto se ve desordenado, no sólo porque el ejemplo es desordenado - la realidad es esta . Desordenado)

Un ejemplo es que si inicia sesión en el terminal de texto, puede presionar teclas, retroceder y felizmente sucederá en tiempo real, pero si hace algo tan simple como ejecutar una herramienta pequeña ps, se "congelará" "por un tiempo porque tiene que liberar memoria para cargar ps(y también tiene que esperar en la cola de E / S del disco, que se está utilizando mucho para mover datos hacia y desde la memoria, hasta que pueda solicitarla psdesde el sistema de archivos) .

njsg
fuente
Hm, entonces el camino hacia una mejor experiencia de usuario sería especificar ciertos programas como " fijos " y así evitar que se intercambien.
Christoph Wurm
La adherencia no ha funcionado así desde los años 70 y la semántica original de la parte 'pegajosa'. Usted puede , sin embargo, bloquear (parte de) los programas en la memoria para que no se pueden intercambiar. Sin embargo, la memoria principal es un lujo costoso, por lo que esto no se puede hacer para todo.
Alexios
@njsg, gracias por la buena explicación. Una pregunta de seguimiento: ¿no hay forma de evitar la paliza? Entiendo que el intercambio hace que el uso de la memoria sea más efectivo en general, pero debería haber límites. En mi humilde opinión, un proceso tan esencial como X nunca se debe sacar de la memoria. ¿Hay alguna manera de configurar un sistema similar a Unix de modo que los procesos esenciales estén protegidos de ser movidos? En un servidor es una cosa diferente, pero en una computadora de escritorio preferiría que se bloquee un proceso con mucha memoria que dejar que mi computadora deje de hablarme.
A. Donda