同步异步io与网络模型

同步异步io: 

        同步与异步io之间的唯一区别就是内核通知应用程序的io事件是何种事件(就绪事件还是完成事件)。

        如果是完成事件就是异步io,因为io操作的过程已经由内核完成了。

        如果是就绪事件那么就是同步io,因为读取数据的过程还是需要应用程序自己来做。io多路复用注册了一个事件回调函数,当唤醒后线程后对于数据的读取还是得线程自己完成,所以io多路复用是同步io。

 

 

 

reactor模式介绍:

        主线程只用来监听文件描述符是否有相应的事件发生,如果有事件发生,就通知工作线程来处理这些事件。

半同步半异步模式介绍:

        异步线程主要用来处理io事件,同步事件用于处理客户逻辑。

        异步线程监听到客户有请求事件后,就将这个事件封装成请求对象并插入到请求队列中。同步线程(也就是工作线程)从请求队列中获取请求对象,并提供相应的服务。其中请求队列的设计决定了同步线程以何种方式获得请求对象。

 

 

 

 

                          (图片来自转载)

半同步半反应堆模式(如上图):

        个人认为这是一种半同步半异步+reactor模式的设计,很多网络库(如muduo)都是这种网络模型。

        首先在这种模式中主线程与工作线程之间的事件不是指的客户单次的读写事件,而是一个客户从连接一直到结束的这一整个过程的所有请求称为一个事件!!!

        主线程只监听一个文件描述符listenfd,当有新的客户连接时,它通过accept函数获取客户的基本资源(如connfd,address,port),然后将资源进行封装派发给子线程(工作线程),子线程负责这个客户后续的所有的事件请求。

 将connfd资源派发给子线程的方式也有多种:

        1  维护一个有锁队列,主线程充当生产者,子线程充当消费者。

        2 直接由主线程根据相应的算法选择子线程进行派发,但是这种方式需要与子线程建立相应的通信方式。(在muduo库中,eventloopthreadpool会获取各个subloop的指针,每次server只需要getnext就可以获取相应的subloop,然后将connfd封装成channel和tcpconnection,并将channel注册到这个subloop管理的poller中进行事件的监听。)

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值