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

1.Kilim中的Task,即用户线程如何调度和切换?

在多任务的调度上操作系统存在抢占式和协作式两种方式,相比传统的Thread多线程间抢占式调度,Kilim中的Task采用的是协作式调度,即由Task本身负责释放和恢复占用CPU。

2.Kilim如何识别代码中哪些方法是Pauseable,可暂停的?

通过Kilim提供的Weaver工具在代码编译后,对编译生成的字节码进行分析,识别哪些方法抛出Pauseable异常的,来判断识别方法可暂停的。

3.Kilim是如何实现线程执行过程中Task的暂停和恢复?

Kilim通过编译期字节码编织,对每一个可暂停的方法进行字节码处理,在方法执行前和执行后加上相关的执行上下文的处理:

  • Task暂停时将函数调用链中的当前函数的栈帧暂存到Fiber的stateStack中,并设置Fiber的isPausing为true,然后调用字节码指令return返回上层函数,而上层函数通过Fiber中的变量判断得到被调函数暂停返回,也将本函数的栈帧暂存到Fiber的stateStack中,然后也直接返回,以此类推,层层向上直至退回至WorkerThread的run方法体,这样本Task即实现暂停。
  • Task恢复执行是通过在暂停时将Task作为Mailbox的观察者,后续当Mailbox有接收到消息时触发观察者,在回调函数中该Task将自己再次加入到调度器Scheduler的runnableTask队列中,并唤醒工作者线程WorkerThread执行。
4.Kilim中的Weaver工具是如何针对编译的代码实现织入的?

字节码技术,具体来说通过ASM字节码框架实现对编译生成的class文件进行增强。

5.如何将一个传统的线程执行方法改造成Kilim的Task?
  • 首先需要实现一个类继承Task,实现Task的execute方法,业务逻辑不再放在线程的run方法体体,而是放在Task的execute方法体中。
  • execute方法中调用的方法如果是可能暂停的,则必须声明抛出Pauseable异常,否则可以不需要抛出。
  • Task之间的通信通过Mailbox邮箱来传递消息,put和get时存在三种版本,包括阻塞线程,阻塞Task但不阻塞线程,非阻塞。
  • 针对这些Task和Pauseable方法编译时,需要使用Kilim提供的Weaver工具进行编织处理,如果不进行编织处理,运行时将会异常。
  • 对于Kilim中的方法需要注意:一个Pauseable方法只能被另一个Pauseable方法调用。
6.Kilim中哪些操作可以使得Task暂停或者恢复运行?
  • Task.sleep()能使当前Task暂停运行一段时间
  • Task.yield()能使当前Task暂停放弃运行
  • Task.pause()能使当前Task暂停执行
  • Task.resume()能使当前Task恢复执行
  • Mailbox.get()能使当前Task暂停执行直到Mailbox队列非空。
7.什么场景下适合应用Kilim协程?

IO密集型的应用比较适合使用协程,比如应用中存在较多的与后端的网络交互,存在较多的时间在等待后端响应,可以保证线程不会阻塞在等待网络响应,充分利用多核多线程的能力。而对于CPU密集型应用,由于大部分情况CPU都比较繁忙,Kilim不会产生很好的作用。

8.Kilim中Task和Thread之间是如何调度的?

这里直接引用Kilim官方文档中的原文来解答:

Kilim‘s tasks are cooperatively scheduled on a kernel thread pool.

A Kilim task is owned and managed by a scheduler, which manages the

thread pool. When a task needs to pause, it removes itself from the

thread by popping its call stack, remembering enough about each

activation frame in order to help rebuild the stack and resume, at a

later point). The scheduler then reuses that thread for some other

task.

9.Kilim中Task占用的内存大小?

这里直接引用Kilim官方文档中的原文来解答:

The amount of memory occupied by a task is:

1. The java object that represents the task class

2. If paused, an array of activation frames is stored. The Kilim

weaver performs data flow and live variable and constant analysis

(intra-procedurally) to ensure that it capture only as

much as is needed to resume.

3. The contents of all mailboxes that the task is receiving on.

时间: 2024-10-29 10:46:50

Java协程框架--Kilim常见问题解答的相关文章

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

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

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

1. Kilim中Fiber的作用 Fiber主要作用用来管理和保存Task执行过程中调用层次中的函数栈帧的状态,这里的函数栈帧与JVM运行时中的函数栈帧是相同含义,但是Fiber不会将函数栈帧中的全部信息原封不动的镜像拷贝一份,比如局部变量表中的所有变量,而是经过代码分析之后有选择的暂存有必要保留的变量,一般只需要保存后续执行流程中需要用到的变量,例如静态常量等就无需保存到Fiber中,因为静态变量可以直接通过iconst之类的字节码直接加载到操作数栈. 2. Kilim中Fiber中的pc的

魅族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 支持多

[记录]python的简单协程框架(回调+时间循环+select)

# -*- coding: utf-8 -*- # @Time : 2018/12/15 18:55 # @File : coroutine.py #一个简单的 Coroutine 框架 import socket # on top of TCP import time from selectors import DefaultSelector, EVENT_WRITE, EVENT_READ # select: System Call -----> watch the readiness of

协程框架

import requests import gevent from gevent import monkey monkey.patch_all() headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Appl

【PHP】PHP 微服务协程框架Swoft

原文地址:https://www.cnblogs.com/songgj/p/8684320.html

Java之协程(quasar)

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

从无到有实现.net协程(一)

协程的概念,就我而言,来源自当初学习Go,它可以用一句话来总结,"单线程无阻塞异步处理",也就是说,首先,它的范围是针对单个线程来说的,一个线程可以运行多个代码片段,当运行期间遇到IO等待(包括网络IO.磁盘IO等,常见的数据库操作.web服务调用都属于IO等待)时,自动切换到其他代码片段上执行,当执行完毕或再次遇到IO等待时,再回到之前已经完成IO等待的代码片段继续执行,这样,就保证了线程无阻塞,并且多个片段都能被逐步处理(前提是代码中存在IO等待,否则还是顺序处理),以上就是协程的