process - operating - scheduling algorithm
¿Guardar la memoria de un proceso para su uso posterior? (8)
Bueno, Java tiene una serialización y se acerca a ella. Aunque no puede hacerlo en el nivel más bajo, como la CPU, la dirección de la memoria, etc., ya que esto requerirá que el sistema operativo se encuentre en el mismo estado en el que "pausó" el proceso.
Este puede ser un buen proyecto como módulo del kernel de Linux :-)
¿Es posible pausar un proceso, guardar el contenido de la memoria en un archivo y luego volver a cargar el archivo para que pueda continuar el programa?
Editar He estado leyendo sobre esto:
http://en.wikipedia.org/wiki/Setcontext
¿Es posible volcar el contenido de la estructura y, de alguna manera, obligar a malloc a asignar las mismas regiones de memoria?
Cita de " Persistir (hibernar!) Un estado de proceso en el disco para la carga de un quiker " (sic):
P. ¿Puede explicar más sobre cómo funciona este intercambio para que el estado del proceso se guarde en el disco y se reutilice cuando sea necesario?
A. Es muy simple. El archivo de página es un lugar especial en un disco donde los procesos inactivos se almacenan de una manera altamente optimizada. Cuando dicho proceso se reanuda en ejecución, el sistema lo lee automáticamente en la memoria y simplemente continúa desde donde estaba. Es una especie de cómo se ejecutan los programas en iPad :)
Toda esta funcionalidad ya está incorporada en Windows. Mientras el proceso se sigue ejecutando, el sistema se asegura de que esté en la memoria o en el archivo de la página (aunque hay algunas excepciones, que puede ignorar).
En otras palabras, Windows ya tiene la capacidad de hibernar un proceso en el archivo de la página. La cita de @MSalters de Raymond Chen " explica por qué es imposible " es simplemente errónea.
Dependiendo de sus requisitos y sistema operativo, podría intentar forzar un volcado de núcleo
Nunca he intentado cargar una copia de seguridad de un programa volcado que no sea gdb. Parece que cualquier archivo que tenga abierto o cualquier otro estado que no esté en la memoria de sus programas se perdería, tal como lo señaló Sharp Tooth.
Otro enfoque sería simplemente serializar el estado que necesita para el disco en su programa. Apesta, pero es probablemente la forma más confiable a menos que esté contento con la suspensión de la ejecución del programa. Eso podría hacerse con la biblioteca de hilos de su sistema operativo. O como un cartel señalado con su concha.
Es complicado hasta el punto de ser imposible cuando se trata de código nativo, como lo menciona Sharptooth.
Sin embargo, algunos programas (iirc emacs, por ejemplo) han utilizado trucos de "descargar mi propia memoria" para conservar la configuración, en lugar de tratar con archivos de configuración. Sin embargo, esto no funciona en Windows, ya que los ejecutables se ejecutan en modo compartir denegación-escritura. Pero es un truco lindo (aunque peligroso) en Linux o DOS :)
Esto se suele llamar una continuación persistente . Algunos idiomas como SmallTalk y SBCL tienen soporte de primera clase para continuaciones persistentes. La mayoría de los idiomas no lo hacen.
Raymond Chen blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx por qué es imposible. Obviamente, no todos los ingenieros de Microsoft leen esto, porque el compilador de Visual Studio hace esto cuando precompila los encabezados. Vuelca su propio estado después de compilar los encabezados por primera vez y se restaura para continuar.
Técnicamente es posible, pero también requeriría guardar todos los recursos asignados por el sistema, como por ejemplo los descriptores de archivos y luego restaurarlos. Así que es una tarea desafiante.
La forma más fácil de lograr lo que desea es utilizar una máquina virtual como VMWare. Cuando se detiene, realmente se guarda todo el estado de la máquina junto con todos los programas que se ejecutan.
Workflow Foundation en .NET 3.0 y superior permite detener y reiniciar los flujos de trabajo.