BLCR(Berkeley Lab Checkpoint/Restart)介绍及Checkpoint架构剖析
这篇讲的是进程检查点(Checkpoint)工具BLCR的核心架构剖析。作者从`cr_checkpoint`命令的用法出发,深入讲解了BLCR如何通过特定信号(64号实时信号)与内核模块协作,来实现对进程状态的“快照”保存。 文章重点剖析了用户态工具与内核模块通过`/proc`文件系统交互的机制。核心在于,BLCR需要为目标进程预先注册一个专用的信号处理函数。为此,它设计了两种等效的接入方式:一种是使用`cr_run`脚本启动程序,通过`LD_PRELOAD`预加载`libcr_run.so`库;另一种是在编译时直接链接`libcr`库。文章进而深入内核,解析了检查点请求(`cr_chkpt_req`)的构建过程,以及内核如何通过创建任务对象和进程请求对象来跟踪目标进程树,并最终完成内存的转储。 最巧妙的是,文章对比了两种接入方式在底层实现上的微妙差异:链接`libcr.so`的程序在信号处理函数中会通过两次`ioctl`调用来完成操作并通知完成;而通过`cr_run`启动的程序则使用汇编实现的信号处理函数,一次性完成转储并依赖一个特殊标志(`_CR_CHECKPOINT_STUB`)在内核侧直接触发完成流程。这种对源码细节的深挖,揭示了BLCR在兼容性和设计灵活性上的考量。