2009-12-06 21 views
5

Puede conocer muchos programas, por ejemplo, algunos programas de descifrado de contraseñas, podemos detenerlos mientras se están ejecutando, y cuando ejecutamos el programa nuevamente (con o sin ingresar la misma entrada), podrán continuar desde donde se han ido Me pregunto qué tipo de técnica están usando esos programas?¿Cómo guardar el progreso de un programa y reanudarlo más tarde?

[Editar] Estoy escribiendo un programa basado principalmente en funciones de recursión. Según tengo conocimiento, creo que es increíblemente difícil guardar esos estados en mi programa. ¿Existe alguna técnica que, de alguna manera, guarde el contenido de la pila, las llamadas a funciones y los datos involucrados en mi programa y luego, cuando se reinicie, se puede ejecutar como si no se hubiera detenido? Estos son solo algunos conceptos que tengo en mente, así que, por favor, perdóneme si no tiene sentido ...

Respuesta

2

que va a ser diferente para cada programa. Para algo tan simple como, por ejemplo, un cracker de contraseñas de fuerza bruta, todo lo que realmente necesitaría ser salvado era la última contraseña que se intentó. Para otras aplicaciones, puede que necesite almacenar varios puntos de datos, pero eso es todo lo que realmente importa: guardar y cargar la cantidad mínima de información necesaria para reconstruir dónde se encontraba.

Otra técnica común es guardar una imagen de todo el estado del programa. Si alguna vez jugaste con un emulador de consola de juegos con la capacidad de guardar el estado, así es como lo hacen. Existe una técnica similar en Python con decapado. Si el entorno es lo suficientemente estable (es decir, sin punteros variables), simplemente copie el estado de la memoria completa de las aplicaciones en un archivo binario. Cuando desee reanudar, vuelva a copiarlo en la memoria y comience a ejecutar nuevamente. Esto le proporciona una recuperación de estado casi perfecta, pero el hecho de que sea o no posible depende mucho del entorno/idioma. (Por ejemplo: la mayoría de las aplicaciones C++ no podrían hacer esto sin ayuda del SO o si se crearon MUY cuidadosamente teniendo esto en cuenta)

+0

Guau, esto es muy informativo. Voy a mirarlo detenidamente. Muchas gracias. :RE – wakandan

1

Para lograr esto, debe guardar continuamente el estado (es decir, en qué parte del cálculo se encuentra). De esta forma, si interrumpe el probram, cuando se reinicie, sabrá que está en el medio del cálculo, y dónde estaba en ese cálculo.

También es probable que desee tener su cálculo principal en una secuencia separada de su interfaz de usuario - de esta manera puede responder a las solicitudes de "cierre/interrupción" de su interfaz de usuario y manejarlas adecuadamente deteniendo/pausando el hilo.

+0

Gracias por su ayuda: D – wakandan

2

Use Persistencia.

Persistencia es un mecanismo a través del cual la vida de un objeto está más allá de la vida útil de ejecución de los programas.

Almacenar el estado de los objetos involucrados en el proceso en el disco duro local usando la serialización .

+0

Me tomará un montón de tiempo entender lo que dice aquí: D. Muchas gracias. Voy a cavar ahora. – wakandan

+0

Me pilló la programación y olvidé que debía adjuntar un enlace. Lo siento por eso. – Tebo

0

Para Linux, hay un proyecto llamado CRIU, que admite el guardado de nivel de proceso y reanudar Es como la hibernación y la reanudación del sistema operativo, pero la granularidad se divide en procesos. También es compatible con tecnologías de contenedores, específicamente Docker. Consulte http://criu.org/ para obtener más información.

Cuestiones relacionadas