【reactor模式】【proactor模式】

reactor模式

主线程只负责等待监听是否有事件产生,如果有将事件放入请求队列,由工作线程处理事件。除此以外,主线程任何实质性的工作,读数据,写数据。接受连接都是由工作线程完成。
使用同步I/O模型实现Reactor模式的工作流程:
1.主线程往epoll的内核事件表中注册socket上的读就绪事件。
2.主线程调用epoll_wait,等待socket上有数据可读。
3.当有数据可读,epoll_wait通知主线程,主线程将socket可读数据事件放入请求队列、

4.睡眠在请求队列上的工作线程被唤醒,从**socket读取数据**,并**处理客户请求**,然后往epoll内核事件表中注册写事件。

5.主线程调用epoll_wait等待socket可写。
6.当socket可写时,epoll_wait通知主线程,主线程将写事件放入请求队列

7,睡眠的工作线程被唤醒,从socket上写入服务器处理客户请求的结果

请添加图片描述

proactor模式

将所有的I/O操作都交给内核和主线程,工作线程仅负责业务逻辑
使用异步I/O模型: (aio_read和aio_write为例)实现proactor的工作流程:
1,主线程调用aio_read函数向内核中注册socket上的读完成事件,并告诉内核缓冲区的位置,以及读操作完成时如何通知应用程序。
2.主线程继续处理其他逻辑
3.当socket上的数据被读入用户缓冲区,内核将向应用程序发送一个信号,通知应用程序,数据可用。
4.应该用程序预先定义好的信号处理函数选择一个工作线程处理客户请求,工作线程处理完客户请求之后,调用aio_write函数向内核注册socket写完成事件,并告诉内核缓冲区的位置,以及写操作完成时如何通知应用程序。
5.主线程继续处理其他逻辑。
6.当用户缓冲区的数据被写入socket之后,内核会发送一个信号给应用程序,通知应用程序发送完毕。
7.应用程序预定号的信号处理函数徐泽一个工作线程善后,比如关闭socket请添加图片描述
同步I/O模型
主线程执行读写操作,读写操作完成后,主线程向工作线程通知“完成事件”,也就是说,工作线程直接获取了读写的结果,只对读写结果进行逻辑处理。
以epoll_wait为例:
1,主线程往epoll内核事件表中添加socket读就绪事件
2.主线程调用epoll_wait等待可读事件。
3.当socket有数据可读,epoll_wait通知主线程,循环读取socket中的数据,直到读完,然后将读取的数据封装,放入请求队列

4.睡眠在请求队列中的工作线程被唤醒,获得请求对象并处理客户请求,然后往内核时间表中添加socket上的写就绪事件。

5.主线程调用epoll_wait等待socket可写。

6.当socket可写,epoll_wait通知主线程,主线程往socket上写入服务器处理客户的请求结果。

请添加图片描述
参考《linux高性能服务器编程》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值