在提到高性能服务器编程的时候肯定有听过reactor模式,如果只是简单的写一个服务器和客户端建立连接的程序来熟悉一下使用socket函数编程,一般这种情况都是同步方式实现的,服务器阻塞等待客户端的连接,期间服务器不能做其他事情。是不是有更好的实现方式,让服务器可以提高效率,这就是反应堆模式要做的。

  • 同步方式

之前也说了,同步方式是在阻塞等待,会浪费大量的服务器资源,效率不高,如果还不是多线程的话就更加的糟糕,当你在连接下载小视频的时候,别人就下不了(连连接请求都会被服务器忽视),别人就很气。是很简单的单线连接。

  • 多线程方式

那么为了处理多个客户端的连接请求,为每个连接过来的客户端单独开出一个线程进行处理(这里提到的多个线程中的每个线程都是同步方式实现的),每个线程中的每个操作都是阻塞的直到完成。就拿其优点来说,每个线程之间是比较独立的,可以接受不同的请求执行不同的操作,并且由于是同步的方式,对于开发者来说开发也比较简单(可以尽情地使用顺序操作和阻塞操作)。

缺点也比较明显:1.在多线程下使用同步方式是需要加锁的!总要有点难度,要想使用共享资源就需要对这方面用点心;2.这么多线程再切换的时候开销是不能忽略不计的;3.移植性不高,因为有的机子不支持多线程。

下图就是多线程实现的一个web服务器的图例

当服务器开有多个线程,每个线程都相当于一个同步方式实现的web服务器(就上面说的那种),这样看似可以同时接收多个浏览器的请求,但是实则可供连接的数目是固定的,你开了多少个线程就能给多少个浏览器连接,如果需要增加同时连接的浏览器的数量,只能再多加几个线程。同步的一些缺点也依然没有解决。

  • 反应器模式(reactor)

反应器模式听起来名字高大上,简单的来讲就是select、poll、epoll的使用搭建出一个异步方式的web服务器,这里的异步通俗的讲就是,当服务器在等待浏览器连接请求的时候是自由的,不是阻塞的(同步是阻塞等待的),服务器可以干别的事情,当有浏览器的连接请求的时候,服务器被通知,执行回调函数来建立起连接。下面是一个反应堆模式实现的web服务器的图例,分别是连接请求和文件传输请求的web服务器

HTTPHandle是事件处理器,主要负责事件来临之后进行的操作,Initiation Dispatcher核心就是用select、poll、epoll实现的,当有请求到达Initiation Dispacher会通知http handler数据到来,应该去读去解析了,基本是http handle主缆了大部分的工作

缺点就是可能对于http handle来说处理的事务略多会影响一部分性能并且过于冗杂(就是说太重了),读写操作内部本身还是同步的,在读写的过程中会浪费大量时间(毕竟读写比较慢),和之前的前摄器模式的那篇文章作对比来说,前摄器就是把读写操作让给操作系统来做,减少时间浪费,把自身解放出来做其他事情,这就是前摄器和反应堆最大的差距。

参考资料:http://www.kuqin.com/ace-2002-12/Part-One/Chapter-8.htm

反应堆模式(reactor)的更多相关文章

  1. 回调-> 观察者模式->反应堆模式

    关于回调: 回调是观察者模式以及反应堆模式的基础 一句话,回调就是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调.“If you call me, i will ca ...

  2. 反应堆模式最牛的那篇论文--由solidmango执笔翻译

    The Reactor:An Object-Oriented Wrapper for Event-Driven Port Monitoring and Service Demultiplexing 反 ...

  3. 理解Redis的反应堆模式

    1. Redis的网络模型 Redis基于Reactor模式(反应堆模式)开发了自己的网络模型,形成了一个完备的基于IO复用的事件驱动服务器,但是不由得浮现几个问题: 为什么要使用Reactor模式呢 ...

  4. JAVA设计模式—观察者模式和Reactor反应堆模式

    被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一 ...

  5. 事件驱动模式--Reactor

    原文:https://www.cnblogs.com/harvyxu/p/7498763.html 1 Reactor模型 Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思 ...

  6. 知识联结梳理 : I/O多路复用、EPOLL(SELECT/POLL)、NIO、Event-driven、Reactor模式

    为了形成一个完整清晰的认识,将概念和关系梳理出来,把坑填平. I/O多路复用 I/O多路复用主要解决传统I/O单线程阻塞的问题.它通过单线程管理多个FD,当监听的FD有状态变化的时候的,调用回调函数, ...

  7. java NIO的多路复用及reactor模式【转载】

    关于java的NIO,以下博客总结的比较详细,适合初学者学习(http://ifeve.com/java-nio-all/) 下面的文字转载自:http://www.blogjava.net/hell ...

  8. Java-技术专区-设计模式-reactor模式

    模型:         反应器模式做法是:汽车是乘客访问的主体(Reactor),乘客上车后,到售票员(acceptor)处登记,之后乘客便可以休息睡觉去了,当到达乘客所要到达的目的地后,售票员将其唤 ...

  9. Reactor模式与Proactor模式

    该文章总结了网上资源对这两种模式的描述 原文地址:http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html 1.标准定义 两种I/O多路 ...

随机推荐

  1. [代码审计]青云客Cms前台有条件注入至getshell,后台xss至getshell、至弹你一脸计算器

    之前写了一篇关于青云客cms的文章,发在了t00ls,就不copy过来了. 给个链接,好记录一下. https://www.t00ls.net/thread-43093-1-1.html

  2. docker:(5)利用docker -v 和 Publish over SSH插件实现war包自动部署到docker

    在 docker:(3)docker容器挂载宿主主机目录 中介绍了运行docker时的一个重要命令 -v sudo docker run -p : --name tomcat_xiao_volume ...

  3. ML笔记_机器学习基石01

    1  定义 机器学习 (Machine Learning):improving some performance measure with experience computed from data ...

  4. 【读书笔记】【深入理解ES6】#3-函数

    函数形参的默认值 ES6中的默认参数值 function makeRequest(url, timeout = 2000, callback = function() {}) { } 可以为任意参数指 ...

  5. Cortex-M3启动深度解析

    Cortex-Mx启动,备忘,以免将来忘记.中断向量表不用说,从重置中断开始吧 LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 这里一共就执行了两个函 ...

  6. 移动端吸顶(iOS与安卓)

    有的时候经常会遇到移动端吸顶效果,开始我也只是上网查了一下,分别有iOS和android两种样式,如下: /*!*Android*!*/ .head { position: fixed; top: 0 ...

  7. gitignore文件的作用

    早上上传文件的时候,发现有一些密钥不需要增加到版本库中,但是由于每次git status都会提示Untracked files ...并且这些文件并不需要一直提示,会占用相应的需要跟踪的文件位置,导致 ...

  8. python 浅析IO 模型

    协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...

  9. cs231n spring 2017 lecture7 Training Neural Networks II 听课笔记

    1. 优化: 1.1 随机梯度下降法(Stochasitc Gradient Decent, SGD)的问题: 1)对于condition number(Hessian矩阵最大和最小的奇异值的比值)很 ...

  10. [bzoj2288][POJ Challenge]生日礼物

    用堆维护双向链表来贪心... 数据范围显然不容许O(nm)的傻逼dp>_<..而且dp光是状态就n*m个了..显然没法优化 大概就会想到贪心乱搞了吧...一开始想贪心地通过几段小的负数把正 ...