我正在努力研究将执行程序的状态存储到磁盘并将其重新引入的基本原则.在我们当前的设计中,每个对象(具有函数指针列表的C级事物,低级自制的面向对象 - 以及这样做的非常好的理由)将是调用将其显式状态导出为可写和可恢复的格式.使这项工作的关键属性是与对象相关的所有状态确实封装在对象数据结构中.
还有其他解决方案,您可以使用活动对象,其中有一些用户级线程附加到某些对象.因此,程序计数器,寄存器内容和堆栈内容突然成为程序状态的一部分.据我所知,没有什么好方法可以在任意时间点将这些东西序列化到磁盘上.线程必须将其自身停放在一些特殊状态,其中程序计数器等没有任何表示,因此基本上将它们的执行状态机状态"保存"到显式对象状态.
我查看了一系列序列化库,据我所知,这是一个通用属性.
核心问题是:或者这实际上不是这样吗?是否存在可以包含线程状态的保存/恢复解决方案,就其代码中的线程执行位置而言?
请注意,在虚拟机中保存整个系统状态不会计算,这不是真正序列化状态,而只是冻结计算机并移动它.这是一个明显的解决方案,但大多数时候都有点重量级.
有些问题清楚表明,我在解释我们如何做事的想法时并不够清楚.我们正在开发一个模拟器系统,允许编写非常严格的内部代码运行规则.特别是,我们在对象构造和对象状态之间进行了完全划分.每次设置系统时都会重新创建接口函数指针,而不是状态的一部分.状态仅由特定的指定"属性"组成,每个属性具有定义的get/set函数,该函数在内部运行时表示和存储表示之间进行转换.对于对象之间的指针,它们都被转换为名称.所以在我们的设计中,一个对象可能会在存储中出现:
Object foo { value1: 0xff00ff00; value2: 0x00ffeedd; next_guy_in_chain: bar; } Object bar { next_guy_in_chain: null; }
链接列表从未真正存在于模拟结构中,每个对象代表某种硬件单元.
问题是有些人想要这样做,但也有线程作为编码行为的方式.这里的"行为"实际上是模拟单元状态的变异.基本上,我们所设计的设计说,所有这些变化都必须在原子完整的操作中进行,这些操作被调用,完成它们的工作并返回.所有状态都存储在对象中.您有一个被动模型,或者它可以被称为"运行到完成"或"事件驱动".
另一种思考方式是让对象具有活动线程,它们以与传统Unix线程相同的方式处于永久循环中,并且永不终止.这是我试图看看它是否可以合理地存储到磁盘的情况,但是如果没有在下面插入VM,这似乎是不可行的.
更新,2009年10月:与此相关的论文发表在2009年的FDL会议上,参见本文关于检查点和SystemC.