2009-04-03 12 views
21

È possibile mettere in pausa un processo, salvare il contenuto della memoria in un file e poi ricaricare il file in modo da poter continuare il programma?Salvare la memoria di un processo per un uso futuro?

Edit Ho letto su questo:

http://en.wikipedia.org/wiki/Setcontext

E 'possibile scaricare il contenuto della struct, e in qualche modo costringere malloc per allocare le stesse aree di memoria?

+0

cryopid ha permesso di farlo senza modificare il kernel su linux. – user2284570

risposta

16

Tecnicamente è possibile, ma richiederebbe anche lo stato di tutte le risorse allocate al sistema, ad esempio i file descriptor e quindi il ripristino. Quindi è un compito impegnativo.

Il modo più semplice per ottenere ciò che si desidera è utilizzare una macchina virtuale come VMWare. Quando lo si mette in pausa, si salva effettivamente l'intero stato della macchina insieme a tutti i programmi in esecuzione.

+0

E VMWare si assicura che altre risorse come le interfacce di rete vengano riavviate correttamente. –

+0

Non è solo una sfida, ma, in generale, impossibile. Vedi http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg

+0

@GSerg, quel collegamento presuppone che le risorse esterne al processo vengano rilasciate quando è ibernato. Ciò non deve essere il caso in una situazione in cui il processo è semplicemente nascosto in una coda non in esecuzione e lo spazio degli indirizzi viene inviato su disco senza rinunciare alle risorse di processo exo. – paxdiablo

0

Workflow Foundation in .NET 3.0 e versioni successive consente di arrestare e riavviare i flussi di lavoro.

2

Bene java ha la serializzazione e arriva da qualche parte vicino ad esso. Anche se non è possibile farlo al livello più basso come la CPU registra l'indirizzo di memoria ecc, poiché ciò richiederà che il sistema operativo si trovi nello stesso stato in cui si trovava quando si "sospendeva" il processo.

questo può essere un buon progetto come un modulo del kernel di Linux :-)

1

E 'disordinato al punto di essere impossibile quando si tratta di codice nativo, come sharptooth menziona.

Tuttavia, alcuni programmi (iirc emacs, ad esempio) hanno utilizzato i trucchi "dump my own memory" per conservare la configurazione, invece di gestire i file di configurazione. Tuttavia, ciò non funziona su Windows, dal momento che gli eseguibili vengono eseguiti in modalità di condivisione deny-write. Ma è un trucco carino (anche se pericoloso) su linux o DOS :)

6

Questo è solitamente chiamato persistent continuation. Alcune lingue come SmallTalk e SBCL hanno un supporto di prima classe per le continuazioni persistenti. La maggior parte delle lingue no.

+0

Le continuazioni strutturano il flusso di controllo all'interno di un programma, non si fermano né avviano l'esecuzione dei programmi. – sth

+0

@sth Alcuni runtime di Smalltalk e SBCL supportano continuazioni persistenti, anziché solo quelle transitorie a cui stai pensando. –

4

A seconda delle esigenze e OS si potrebbe provare a forzare un core dump

non ho mai provato in realtà il caricamento di un programma scaricato nucleo posteriore diversa da quella in gdb. Sembra che qualsiasi file che hai aperto o qualsiasi altro stato che non è presente nella memoria del tuo programma verrebbe perso come sottolineato.

Un altro approccio sarebbe semplicemente la serializzazione dello stato necessario per il disco nel programma. Fa schifo ma è probabilmente il modo più affidabile a meno che non ti accontenti di sospendere l'esecuzione del programma. Questo potrebbe essere fatto con la libreria di thread del tuo sistema operativo. O come un poster ha sottolineato con il tuo guscio.

0

Raymond Chen explains perché è impossibile. Ovviamente, non tutti i tecnici Microsoft lo leggono, perché il compilatore di Visual Studio esegue questa operazione quando precompilare le intestazioni. Esegue il dump del proprio stato dopo aver compilato le intestazioni per la prima volta e ripristinato per continuare.

+1

Il signor Chen ha ragione e torto. È impossibile solo se le risorse del processo esterno scompaiono. Questo non deve accadere. È possibile interrompere totalmente un processo preservando le risorse out-of-process, ovviamente non sopravviverà a un riavvio, ma non è necessariamente ciò che è necessario qui. – paxdiablo

+0

La possibilità di arrestare un processo completamente per un'ora mentre si esegue un lavoro intensivo della CPU è ancora utile. Quindi devi solo riavviare quel processo. SIGSTOP/SIGCONT lo fa già su UNIX et al. – paxdiablo

+0

In realtà, per questo è sufficiente abbassare la priorità in idle. Nessun danno nell'usare l'ultimo% dell'ultimo core, molti algoritmi paralleli non possono sostenere il parallelismo completo dell'intera operazione, specialmente con gli alberi. – MSalters

1

Citazione da "Persist (hibernate!) a process state to disk for quiker loading" (sic):

Q.Puoi spiegare di più su come funziona lo swap in modo che lo stato del processo venga salvato su disco e riutilizzarlo quando richiesto? "

A. È molto semplice. Il file di pagina è un posto speciale su un disco in cui i processi inattivi sono i memorizzati in modo altamente ottimizzato. Quando tale processo riprende in esecuzione, il sistema legge automagicamente di nuovo a memoria e solo continua dal punto in cui era. e 'sorta di come programmi eseguiti su iPad :)

tutte queste funzionalità è già integrato in Windows mentre il processo continua a essere in esecuzione, il sistema assicura che sia nella memoria o nel pa file ge (ci sono tuttavia pochi comandi, che puoi ignorare con il tuo ).

In altre parole, Windows ha già la possibilità di ibernare un processo nel file di paging. @MSalters cita da Raymond Chen "explaining why its impossible" è semplicemente sbagliato.

+1

Si noti che la contabilità per un processo di paging è ancora presente nella RAM (kernel). Le maniglie delle finestre rimangono valide; puoi inviarlo a messaggi che lo faranno tornare alla pagina, ecc. Ecco perché questo in genere non è considerato il processo di ibernazione. – MSalters

Problemi correlati