PVFS2 源代码分析之公有组件src/common/misc/state-machine状态机执行逻辑

本文深入分析了PVFS2中状态机的执行逻辑,重点探讨了src/common/misc/state-machine目录下的state-machine.h和state-machine-fns.c文件。文章详细解释了状态机控制块的数据结构,包括状态栈、帧栈和控制变量,并介绍了关键函数如PINT_sm_frame、PINT_sm_push_frame、PINT_state_machine_invoke的工作原理,阐述了状态转移、子状态机启动和帧栈操作的过程。
摘要由CSDN通过智能技术生成

PVFS2为每个用户系统接口(src/client/sysint)定义了状态机,而状态机的执行逻辑存在于src/common/misc文件夹下的state-machine.h和state-machine-fns.c两个文件。state-machine.h定义了状态机执行逻辑所需的数据结构,state-machine-fns.c文件定义了功能函数。

  • 数据结构

state-machine.h的数据结构各个条目有何含义我们暂不细究,但需首先明确这些数据与函数的作用关系。例如,标志状态机实例的状态机控制块

注意其中的控制变量(control variables ),即第19~22行,表明了当前操作的状态,由某些函数设定后,后续函数读取并根据这些“标志位”采取不同的行为。这是将函数关联起来并控制流程的重要手段。

 

除此之外,该状态机控制块中还存储状态机所需数据,如状态栈(第5~6行)、帧栈(第8~10行);以及指向相关数据的引用,如父状态机控制块指针(第18行)、任务上下文ID(第24行)等。

 

其中帧(frame)是个很重要的角色:

帧保存状态机所需的额外数据,通常与状态机实例一一对应,它的行为伴随着状态机的产生和撤销。当一个状态机启动嵌套状态机时,它会在帧栈中压入新帧。帧栈使用quicklist 实现。

 

state-machine.h中的其他数据结构很多在状态机定义中(参见sys-get-eattr.c )已经提及,这里就是它们的原型。

 

  • 功能函数

下面重点分析state-machine-fns.c文件,即状态机控制逻辑的操作。阅读函数的顺序和原文件中不一定相同。另外,有关gossip_debug函数及其前后数据准备的部分可以略去,只是日志功能;下面代码都是略过这些之后的核心逻辑。

  1. 帧栈相关操作
    数据结构已在上一部分介绍,有关帧的操作在状态机执行中很普遍,首先集中介绍一下。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值