Ruby的callcc
捕获当前的continuation,随后可以调用它来恢复控件,但不能恢复数据。我想捕获当前的延续以及当前的内存图像。
在我看来,抓住堆应该不是很困难;我可以依靠ObjectSpace::each_object
和ObjectSpace::dump_all
,或Marshal.dump
,或简称Object.clone
。但是,我没有看到任何简单的方法来恢复堆。理想情况下,我想遍历object_id -> object
地图,为每个object_id
恢复对象的旧图像(如果相应的对象已经过GC,则重新添加object_id
) 。不出所料,没有Ruby级别的api可以让我这样做。我想知道是否有任何我可以使用的Ruby GC的低级钩子。
感谢任何帮助,包括有关替代方法的建议。
答案 0 :(得分:1)
要回答我自己的问题,Process.fork
可以用来或多或少地实现堆检查点和恢复的效果。每当我必须检查堆时,我会分叉一个新进程并让孩子继续。父进程现在包含检查点堆:
def checkpoint
if Process.fork.nil? then # if child, then resume execution immediately
return
else # if parent, wait for the child to exit.
Process.wait
end
return # Parent now resumes execution from state it was in before forking.
end
当状态必须恢复时,子进程只会退出:
def restore
Process.exit
end
我目前正在使用此解决方案,到目前为止还没有遇到任何问题。如果我将来发现任何答案,我会编辑这个答案。
答案 1 :(得分:0)
如何将每个推入堆栈?然后你可以继续弹出堆栈来检索数据。