How to “hibernate” a process in Linux by storing i

2019-01-07 04:31发布

Is it possible to 'hibernate' a process in linux? Just like 'hibernate' in laptop, I would to write all the memory used by a process to disk, free up the RAM. And then later on, I can 'resume the process', i.e, reading all the data from memory and put it back to RAM and I can continue with my process?

13条回答
Emotional °昔
2楼-- · 2019-01-07 04:42

Short answer is "yes, but not always reliably". Check out CryoPID:

http://cryopid.berlios.de/

Open files will indeed be the most common problem. CryoPID states explicitly:

Open files and offsets are restored. Temporary files that have been unlinked and are not accessible on the filesystem are always saved in the image. Other files that do not exist on resume are not yet restored. Support for saving file contents for such situations is planned.

The same issues will also affect TCP connections, though CryoPID supports tcpcp for connection resuming.

查看更多
仙女界的扛把子
3楼-- · 2019-01-07 04:42

As others have noted, it's difficult for the OS to provide this functionality, because the application needs to have some error checking builtin to handle broken streams.

However, on a side note, some programming languages and tools that use virtual machines explicitly support this functionality, such as the Self programming language.

查看更多
聊天终结者
4楼-- · 2019-01-07 04:44

The answers mentioning ctrl-z are really talking about stopping the process with a signal, in this case SIGTSTP. You can issue a stop signal with kill:

kill -STOP <pid>

That will suspend execution of the process. It won't immediately free the memory used by it, but as memory is required for other processes the memory used by the stopped process will be gradually swapped out.

When you want to wake it up again, use

kill -CONT <pid>

The more complicated solutions, like CryoPID, are really only needed if you want the stopped process to be able to survive a system shutdown/restart - it doesn't sound like you need that.

查看更多
5楼-- · 2019-01-07 04:44

There's ctrl+z in linux, but i'm not sure it offers the features you specified. I suspect you asked this question since it doesn't

查看更多
叼着烟拽天下
6楼-- · 2019-01-07 04:45

The issue is restoring the streams - files and sockets - that the program has open.

When your whole OS hibernates, the local files and such can obviously be restored. Network connections don't, but then the code that accesses the internet is typically more error checking and such and survives the error conditions (or ought to).

If you did per-program hibernation (without application support), how would you handle open files? What if another process accesses those files in the interim? etc?

Maintaining state when the program is not loaded is going to be difficult.

Simply suspending the threads and letting it get swapped to disk would have much the same effect?

Or run the program in a virtual machine and let the VM handle suspension.

查看更多
贪生不怕死
7楼-- · 2019-01-07 04:46

The short answer is "yes." You might start by looking at this for some ideas: ELF executable reconstruction from a core image (http://vx.netlux.org/lib/vsc03.html)

查看更多
登录 后发表回答