协程框架

来源:互联网 发布:java反序列化漏洞修复 编辑:程序博客网 时间:2024/05/24 22:42

个人的一点观点仅供参考,如果讲错了,请指正

 

一、协程的概念:
何为协程(英文coroutine)?只要把进程,线程,协程三个拿来比较一下就明白了

1.  进程:
进程之间不共享任何状态,进程的调度由操作系统完成,每个进程都有自己独立的内存空间,进程间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量、管道、事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低。由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息、cpu各寄存器的信息、虚拟内存、以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦

2.  线程:
线程之间共享变量,解决了通讯麻烦的问题,但是对于变量的访问需要锁,线程的调度主要也是有操作系统完成,一个进程可以拥有多个线程,但是其中每个线程会共享父进程像操作系统申请资源,这个包括虚拟内存、文件等,由于是共享资源,所以创建线程所需要的系统资源占用比进程小很多,相应的可创建的线程数量也变得相对多很多。线程时间的通讯除了可以使用进程之间通讯的方式以外还可以通过共享内存的方式进行通信,所以这个速度比通过内核要快很多。另外在调度方面也是由于内存是共享的,所以上下文切换的时候需要保存的东西就像对少一些,这样一来上下文的切换也变得高效

3.  协程的调度完全由用户控制,一个线程可以有多个协程,用户创建了几个线程,然后每个线程都是循环按照指定的任务清单顺序完成不同的任务,当任务被堵塞的时候执行下一个任务,当恢复的时候再回来执行这个任务,任务之间的切换只需要保存每个任务的上下文内容,就像直接操作栈一样的,这样就完全没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快;另外协程还需要保证是非堵塞的且没有相互依赖,协程基本上不能同步通讯,多采用一步的消息通讯,效率比较高

协成框架跟几个名词搭边:链式调用(Chain),角色模型(Actor),Fork/Join等

 

二、协程的现状:

目前Java原生代码并不支持协程,传说Java9将引入协程框架。业界较成熟的协程框架有Kilim(Java),Akka(基于Scala),Promise(JDeferred)等。最成熟的框架是Kilim,说些它的特点是:

​1、利用字节码增强(基于ASM字节码框架),将普通代码转化为支持协程的代码(通过字节码增强方式,从底层开始优化,可见性能的提升)
2、调用pausable的时候,如果pause了就保存当前方法栈的State,停止执行,将控制权交给调度器
​3、调度器负责协调就绪的协程
4、协程resume的时候,自动恢复State,回复到上次执行的位置继续执行(可以用在金融系统交易链的中断后,从中断点恢复)

……

 

开源框架地址:

https://github.com/jdeferred/jdeferred

https://github.com/kilim/kilim

 

目前阿里的天猫在产品重构上采用了协程框架,如下:

 

协程在天猫交易中的实践(主要采用了Kilim)

http://wenku.baidu.com/link?url=t0z0U0oJxvT5qK9xuGpfkKv118WLQLxVk7rjSAFkw75Q9-wfoest9vxb3eHWkmhqtfhR1BCD-eT_jb6xvijO5IHWEG6bOoQKthzKCT9Iilu

 

三、协程在瀚银的使用场景

符合下图的调用方式,即是协程的适用场景(比如路由组件)



0 0