前言

看游双的书并理解,个人学习,有错麻烦提一下,感谢

事件处理模式和并发模型的区别

这篇要介绍的事件处理模式有reactor和proactor;而要介绍的并发模型有半同步/反应堆和半同步半异步

事件处理模式,指的是...TODO

事件处理模式

事件处理模式,本文介绍的有两种,是reactor(反应堆)和proactor模式,(还有没有其他的呢?)

同步IO模型用于实现reactor模式,异步IO模型用于实现proactor模式

异步IO比如有POSIX的 AIO和linux下原生的libaio, 同步IO的例子则是我们平常使用的read和write(见参考资料[2])

同步IO比如我们用的read,调用后让操作系统把数据从内核缓冲区搬到用户态中read的参数中,这里是从调用到read返回要等数据出来,

而异步IO,在参考资料[2]中提到select和poll也可以作为异步IO一部分,这些工作在调用异步IO的注册函数后,内核自己把数据拉取出来后,select或者poll返回通知用户,这期间不占用用户的CPU;拉取数据过程不占用CPU时间,当select或poll返回后直接就有了用户态的数据,而不需要再自己拉取回来(参考资料[3]),可以看出优点是省时,但是缺点是,由上述可知,编程起来比同步IO更复杂

从上面的描述可以看出,同步IO是阻塞IO,异步IO是非阻塞IO

reactor

reactor模式的定义,在游双的书中是这么说的:IO线程(主线程)只监听事件(如epoll_wait)和有事件则通知工作线程,而工作线程负责除此之外所有工作,入读写数据(read,write),接受连接(accept),处理请求(处理发来的数据等)

参考资料6提到是种编程模有以下三种角色:

Reactor 将I/O事件分派给对应的Handler; Acceptor 处理客户端新连接,并分派请求到处理器链中; Handlers 执行非阻塞读/写 任务

proactor

proactor模式是利用了异步IO,好处是在游双的书里是这么说的:proactor模式把IO操作都给了内核处理(说的应该是主线程调用异步读写的API,内核完成读写),同时这个也是proactor的一大好处,只让工作线程实现业务逻辑,解耦了其他部分

内核完成后直接通知工作线程(应该也可以让内核完成后通知主线程,主线程通知工作线程吧),工作线程只负责业务逻辑,也就是上面reactor说的处理请求(处理数据),(accept谁来做呢?)

模拟proactor模式

因为linux对异步IO的支持不是很完美,故一般用同步IO来模拟proactor模式,前面说了因为proactor模式能让工作线程只解决业务逻辑,这里模拟的proactor模式也是.把IO任务(read,write)交给主线程做,完成后再把数据交给工作线程,详细步骤见游双的书

并发模式

并发模式是并发的编程模式,和前面讲的事件有相似之处(实际并发模式和事件处理模式的用词我还不是很懂),异步IO的读写交给内核,而这里并发模式的耗时任务也是交给信号处理函数,来做,完成后再通知原本的线程

这里讲的例子都是服务器编程的例子,而服务器编程要关注的都是三个半事件中的其中,这里游双书里所谓的并发模式也是专注于服务器编程的吧

全异步模式和全同步模式

这个不在游双的书里,来自面经,全同步是多线程,每个线程进行阻塞IO监听,IO事件发生后再执行动作,即全同步,可参照参考资料[5]iterator模型,可以是多线程多进程

全异步,游双上面给出的半同步半异步例子我感觉实际上是全异步模型...

半同步半异步模式

根据同步和异步的性质,在这个半同步半异步模式中,同步线程用于处理客户逻辑,而异步线程用于处理IO事件,为什么呢?因为IO不消耗CPU,这些干等的操作可以由内核接管,而客户逻辑(处理数据)需要CPU处理

这里说的异步线程处理IO,同步线程处理客户数据,两个线程之间的交互是客户数据(这不是proactor模式吗,难以分清区别TODO)

这里异步线程完成了IO操作后,如何选择同步线程即工作线程的方法有几种,第一种是工作线程通过抢占锁,一种是通过条件变量condition.notify_one操作,或者是Round robin方式(可以找代码看看),还有信号量(这个怎么做呢?)

代码:在游双的书里15章给出了例子

变体:半同步/半反应堆模式

游双说是半同步半异步的变体,我看着的区别是主线程和工作线程之间的任务分配方式不同,这种模式是IO线程向工作线程分配的内容是connection fd,并且分配方式是通过锁的抢占.

这里为什么说是半反应堆模式呢,因为用到了reactor模式,哪里用到了呢,IO线程只监听连接到来事件,而工作线程要执行读写.

游双的书里还提到,半同步/半反应堆模式可以用模拟proactor模式来完成(那为什么不说半同步半proactor模式..),即让IO线程完成读写,IO线程向工作线程分发的是已接受的数据

