IO模型、Reactor、Proactor(半同步/半反应堆)

此文章为《高性能服务器开发》(游双著)笔记

1、IO模型及事件处理模式

五种基本的IO模型

  • 阻塞式IO(一直等到完成,完成前停留等候)
  • 非阻塞式IO(没有就返回,直到有,其实是一种轮询(polling)操作)
  • IO复用(select、poll、epoll等,同时等待多个fd就绪)
  • 信号驱动式IO(sigio,即利用信号处理函数来通知数据已完备且不阻塞主进程)
  • 异步IO(posix的aio_系列函数,与信号驱动的区别在于,信号驱动是内核告诉我们何时可以进行IO,而后者是内核通知何时IO操作已完成,但linux中异步IO尚不成熟使用较少)

而对于到来的IO事件,又有两种事件处理模式

Reactor模式:主线程只负责监听文件描述符fd上是否有事件发生,有的话就通知工作线程进行处理,不会进行其它额外的操作。

如:主线程监听请求,有请求后交给工作线程,工作线程负责创建连接(connect),读取数据(read,IO操作),分析数据(主从状态机),处理客户请求(如write,IO操作)。

Proactor模式:将所有的IO操作都交给主线程和内核来处理,工作线程只负责业务逻辑。此模式通常由异步IO实现,但由于异步IO(aio_read和aio_write为例)在linux上尚不成熟,所以此项目使用同步IO模拟Proactor模式。

原理:主线程执行IO操作,读写完成之后,主线程向工作线程通知这一“完成事件”。那么从工作线程的角度来看,它们就相当于直接获得了数据读写的结果,接下来要做的只是对读写的结果进行逻辑处理。这就是用同步IO模拟Proactor模式。

流程:主线程充当异步线程,通过epoll监听所有socket上的事件

若有新的连接请求到来,主线程创建新的socket然后往epoll内核时间表中注册。

若有读写事件发生,则主线程从socket上接收数据,接收完后将任务插入到请求队列中。

所有的工作线程睡眠在请求队列上,当有任务到来时进行分配开始处理。

2、并发编程模式

首先简单说一下这个概念,以线程池为例,一个线程在创建和销毁的时候是需要一定开销的,而高并发情况下这个开销不容忽略,所以我们可以持续保持着一定量的线程存在着即使没有工作也不销毁,需要的时候直接调用,调用完了也不销毁,放回线程池中。线程池中的线程数依照实际需要进行设定。池是为了减少创建和销毁的开销而存在着,以少量空间换取大量时间,同理还存在数据库连接池,内存池,对象池(例:FPS游戏中,对象池中通常放置需要重复创建的子弹和敌人)等。

(1)半同步/半异步模式

顾名思义,同时存在同步IO与异步IO,分为两个独立层,中间使用队列层来连接。

同步层处理高级别(层级高,如用户层业务,并不是指复杂)的服务,如客户逻辑。

异步层处理低级别(系统层)的系统服务,如IO事件等。

两者的通信是通过队列层来交换信息的。同步是为了简化逻辑处理,异步是为了高效处理系统父物。

(2)领导者/追随者模式

领导者作为主线程,监听事件,追随者作为工作线程。一旦事件到达作为领导者的线程立马将一个追随者转为领导者,自己则转为追随者作为工作线程处理业务,刚被提拔成的领导者则开始监听事件。

说人话就是,主线程监听到事件则跟一个工作线程交换职责,这样做可以减少通信次数,线程监听到事件自己进行业务处理即可,中间只需要交付给一个追随者让他代替主线程监听事件。

(3)半同步/半反应堆模式

主线程和工作线程之间通过一个共享的工作队列来同步,工作线程睡眠在工作队列上。当有新的任务到来时,主线程将新的任务添加到工作队列中。这将唤醒正在等待任务的工作线程,不过只有一个工作线程会获得新任务的”接管权”,他可以从工作队列中取出任务并执行。而其他的工作线程则继续睡眠在工作队列上。
由于主线程和工作线程之间有一个工作队列,所以主线程和工作线程之间没有耦合性,主线程往工作队列中插入任务,睡眠的工作线程通过竞争来取得任务并执行它。

Proactor模型就是半同步/半反应堆模式

主线程:负责IO读写,若有读事件,将数据读入读缓冲区并将http_conn对象放入请求队列。若有写事件则直接写给fd。

工作线程:负责业务处理,在请求队列中竞争任务,一个任务对应一个线程进行处理。解析读取到的数据进行处理反馈,然后将反馈的内容写入写缓冲区等待主线程发送。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值