Reactor模式本身就是一种同步IO模式
Reactor模式的流程如下:
1、应用程序注册socket的读写就绪事件,和事件处理器
2、事件分类器等待读写就绪事件
3、当事件分离器监听到读写就绪事件后。会调用注册的事件处理器。
4、事件处理器首先会执行IO读写操作,然后将数据根据读取的内容进行进一步的处理

使用同步IO来模拟Reactor模式的流程如下:
1、主线程首先将socket的读就绪事件注册到epoll内核注册表中,
2、主线程调用epoll等待socket的读就绪事件
3、epoll返回就绪的socket(socket上有数据可读)并通知主线程,主线程将该socket读就绪事件放入到请求队列中
4、睡眠在请求队列的某个工作线程被唤醒,处理该socket读就绪事件,处理完成后,将该socket的写就绪事件注册到epoll内核注册表中
5、主线程调用epoll等待socket的写就绪事件
6、epoll返回socket写就绪事件,主线程将写就绪socket放入请求队列,
7、睡眠在请求队列的工作线程被唤醒,处理该socket写事件
画张图更直观

Proactor模式的流程如下:
1、应用程序初始化一个异步读取操作,然后注册事件处理器,该事件处理器并不负责IO数据的读取,而只负责操作已经被读取的数据
2、事件分离器等待读完成事件
3、事件分离器在等待读取完成操作的时候,操作系统的内核负责IO读取,并将读取的数据传入到用户的缓冲区
4、事件分离器监听到读事件完成后调用事件处理器
5.事件处理器负责操作用户缓冲区数据,并进一步处理

异步IO模拟Proactor
aio_read和aio_write函数可以获取更多的异步I/O的数据,并可以更好地控制异步I/O。虽然大多数字符设备都不使用aio_read和aio_write函数

1、主线程调用aio_read想epoll的内核注册表中注册socket的读完成事件,并告诉内核,用户的缓冲区地址以及读操作完成后如何通知应用程序
2、主线程去处理其他逻辑
3、socket的数据被内核读取到用户缓冲区后,内核发送一个信号到通知应用程序数据已经可用
4、应用程序在在预先定义好的信号处理函数中接受到该信号,并且负责调用一个工作线程来负责处客户端的请求(操作读取到的缓冲区数据),处理完成后,调用aio_write函数向epoll注册socket上的写完成事件,并告知内核用户写缓冲区的位置,写完成事件后,如何通知应用
5、主线程负转向去处理其他的逻辑,
6、当用户缓冲区的数据被写到socket中后,内核向应用程序发送一个信号,通知应用程序写完毕
7、应用程序在信号函数中,调用一个工作线程来做善后处理,

通过上述对比我们可以发现, Reactor和Proactor的本质区别在于究竟由谁来负责IO,reactor的IO是由事件处理器负责,在同步模拟中是由工作线程负责读取,而在Proactor中由内核负责,事件处理器只负责操作被读取到的数据,在异步模拟中,也是由内核负责读取,由工作线程来负责操作读取到的数据,

在同步和异步模拟中,epoll就相当于事件分离器,工作线程相当于事件处理器

Rector模式和同步IO模拟Reactor模式,proactor模式和异步IO模拟proactor模式相关推荐

  1. linux 内核io操作,关于Linux内核中的异步IO的使用

    我们都知道异步IO的作用,就是可以提高我们程序的并发能力,尤其在网络模型中.在linux中有aio的一系列异步IO的函数接口,但是这类函数都是glibc库中的函数,是基于多线程实现,不是真正的异步IO ...

  2. linux oracle io 查看,Linux上Oracle是否使用异步io的诊断

    客户的数据库IO负载较重,检查后发现并未设置异步IO. 整个数据库的负载都集中在IO相关的等待上: Top 5 Timed Foreground Events Event Waits Time(s) ...

  3. python 异步io框架_Python并发编程之学习异步IO框架:asyncio 中篇(十)

    大家好,并发编程 进入第十章. 好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了. 为了更好地衔接这一节,我们先来回顾一 ...

  4. 关于异步IO与同步IO的写操作区别

    最近这两天都在看IO相关的知识点.一开始太凌乱,太杂,不过终于整理清楚了.觉得杂乱是因为一开始以为异步IO等于非阻塞IO,这完全是两个概念, LINUX下的异步IO有两类,一类为glibc AIO,这 ...

  5. 两段文章清楚弄明白什么是异步IO、同步IO、同步阻塞IO、同步非阻塞IO、异步阻塞IO、异步非阻塞IO

    百科解释:异步IO_百度百科 先看2,再看1,会理解的更好! 1. 2.阻塞和非阻塞 # 阻塞和非阻塞关注的是程序在等待调用结果时的状态 # 阻塞调用是指调用结果返回之前,当前线程会被挂起.调用线程只 ...

  6. 同步IO 和异步IO

    同步IO:在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件.发送网络数据时,就需要等待IO操作完成,才能继续进行下一步操作.IO期间CPU会转去执行其他线程. 异步IO:当遇 ...

  7. Python学习笔记:异步IO(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. Windows五种IO模型性能分析和Linux五种IO模型性能分析

    Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...

  9. Python 异步 IO 、协程、asyncio、async/await、aiohttp

    From :廖雪峰 异步IO :https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 Python Async/Awai ...

  10. python 异步io_python异步IO编程(一)

    python异步IO编程(一) 基础概念 异步IO (async IO):一种由多种语言实现的与语言无关的范例(或模型). asyncio:Python 3.4版本引入的标准库,直接内置了对异步IO的 ...

最新文章

  1. 回到未来 – 大胆畅想如何追赶并超越腾讯模式
  2. 生信分析-PS修改坐标
  3. 收不回来的value
  4. 第二章. node中的模块和require
  5. python numpy 生成矩阵_Python numpy生成矩阵、串联矩阵代码分享
  6. 【C语言】C语言随机数生成教程,C语言rand和srand用法详解
  7. STM8学习笔记---新建IAR工程文件
  8. Android之判断设备网络连接状态,并判断连接方式
  9. [转载]MySQL优化之索引的运用(2)
  10. 用html设计倒计时秒表,Javascript实现秒表倒计时功能
  11. python小_Python 小入坑
  12. 应急管理大数据ppt_大数据应急管理.doc
  13. 车辆维修管理系统mysql_4S店汽车维修管理系统的分析与设计(JSP+MySQL)
  14. cude之helloworld
  15. cfree5c语言编写贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
  16. 重新整理的三国9州,郡,地域数据
  17. 17个支持图片外链的免费相册
  18. vue导出excel加一个进度条_使用vue导出excel文件
  19. Kubeadm集群部署k8s
  20. xadmin安装与使用

热门文章

  1. python求鸡兔同笼
  2. 速度收藏!《阿里技术参考图册》发布,公开600页技术全景图
  3. javascript map函数的用法
  4. IBM MQ 故障诊断(一)
  5. 【Flutter】关于对话框showDialog传入context无效问题
  6. vue.js AEC代码编辑器
  7. c3po mysql_c3po MySQL8小时问题
  8. 最常见的家居风水问题点评
  9. [C/C++] 关于strncpy函数
  10. 用计算机打山有木兮,光遇山有木兮数字谱是什么?光遇山有木兮数字谱分享