关于Actor模型,CSP模型,Reactor模型,Proactor模型

1. Actor模型

传统的并发模型主要由两种实现的形式,一是同一个进程下,多个线程天然的共享内存,由程序对读写做同步控制(有锁或无锁). 二是多个进程通过进程间通讯或者内存映射实现数据的同步.

Actors模型更多的使用消息机制来实现并发,目标是让开发者不再考虑线程这种东西,每个Actor最多同时只能进行一样工作,Actor内部可以有自己的变量和数据.

在Actors模型中,每个Actor都有一个专属的命名”邮箱”, 其他Actor可以随时选择一个Actor通过邮箱收发数据,对于“邮箱”的维护,通常是使用发布订阅的机制实现的,比如我们可以定义发布者是自己,订阅者可以是某个Socket接口,另外的消息总线或者直接是目标Actor.

在这里插入图片描述

总结:Actor模型解决了并发问题。

参考文献:
https://cppfans.org/2176.html
https://www.jdon.com/concurrent/actor-csp.html

2. CSP模型

CSP模型中,worker之间不直接彼此联系,而是通过不同channel进行消息发布和侦听。消息的发送者和接收者之间通过Channel松耦合,发送者不知道自己消息被哪个接收者消费了,接收者也不知道是哪个发送者发送的消息。

在这里插入图片描述
总结:CSP比Actor解耦程度高

个人感觉CSP着这种模型的Channel似乎和Netty的Channel有着相似之处,但是查阅不到相关的资料。欢迎了解这一块同学提出宝贵见解

3. Reactor模型

大概就是连接客户端和处理客户端任务之间有一个select去对接。(具体可以自行了解以下select模型)
在这里插入图片描述

参考文献:
https://juejin.im/post/5cc1c3156fb9a0322b5bfe86

4. Proactor模型

也就是我们不必等待I/O数据准备好也就是内核缓存已经读数据到用户空间。这一切都有内核来帮我们搞定,数据准备好了之后就通知Proactor,然后Proactor就调用相应的Handler进行业务处理。相对于Reactor省去了遍历事件通知队列selector 的代价。

个人感觉有点像响应式代替了select的轮询

所以理论上Proactor的效率比Reactor高,但是linux并没有真正的实现Proactor模型,而是epoll模拟出Proactor模型。

在这里插入图片描述