¿Es posible 'hibernar' un proceso en linux? Al igual que 'hibernar' en una computadora portátil, debería escribir toda la memoria utilizada por un proceso en el disco, liberar la RAM. Y luego, más adelante, puedo 'reanudar el proceso', es decir, leer todos los datos de la memoria y volver a ponerlos en la RAM y puedo continuar con mi proceso.
linux
linux-kernel
hap497
fuente
fuente
Respuestas:
Solía mantener CryoPID , que es un programa que hace exactamente lo que estás hablando. Escribe el contenido del espacio de direcciones de un programa, VDSO, referencias de descriptores de archivos y estados en un archivo que luego se puede reconstruir. CryoPID comenzó cuando no había ganchos utilizables en Linux y funcionó completamente desde el espacio de usuario (en realidad, todavía funciona, dependiendo de la configuración de su distribución / kernel / seguridad).
Los problemas fueron (de hecho) sockets, señales RT pendientes, numerosos problemas de X11, la implementación de getpid () de almacenamiento en caché de glibc, entre muchos otros. La aleatorización (especialmente VDSO) resultó ser insuperable para los pocos de nosotros que trabajamos en ella después de que Bernard se alejó de ella. Sin embargo, fue divertido y se convirtió en el tema de varias tesis de maestría.
Si solo está contemplando un programa que puede guardar su estado de ejecución y reiniciar directamente en ese estado, es mucho ... mucho ... más fácil guardar esa información desde el propio programa, tal vez al dar servicio a una señal.
fuente
Me gustaría poner una actualización de estado aquí, a partir de 2014.
La respuesta aceptada sugiere CryoPID como una herramienta para realizar Checkpoint / Restore, pero encontré que el proyecto no se mantenía y era imposible de compilar con kernels recientes. Ahora, encontré dos proyectos mantenidos activamente que proporcionan la función de control de aplicaciones.
El primero, el que sugiero porque tengo más suerte ejecutándolo, es CRIU que realiza el punto de control / restauración principalmente en el espacio de usuario, y requiere que la opción del kernel CONFIG_CHECKPOINT_RESTORE esté habilitada para funcionar.
Este último es DMTCP ; citando de su página principal:
También hay una bonita página de Wikipedia sobre el argumento: Application_checkpointing
fuente
Las respuestas que mencionan
ctrl-z
realmente hablan de detener el proceso con una señal, en este casoSIGTSTP
. Puede emitir una señal de parada conkill
:Eso suspenderá la ejecución del proceso. No liberará inmediatamente la memoria utilizada por él, pero como se requiere memoria para otros procesos, la memoria utilizada por el proceso detenido se irá intercambiando gradualmente.
Cuando quieras volver a despertarlo, usa
Las soluciones más complicadas, como CryoPID, en realidad solo son necesarias si desea que el proceso detenido pueda sobrevivir a un apagado / reinicio del sistema; no parece que lo necesite.
fuente
El problema es restaurar los flujos (archivos y sockets) que el programa tiene abiertos.
Cuando todo su sistema operativo hiberna, los archivos locales y demás, obviamente, se pueden restaurar. Las conexiones de red no lo hacen, pero luego el código que accede a Internet suele ser más una verificación de errores y sobrevive a las condiciones de error (o debería hacerlo).
Si hiciera una hibernación por programa (sin compatibilidad con la aplicación), ¿cómo manejaría los archivos abiertos? ¿Qué pasa si otro proceso accede a esos archivos mientras tanto? etc?
Mantener el estado cuando el programa no está cargado será difícil.
¿Simplemente suspender los hilos y dejar que se intercambien en el disco tendría el mismo efecto?
O ejecute el programa en una máquina virtual y deje que la VM maneje la suspensión.
fuente
La respuesta corta es "sí, pero no siempre de forma fiable". Echa un vistazo a CryoPID:
http://cryopid.berlios.de/
De hecho, los archivos abiertos serán el problema más común. CryoPID establece explícitamente:
Los mismos problemas también afectarán las conexiones TCP, aunque CryoPID admite tcpcp para reanudar la conexión.
fuente
El kernel de Linux ahora ha implementado parcialmente los futuros de punto de control / reinicio: https://ckpt.wiki.kernel.org/ , el estado está aquí .
Alguna información útil se encuentra en lwn (linux semanal net): http://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......
Entonces la respuesta es "SI"
fuente
La respuesta corta es sí." Puede comenzar mirando esto para obtener algunas ideas: reconstrucción ejecutable ELF a partir de una imagen central ( http://vx.netlux.org/lib/vsc03.html )
fuente
Extendí Cryopid produciendo un paquete llamado Cryopid2 disponible en SourceForge. Esto puede migrar un proceso, así como hibernarlo (junto con cualquier archivo y sockets abiertos; los datos en sockets / tuberías se absorben en el proceso en hibernación y se escupen nuevamente cuando se reinicia el proceso).
La razón por la que no he estado activo con este proyecto es que no soy un desarrollador de kernel; tanto esto (como el cryopid original) necesitan contar con alguien que pueda hacerlos funcionar con los últimos kernels (por ejemplo, Linux 3.x) .
El método Cryopid funciona, y es probablemente la mejor solución para la hibernación / migración de procesos de propósito general en Linux con la que me he encontrado.
fuente
Como han señalado otros, es difícil para el sistema operativo proporcionar esta funcionalidad, porque la aplicación necesita tener alguna verificación de errores incorporada para manejar transmisiones rotas.
Sin embargo, en una nota al margen, algunos lenguajes de programación y herramientas que utilizan máquinas virtuales admiten explícitamente esta funcionalidad, como el lenguaje de programación Self .
fuente
Ctrl-Z aumenta las posibilidades de que se intercambien las páginas del proceso, pero no libera completamente los recursos del proceso. El problema de liberar completamente los recursos de un proceso es que cosas como los manejadores de archivos, los sockets son recursos del kernel que el proceso puede usar, pero no sabe cómo persistir por sí solo. Entonces Ctrl-Z es tan bueno como parece.
fuente
Hubo algunas investigaciones sobre el punto de control / restauración para Linux en 2.2 y 2.4 días, pero nunca pasó del prototipo. Es posible (con las advertencias descritas en las otras respuestas) para ciertos valores de posible; puede escribir un módulo del kernel para hacerlo, es posible. Pero por el valor común de posible (puedo hacerlo desde el shell en una distribución comercial de Linux), todavía no es posible.
fuente
Este es el objetivo final del sistema operativo agrupado. Mathew Dillon hace un gran esfuerzo para implementar algo como esto en su proyecto Dragonfly BSD .
fuente
agregando otra solución alternativa: puede usar virtualbox. ejecute sus aplicaciones en una máquina virtual normal y simplemente "guarde el estado de la máquina" cuando lo desee. Sé que esta no es una respuesta, pero pensé que podría ser útil cuando no hay opciones reales.
si por alguna razón no le gusta virtualbox, vmware y Qemu son tan buenos.
fuente
Hay
ctrl+z
en linux, pero no estoy seguro de que ofrezca las características que especificó. Sospecho que hiciste esta pregunta porque nofuente