码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-04-19 06:31:11      阅读:430      评论:0      收藏:0      [点我收藏+]

标签:

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;

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

标签:

原文地址:http://blog.csdn.net/kobejayandy/article/details/45120397

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!