Java协程框架--Kilim框架Fiber浅析

1. Kilim中Fiber的作用
Fiber主要作用用来管理和保存Task执行过程中调用层次中的函数栈帧的状态,这里的函数栈帧与JVM运行时中的函数栈帧是相同含义,但是Fiber不会将函数栈帧中的全部信息原封不动的镜像拷贝一份,比如局部变量表中的所有变量,而是经过代码分析之后有选择的暂存有必要保留的变量,一般只需要保存后续执行流程中需要用到的变量,例如静态常量等就无需保存到Fiber中,因为静态变量可以直接通过iconst之类的字节码直接加载到操作数栈。
2. Kilim中Fiber中的pc的真正含义?
Fiber中的pc,字面意义是指程序计数器,实际含义是:如果pc值为0,则表示第一次开始执行,程序执行流程和字节码增强前的流程是一样的;如果pc值为N,则表示直接跳转至本函数中第N个Pauseable方法处开始执行,说明之前执行到第N个Pauseable方法时暂停了,此时Task恢复执行,字节码层面通过tableswitch指令将直接跳转该Pauseable方法处执行,也即再次进入该函数执行体。以此类推,整个函数调用链均按照这种逻辑流转
典型的函数如下:
public void function() throw Pauseable
{
XXX;  // 临时变量等初始化
A();  // function A is pauseable,如果执行到函数A暂停了,则pc=1
B();  // function B is pauseable,如果执行到函数B暂停了,则pc=2,下次恢复时从function()函数入口直接跳转到这里,执行函数B
C();  // function C is pauseable,如果执行到函数B暂停了,则pc=3,下次恢复时从function()函数入口直接跳转到这里,执行函数C
}
3. Kilim中Fiber中State的作用?
Fiber中的State作用主要体现在curState和stateStack两个变量,它们用来维护函数调用链执行过程中的函数栈帧。
当Task将要执行某个Pauseable方法时,将首先调用Fiber的down方法,来记录当前执行到整个函数调用链中的下一层次,并记录curState和pc。
当Task在执行某个Pauseable方法过程中暂停时,内部会调用Task的pause方法,而pause直接调用togglePause方法,这个方法会根据curState是否为null,来设置Fiber的isPausing的值,而isPausing表示Task是暂停还是恢复,相应源码如下:
if (curState == null) {
setState(PAUSE_STATE);
} else {
stateStack[iStack] = null;
isPausing = false;
}

当Task执行完某个Pauseable方法时,将会调用Fiber的up方法,标识调用某个Pauseable方法返回,且up方法的返回值表示该Pauseable方法是正常返回还是暂停返回,因为up方法内部会根据Fiber中的isPausing变量值和本函数栈帧stateStack[iStack]是否为null来判断是否暂停,以及函数栈帧是否已经保存。如果是PAUSING__NO_STATE,说明被调函数暂停,本函数还未保存栈帧,则需要将本函数栈帧,一般后续执行需要使用到的变量(包括函数实参、函数局部变量)保存到State中,也即 stateStack[iStack],这里列举了一个Pausable方法执行完成时的4种可能存在的状态:

NOT_PAUSING__NO_STATE  = 0;
NOT_PAUSING__HAS_STATE = 1;
PAUSING__NO_STATE      = 2;
PAUSING__HAS_STATE     = 3;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值