`

java协程框架----kilim实现机制解析

阅读更多

 java语言处理多任务的模式是基于多线程,java语言级别原生并不支持协程,我们想要java语言支持协程,就需要在线程和协程之间架起一道桥梁。在某个事件点(我们成为挂起点)上,我们在应用级别备份当前任务在线程上的调用栈信息(包括局部变量和操作栈上的数据),释放线程,让它去执行下一个任务;等某些事件被触发的时候,重新执行刚才的任务,用之前备份的调用栈信息恢复线程的调用栈,从挂起点开始执行。

来看看Kilim是如何实现标示出挂起点、识别出需要备份的调用栈、备份/恢复调用栈、任务的唤醒这些功能的:

1、标识挂起点,kilim框架通过

kilim.Task.pause(kilim.PauseReason, kilim.Fiber)

接口挂起任务,对外也提供了

kilim.Mailbox.get()

 接口来实现挂起,只要把这两个接口放到需要挂起任务的地方,kilim框架就会在运行期实现此处挂起功能了。在挂起点还做了另外一件很重要的事情,就是任务作为一个Listener,会监听Mailbox,当我们在Mailbox中放入数据的时候,会触发这个监听器,唤醒任务,更详细在最后一步介绍。当然对于仅仅使用Mailbox提供的API传递数据的用户,可能没有意识到挂起动作的存在。

 

2、识别出需要备份的调用栈,Kilim通过在源码级别让方法抛出kilim.Pausable异常来标示出这个方法的运行期栈帧需要备份恢复。这个Pausable是个CheckedException,所以调用这个方法的整个静态调用链上,都需要抛出Pausable,这个这个静态链对应于运行期jvm的栈。当然,你可以把这个受查异常吃掉,导致分析路径不完整,运行期出错。

 

3、备份调用栈,即备份/恢复整个调用栈上的所有栈帧里边的局部变量和操作栈。Kilim通过编译期修改字节码,织入备份和恢复栈帧信息的字节码,而这些对源码级开发者几乎是透明的。Kilim会分析所有抛出Pausable异常的方法的字节码,通过控制流分析找到要织入代码的位置,计算行号表、try/catch/finally块地址信息、局部变量表、最大栈深、跳转指令目标位置等信息;通过数据流分析备份运行期操作栈上的数据,一些计算过程中的中间结果并没有存储在局部变量表,所以不能通过备份局部变量表实现,必须把运行期的中间结果也分析出来,备份下来,如

a + b + remote.get(…)

这里a+b只在运行期产生,但是后边的方法调用会导致任务挂起,所以需要备份a+b的值。由于在第2步的时候所有整个调用链上所有方法都抛出了Pausable方法,所以织入的时候,整个调用链上所有方法都被织入了备份/恢复代码,运行期整个操作栈上的栈帧都可以从挂起点开始被备份。

 

4、唤醒任务、恢复调用栈,在第三步我们已经把任务挂起了,但是在什么时候可以恢复执行呢?第一步在挂起任务的时候在Mailbox上注册了监听器,等有消息回来放入Mailbox的时候,放消息的那个线程会唤醒任务,任务会进入可执行任务队列,等待工作线程来调度执行。如果等待线程队列有线程在等待任务,就会唤醒一个等待线程。被唤醒的工作线程会从可执行任务队列中那任务来执行,重复以上过程直到整个任务完成。

分享到:
评论

相关推荐

    协程Coroutine和Kilim

    总结来说,Kilim为Java开发者提供了一种高效的并发编程模型,通过协程实现轻量级并发,降低了多线程的复杂性和开销。结合提供的`Promise`和`Fiber`机制,使得编写并发代码更加简单、可控。对于需要处理大量并发请求...

    基于Kilim、Promise JDeferred、Zookeeper和Spring Boot的协程分布式调用聚合框架设计源码

    该项目是一款基于Kilim、Promise JDeferred、Zookeeper和Spring Boot技术的协程驱动分布式调用聚合框架。源码包含223个文件,涵盖143个Java源文件、33个XML配置文件、13个GIF图片、7个JAR包、5个批处理脚本、4个属性...

    协程式驱动框架Nepxion-Coroutine.zip

    Coroutine是基于Kilim/Promise JDeferred的协程式驱动框架,基于Apache Zookeeper的分布式规则存储和动态规则变更通知。 主要特性: 1. 基于微服务框架理念设计 2. 支持同步/异步调用 3. 支持串行/并行调用 4....

    基于角色的消息传递框架Kilim.zip

    Kilim 是一种 Java 消息传递框架,提供了超轻量级的线程,推动了线程之间迅速、安全、无需复制的消息传递的实现。 Kilim 使用 Java 编写,融入了角色模型的概念。在 Kilim 中,“角色” 是使用 Kilim 的 Task 类型...

    在Java中使用协程.pdf

    总结起来,尽管Java自身尚未在语言层面内置协程支持,但通过使用像Scala和Kilim这样的第三方工具,开发者可以在Java环境中实现类似协程的功能,以提升并发性能。随着技术的发展,未来的Java版本可能会考虑引入对协程...

    actor线程库:kilim0.6

    在kilim-0.6这个压缩包中,包含了kilim库的源码、文档和其他相关资源。使用者可以通过阅读源码了解其内部实现机制,或者直接将其导入到项目中使用。kilim的核心特性包括: 1. **异步消息传递**:每个Actor都有自己...

    JAVA版本his系统源码-kilim:用于Java的轻量级线程,具有消息传递、nio、http和调度支持

    JAVA版本他的系统源码Kilim :JVM 的延续、纤维、Actor 和消息传递 Kilim 由 2 个主要组件组成: Kilim weaver 修改已编译的 java 类的字节码,启用一种方法来保存它的状态并放弃对其线程的控制,即协同多任务 Kilim...

    vivo X9主板原理图及PCB板图

    ### vivo X9 主板原理图及 PCB 板图解析 #### 概述 本文将针对“vivo X9 主板原理图及 PCB 板图”进行深入解析,旨在为相关技术人员提供维修参考与技术支持。vivo X9 作为一款广受欢迎的智能手机型号,其主板设计...

    mapleliang-Jungle Server Core使用与扩展1

    Jungle Server Core是一款强大的Java服务器核心框架,它提供了灵活的扩展性和高效的服务处理能力。本文将深入探讨其使用方法和扩展机制,帮助开发者更好地理解和应用这一框架。 ## 使用篇 ### 1. 源码结构 Jungle...

    kilim-motifs:具有Lindenmayer系统的程序性Kilim主题生成

    在"kilim-motifs"项目中,开发人员通过编程方式实现了对Kilim图案的动态生成,这不仅为艺术创作提供了新的可能性,也为理解Lindenmayer系统提供了直观的实例。 Lindenmayer系统是一种形式化的符号系统,最初由生物...

Global site tag (gtag.js) - Google Analytics