是变种还是一个新模型?半同步/半异步模式

这里每个工作线程和IO线程都用了epoll_wait来异步读,作者又说道它实际不是严格的半同步半异步

领导者追随者模式

这个面试不是重点?略

后记

是我理解有误吧..这半同步/半异步,半同步/半reactor模式看的我云里雾里的,这不是明显的reactor模式+线程池的实现吗...为什么游双书里要这么分法..却给出这种例子..

半同步半异步不是多reacor的实现变种吗..并发不如去看参考资料[5]..半同步半反应堆就是one reactor+threadpool吧,这里的半同步半异步例子就是主从reactor而没有threadpool的吧..

参考资料

  1. [1](https://blog.csdn.net/naipeng/article/details/89918482)
  2. [2]https://www.cnblogs.com/skyofbitbit/p/3654531.html
  3. [3]C++教程网,大并发服务器开发(实战)
  4. [4]游双的书
  5. [5](https://blog.csdn.net/ptgood/article/details/106747851)
  6. https://blog.csdn.net/bingxuesiyang/article/details/89888664

半同步/半异步模式,半同步半反应堆reactor模式相关推荐

  1. mysql主从是同步还是异步_mysql主从同步异步场景的分析

    之所以进行这块内容的研究,主要针对之前遇到的两个未解的疑惑: a. 线上有个系统,半同步状态经常从半同步变成异步,然后又马上恢复为半同步,具体原因未明,虽然之前也猜得八九不离十,但还是未完全确定. b ...

  2. java 同步与异步区别_同步和异步有何异同,在什么情况下分别使用它们?

    2015-05-12 06:30:01 阅读( 4 ) 通俗版:举个例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器 ...

  3. java reactor模式例子_JAVA BIO,NIO,Reactor模式总结

    传统同步阻塞I/O(BIO) 在NIO之前编写服务器使用的是同步阻塞I/O(Blocking I/O).下面是一个典型的线程池客服端服务器示例代码,这段代码在连接数急剧上升的情况下,这个服务器代码就会 ...

  4. php和ajax的同步和异步请求,ajax 同步请求和异步请求的差异分析_javascript技巧

    ajax同步和异步的差异, 先看2段代码: 代码一: Synchronize = function(url,param) { function createXhrObject() { var http ...

  5. 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端

    承接上文的操作系统,关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 ...

  6. 一文读懂并发与并行,同步与异步阻塞

    并发与并行 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法, 实现用多个任务"一起"执行(实际上总有一些任务不在执行,因为切换任务的速度相当快, 看上去一起执行而 ...

  7. socket阻塞与非阻塞,同步与异步

    转自:http://blog.csdn.net/hguisu/article/details/7453390 socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网 ...

  8. java登录时启动后台异步线程_JAVA多线程的同步和 异步

    原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...

  9. java同步和异步机制_JAVA学习过程中的知识——java多线程的同步和异步

    1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是,多线程和异步操作还是有一些区别的.而 ...

  10. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

最新文章

  1. php的闭包函数bingto_PHP 闭包那点事儿
  2. 建立用户体验(User Experience,UX)过程的实用指南
  3. 窗体添加阴影效果如此简单
  4. 主叫号码未显示怎么设置_微信未授权抖音,应该怎么设置?
  5. 网站解析 选择 主记录www 为主站 记录类型都选A 泛解析 选*就好了
  6. 【原】iOSCoreAnimation动画系列教程(二):CAKeyFrameAnimation【包会】
  7. java插件开发_编写一个IDEA插件之:自动生成Java代码
  8. 8.input设备(input子系统)驱动
  9. raspberry pi4B ncnn cpu vulkan benchmark
  10. oracle报609,日志文件报错 ORA-609
  11. 【JavaScript】 数组 重要方法详解篇(一)
  12. [蓝桥杯]蓝肽子序列(c++详解)
  13. 计算机英语性考任务答案,国开电大理工英语1单元自测2形考任务答案
  14. (十二)系统集成中级-质量管理
  15. canvas 画一条波浪线 进度条
  16. manjaro和android数据线传数据
  17. iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码...
  18. VS2008 WEB组件安装失败——解决办法
  19. 拜托,面试请不要再问我Spring Cloud底层原理
  20. 【第二弹】社区跑腿 校园跑腿升级版 毕设 创业 微信小程序+java后台

热门文章

  1. 在腾讯轻量云上搭建 CS:GO 服务器
  2. 安卓双摄像头录像_usb双摄像头app下载
  3. ffmpeg水印制作
  4. python新建记事本_python怎么创建文本文件
  5. 关于苹果MFI认证那些事
  6. 读《论证是一门学问》
  7. MAVEN工具篇——maven打包跳过测试
  8. Android计算器LinearLayout实现布局
  9. python的加减乘除运算_python四则运算
  10. Q8四元数群的正规子群