加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

检查点并在Ruby中恢复堆

发布时间:2020-12-16 19:09:25 所属栏目:百科 来源:网络整理
导读:Ruby的callcc捕获当前的continuation,随后可以调用它来恢复控件,但不能恢复数据.我想捕获当前的延续以及当前的内存图像. 在我看来,抓住堆应该不是很困难;我可以依赖于ObjectSpace :: each_object和ObjectSpace :: dump_all,或Marshal.dump,或者只是Object.cl
Ruby的callcc捕获当前的continuation,随后可以调用它来恢复控件,但不能恢复数据.我想捕获当前的延续以及当前的内存图像.

在我看来,抓住堆应该不是很困难;我可以依赖于ObjectSpace :: each_object和ObjectSpace :: dump_all,或Marshal.dump,或者只是Object.clone.但是,我没有看到任何简单的方法来恢复堆.理想情况下,我想遍历object_id – >对象映射,为每个object_id恢复对象的旧图像(如果相应的对象已经GC,则重新添加object_id).不出所料,没有Ruby级别的api可以让我这样做.我想知道是否有任何我可以使用的Ruby GC的低级钩子.

任何帮助表示赞赏,包括有关替代方法的建议.

解决方法

为了回答我自己的问题,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

我目前正在使用这个解决方案,到目前为止还没有遇到任何问题.如果我将来找到任何答案,我会编辑这个答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读