背景
抢占式多任务调度html
如今的操做系统都是支持多任务的,多任务可经过多进程或多线程的方式去实现,进程和线程的对比就不在这里说了,在多任务的调度上操做系统采起抢占式和协做式两种方式,抢占式是指操做系统给每一个任务必定的执行时间片,在到达这个时间片后如任务仍然未释放对CPU的占用,那么操做系统将强制释放,这是目前多数操做系统采起的方式;协做式是指操做系统按照任务的顺序来分配CPU,每一个任务执行过程当中除非其主动释放,不然将一直占据CPU,这种方式很是值得注意的是一旦有任务占据CPU不放,会致使其余任务”饿死”的现象,所以操做系统确实不太适合采用这种方式。java
多线程支持高并发方式多线程
说完操做系统多任务的调度方式后,来看看一般程序是如何实现支持高并发的,并发
一个任务占据一个进程/线程
一种就是典型的基于操做系统提供的多进程或多线程机制,每一个任务占据一个进程或一个线程,当任务中有IO等待等动做时,则将进程或线程放入待调度队列中,这种方式是目前大多数程序采起的方式,这种方式的坏处在于如想支持高的并发量,就不得不建立不少的进程或线程,而进程和线程都是要消耗很多系统资源的,另一方面,进程或线程建立太多后,操做系统须要花费不少的时间在进程或线程的切换上,切换动做须要作状态保持和恢复,这也会消耗掉不少的系统资源;
一个任务不彻底占据一个进程/线程
另一种方式则是每一个任务不彻底占据一个进程或线程,当任务执行过程当中须要进行IO等待等动做时,任务则将其所占据的进程或线程释放,以便其余任务使用这个进程或线程,这种方式的好处在于能够减小所须要的原生的进程或线程数,而且因为操做系统不须要作进程或线程的切换,而是自行来实现任务的切换,其成本会较操做系统切换低,这种方式也就是本文的重点,Coroutine方式,又称协程方式,这种方式在目前的大多数语言中都有支持。
Actor模型
各类语言在实现Coroutine方式的支持时,多数都采用了Actor Model来实现,Actor Model简单来讲就是每一个任务就是一个Actor,Actor之间经过消息传递的方式来进行交互,而不采用共享的方式,Actor能够看作是一个轻量级的进程或线程,一般在一台4G内存的机器上,建立几十万个Actor是毫无问题的。
对于Java应用而言,传统方式下为了支持高并发,因为一个线程只能用于处理一个请求,即便是线程中其实有不少IO中断、锁等待也一样如此,所以一般的作法是经过启动不少的线程来支撑高并发,但当线程过多时,就形成了CPU须要消耗很多的时间在线程的切换上,从而出现瓶颈,按照上面对Coroutine的描述,Coroutine的方式理论上而言可以大幅度的提高Java应用所能支撑的并发量。高并发
参考操作系统