2016-02-06 17 views
8

Ruby's callcc chụp tiếp tục hiện tại, sau đó có thể được gọi để khôi phục kiểm soát, nhưng không được gọi là dữ liệu. Tôi muốn nắm bắt sự tiếp tục hiện tại cùng với hình ảnh hiện tại của bộ nhớ.Điểm kiểm tra và khôi phục heap trong Ruby

Dường như với tôi việc chụp vùng lưu trữ không quá khó khăn; Tôi có thể dựa vào ObjectSpace::each_objectObjectSpace::dump_all hoặc Marshal.dump hoặc chỉ đơn giản là Object.clone. Tuy nhiên, tôi không thấy bất kỳ cách đơn giản nào để khôi phục heap. Lý tưởng nhất, tôi muốn đi qua bản đồ object_id -> object, khôi phục hình ảnh cũ của đối tượng cho mỗi object_id (và thêm lại object_id nếu đối tượng tương ứng đã được GC'd). Không ngạc nhiên, không có api cấp độ Ruby cho phép tôi làm điều này. Tôi tự hỏi nếu có bất kỳ móc cấp thấp để GC của Ruby mà tôi có thể sử dụng.

Bất kỳ trợ giúp nào được đánh giá cao, bao gồm các đề xuất về phương pháp thay thế.

Trả lời

1

Để trả lời câu hỏi của riêng tôi, Process.fork có thể được sử dụng để hơn hoặc ít đạt được hiệu quả của checkpointing đống và phục hồi. Bất cứ khi nào tôi phải kiểm tra đống, tôi nới một quy trình mới và để đứa trẻ tiếp tục. Quá trình cha mẹ bây giờ chứa đống checkpointed:

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 

Khi nhà nước đã được khôi phục, quá trình con chỉ đơn giản là thoát:

def restore 
    Process.exit 
end 

Tôi hiện đang sử dụng giải pháp này, và đã không gặp phải bất kỳ vấn đề quá xa. Tôi sẽ chỉnh sửa câu trả lời này nếu tôi tìm thấy bất kỳ câu trả lời nào trong tương lai.

Các vấn đề liên quan