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;

时间: 2024-12-28 01:03:45

Java协程框架--Kilim框架Fiber浅析的相关文章

Java协程框架--Kilim常见问题解答

1.Kilim中的Task,即用户线程如何调度和切换? 在多任务的调度上操作系统存在抢占式和协作式两种方式,相比传统的Thread多线程间抢占式调度,Kilim中的Task采用的是协作式调度,即由Task本身负责释放和恢复占用CPU. 2.Kilim如何识别代码中哪些方法是Pauseable,可暂停的? 通过Kilim提供的Weaver工具在代码编译后,对编译生成的字节码进行分析,识别哪些方法抛出Pauseable异常的,来判断识别方法可暂停的. 3.Kilim是如何实现线程执行过程中Task的

Java协程框架-Kilim字节码剖析

前面几篇文章从代码层面介绍了Kilim的基本原理,但是对于其中的一些细节,比如Task的执行状态如何管理等问题从代码上依然得不到答案,本文即再深入到字节码层面来解答. 1.  Kilim字节码改写前后的代码有什么区别? 这里还是先上Kilim官方文档中的一张图,这张图清晰的展现出原始的代码与经Kilim改写后的协程代码. 可以看出左边的原始代码,与我们常见的函数相比有所不同,这里显示声明抛出Pausable异常.实际上这个异常在运行期间不会抛出,它的实际作用类似于注解,使得Kilim能够识别哪些

Java之协程(quasar)

一.前面我们简单的说了一下,Python中的协程原理.这里补充Java的协程实现过程.有需要可以查看python之协程. 二.Java协程,其实做Java这么久我也没有怎么听过Java协程的东西,但是一直有有听到微线程/协程的概念,这不在学习Python的时候接触到了协程一词.然后返回来去了解Java的协程问题,但是看了很多资料,发现官网以及很多地方都没有涉及到协程的东西,没有办法,只能通过强大的社区来学习协程的相关东西. 三.这里主要关注的是:quasar. 1)协程的目的:当我们在使用多线程

RPC框架实现 - 框架篇

RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面.其对业务隐藏了底层通信过程(TCP/UDP.打包/解包.序列化/反序列化),使上层专注于功能实现:框架层面,提供各类可选架构(多进程/多线程/协程):应对设备故障(高负载/死机).网络故障(拥塞/网络分化),提供相应容灾措施. 关于服务端框架设计和实现,很多文章都有介绍,最常见的是epoll + prefork(进程池/线程池)实现方式,近几年业界又兴起了协程(corouti

FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架

用过go erlang gevent的亲们应该都会知道协程在应用中带来的方便. 如果对协程不理解的同学,通过阅读下面例子可以快速了解我们框架的协程的意义,已了解的可以跳过这部分. 协程例子:假设我们要发个Get请求获取百度首页内容: php同步方式:$result = file_get_contents("http://www.baidu.com"), php果然是世界上最好的语言,多么简洁. 然后java和c++的同学开始不屑了: "呵呵, 同步,鄙视你不解释."

魅族C++协程框架(Kiev)技术内幕

Kiev框架简介 kiev是魅族科技推送平台目前使用的Linux-C++后台开发框架.从2012年立项起,先后由多位魅族资深架构师.资深C++工程师倾力打造,到本文写就的时间为止,已经在推送平台这个千万用户级的大型分布式系统上经历了近5年的考验.如今Kiev在魅族推送平台中,每天为上百个服务完成数百亿次RPC调用. kiev作为一套完整的开发框架,是专为大型分布式系统后台打造的C++开发框架,由以下几个组件组成: RPC框架(TCP/UDP) FastCGI框架 redis客户端(基于hired

网络IO解决方案 — 协程框架的实现

协程这个概念很久了,好多程序员是实现过这个组件的,网上关于协程的文章,博客,论坛都是汗牛充栋,在知乎,github上面也有很多大牛写了关于协程的心得体会.突发奇想,我也来实现一个这样的组件,并测试了一下性能.借鉴了很多大牛的思想,阅读了很多大牛的代码.于是把整个思考过程写下来.实现代码 https://github.com/wangbojing/NtyCo 代码简单易读,如果在你的项目中,NtyCo能够为你解决些许工程问题,那就荣幸之至. 下面将部分的NtyCo的代码贴出来. NtyCo 支持多

go协程goroutine与Java多线程比较

引言: 个人理解的线程,协程和单,多核线程 1. 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已(cpu时间切片), 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑,效率不会有提高的,切换线程反倒会增加开销(线程的上下文切换),宏观的可看着并行,单核里面只是并发,真正执行的一个cpu核心只在同一时刻执行一个线程(不是进程). 2. 多线程的用处在于,做某个耗时的操作时,需要等待返

Java并发编程之---Lock框架详解

Java 并发开发:Lock 框架详解 摘要: 我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性,比如响应中断等.Lock 提供了比 synchronized更广泛的锁操作,它能以更优雅的方式处理线程同步问题.本文以synchronized与Lock的对比为切入点,对Java中的Lock框架的枝干部分进行了详细介绍,最后给出了锁的一些相关概念. 一