`
iamzhongyong
  • 浏览: 805594 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于java协程和kilim的一些概念

    博客分类:
  • java
 
阅读更多

        最近了解了一下基于协程来做异步话的场景。一些基本概念写在这里。

 

    ​    ​多任务调度方面,操作系统怎么搞的?

        一种是抢占式,指操系统给每个任务一定的执行时间片,在到达这个时间片后,如果任务仍然没有释放对CPU的占用,则操作系统强制释放,这是目前多数操作系统实现的方式。

        一种是协作式,指操作系统按照任务的顺序来分配CPU,每个任务执行过程中除非主动释放,否则将一直占据CPU,一旦任务占据CPU不放,会导致其他任务饿死,目前操作系统不太采用这种方式。

 

        通常程序如何支持高并发?

        一种是基于操作系统提供的多进程或者多线程的机制,每个任务占据一个进程或一个线程,当任务中有IO等等待操作的时候,将进程或者线程放入调度队列,这种是目前大多数程序采用的方式,这种方式的坏处就是如果想支持高并发的并发量,不得不创建很多的进程或者线程,而进程或者线程又消耗了大量的资源。,同时大量的进程或者线程,需要花费很多时间在上下文切换上,切换动作需要做状态的保持和恢复,很是消耗资源。   

        一种是每个任务不完全占据一个进程或者线程,当任务在执行过程中,需要等待IO等资源时,任务将所占据的进程或者线程释放,以便其他任务使用这个进程或者线程,这种方式的好处在于可以减少所需要的原生的进程或者线程数,并且切换完全自行来实现,成本相对于操作系统来很低。

 

        什么是协程(Coroutine)?

        每个任务不完全占据一个进程或者线程,当任务在执行过程中,需要等待IO等资源时,任务将所占据的进程或者线程释放,以便其他任务使用这个进程或者线程。各种语言对于协程支持时,多数都采用了Actor Modle来实现,每个任务就是一个Actor,Actor之间通过消息来进行交互,而不是采用共享的方式。Actor可以看做是一个轻量级的进程或者线程。

 

        java和协程的关系?

        目前java没有从语言层面支持Coroutine(Scala 和erLang有支持),kilim是基于java来实现Coroutine的框架。对于java来说,由于一个线程只能处理一个请求,即使线程中有很多IO中断、锁等也是如此。因此通用的做法是启动多个线程来支持高并发,当时线程多是,就造成了需要消耗不少时间在线程的切换上,从而出现瓶颈,按照协程的描述,理论上协程能够提升很多性能。

    ​    ​目前来看,JDK8中也不会包含协程的东西,目前比较成熟的就是kilim框架了。

 

        什么场景下适合做协程序(针对java应用)?

        只有大量的处理线程,都消耗在等待后端的处理是,做异步化才有意义,例如共计200个处理线程,其中有180多个的处理时间在等待后端处理,这种情况下,增加处理线程,如果不行再来考虑异步化改造,目前java在协程方面还不是很成熟,使用中可能遇到问题,例如锁、同步IO,都是协程的灾难。

 

    ​    ​Kilim框架做了啥?

    ​    ​    ​1、利用字节码增强(基于ASM字节码框架),将普通代码转化为支持协程的代码;

    ​    ​    ​2、调用pausable的时候,如果pause了就保存当前方法栈的State,停止执行,将控制权交给调度器;

    ​    ​    ​3、调度器负责协调就绪的协程;

    ​    ​    ​4、协程resume的时候,自动恢复State,回复到上次执行的位置继续执行;

 

    ​    ​ ​​参考文章:

    ​    ​    ​http://www.blogjava.net/BlueDavy/archive/2010/01/28/311148.html

    ​    ​    ​http://rdc.taobao.com/team/jm/archives/326

 

0
4
分享到:
评论
6 楼 Shen.Yiyang 2013-08-02  
如果没有在语言层面让所有的IO过程都使用操作系统内核的异步IO,协程实现会比较坑。同步IO的堵塞和可用会让协程大量做pause/resume,包括锁也一样,锁的时间也会决定协程值得不值得,比如JAVA锁本身也针对等待时间做自旋和非自旋的选择。
这些工作还是要自己做的,而这些工作做了以后,我觉得用JAVA NIO/NIO2,加上事件取代锁机制,让线程都工作在非阻塞情况下,也是一种提高计算性能的方式,而且应该是JAVA平台倡导的方式。
5 楼 m635674608 2013-08-02  
kilim
iamzhongyong 写道
m635674608 写道
iamzhongyong 写道
m635674608 写道
这东西一点都不要用,,,还要修改字节码,很麻烦

呵呵,修改字节码是其一,重要的是改变了编码习惯,还有就是一些锁的地方坑很多

那你还发表,好像有个类似这个的东西叫做jactor你玩过没有?

主要是看一下基本概念呵呵。kilim的话我们公司有个团队在用,而且是线上核心系统。jactor的话没玩过。不过昨天有看到一个异步话的东西Reactor ,这个,前段时间刚刚发布了1版本

kilim 你们公司在用??请问好用吗?性能真的有那么神奇吗>???
4 楼 iamzhongyong 2013-08-02  
m635674608 写道
iamzhongyong 写道
m635674608 写道
这东西一点都不要用,,,还要修改字节码,很麻烦

呵呵,修改字节码是其一,重要的是改变了编码习惯,还有就是一些锁的地方坑很多

那你还发表,好像有个类似这个的东西叫做jactor你玩过没有?

主要是看一下基本概念呵呵。kilim的话我们公司有个团队在用,而且是线上核心系统。jactor的话没玩过。不过昨天有看到一个异步话的东西Reactor ,这个,前段时间刚刚发布了1版本
3 楼 m635674608 2013-08-02  
iamzhongyong 写道
m635674608 写道
这东西一点都不要用,,,还要修改字节码,很麻烦

呵呵,修改字节码是其一,重要的是改变了编码习惯,还有就是一些锁的地方坑很多

那你还发表,好像有个类似这个的东西叫做jactor你玩过没有?
2 楼 iamzhongyong 2013-08-01  
m635674608 写道
这东西一点都不要用,,,还要修改字节码,很麻烦

呵呵,修改字节码是其一,重要的是改变了编码习惯,还有就是一些锁的地方坑很多
1 楼 m635674608 2013-08-01  
这东西一点都不要用,,,还要修改字节码,很麻烦

相关推荐

    协程Coroutine和Kilim

    协程Coroutine和Kilim是两个与并发编程相关的概念,主要在Java开发环境中被讨论。在现代软件系统中,多线程和并发处理是提升性能和响应能力的关键技术。协程提供了一种轻量级的并发模型,它比传统的线程更高效,内存...

    在Java中使用协程.pdf

    在Java中,虽然语言本身并不直接支持协程,但在Sun JDK 7发布之前,开发者可以借助其他工具或语言,如Scala和Kilim,来实现协程的概念。 Scala是一种基于JVM的多范式编程语言,它不仅支持面向对象编程,还支持函数...

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

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

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

    Kilim 使用 Java 编写,融入了角色模型的概念。在 Kilim 中,“角色” 是使用 Kilim 的 Task 类型来表示的。Task 是轻量型的线程,它们通过 Kilim 的 Mailbox 类型与其他 Task 通信。 Mailbox 可以接受任何类型的 ...

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

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

    actor线程库:kilim0.6

    然而,需要注意的是,虽然kilim提供了高效并发,但它的API和编程模式可能与传统的Java程序有所不同,开发者需要学习新的编程习惯和思维方式。 总之,kilim是一个强大的并发库,为Java开发者提供了一种新颖且高效的...

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

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

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

    在"kilim-motifs"项目中,Lindenmayer系统被用来定义Kilim图案的基本元素和它们之间的相互关系,通过迭代过程,这些规则可以生成出各种复杂且有序的图案。 JavaScript是实现"kiilm-motifs"项目的主要编程语言,它...

    mapleliang-Jungle Server Core使用与扩展1

    `pom.xml`中包含了项目依赖,Jungle Server Core支持协程(基于Kilim)和线程池模式。通过`<kilim.weave.required>`标志控制,为`true`表示使用协程模式。在这种模式下,需要特定版本的`maven-rar-plugin`支持。 ##...

    vivo X9主板原理图及PCB板图

    1. **元件放置**:文档明确指出了元件的放置顺序,以 C2102、C2101 和 C2100 为首,之后依次是 C2103、C2107、L2100、C2105 和 C2108 等,这种布局方式有助于优化信号传输路径并减少干扰。 2. **高电流路径**:...

Global site tag (gtag.js) - Google Analytics