一、三种网络IO模型:

分类:

  1. BIO 同步的、阻塞式 IO
  2. NIO 同步的、非阻塞式 IO
  3. AIO 异步非阻塞式 IO

阻塞和同步的概念:

  1. 阻塞:若读写未完成,调用读写的线程一直等待
  2. 非阻塞:若读写未完成,调用读写的线程不用等待,可以处理其他工作
  3. 异步:读写过程完全托管给操作系统完成,操作系统完成后通知调用读写的线程
  4. 同步:读写过程由本线程完成,期间可以处理其他工作,但要轮询读写是否完毕

BIO 虽然可以使用线程池+等待队列进行优化,避免使用过多的线程,但是依然无法解决线程利用率低的问题。

数据通过通道 Channel 传输,往Channel中读写数据需要先经过缓冲区Buffer

NIO为每个客户端连接分配Channel和Buffer,并注册到多路复用器 Selector上,Selector通过轮询,找到有IO活动的连接进行处理,这种处理模式称为Reactor模式

若当前通道无可用数据,线程不会阻塞,而是可以处理其他通道的读写

这样 降低了线程的需求量,提高了线程的利用率 实现了IO 多路复用

IO 多路复用的定义:单个线程 管理多个IO流

二、Reactor模式

Reactor模式基本原理是

1)Reactor:Reactor 在一个单独的线程中运行,负责监听和分发多个客户端的事件,分发给适当的handler线程来对 IO 事件做出反应。

2)Handlers:处理线程 会执行处理方法来 响应 I/O 事件

Reactor 模式就是实现网络 IO 程序高并发特性的关键。

它又可以分为单 Reactor 单线程模式、单 Reactor 多线程模式、主从 Reactor 多线程模式。

这种模式的基本工作流程为:

1)Reactor 通过 select 监听客户端请求事件,收到事件之后通过 dispatch 进行分发

2)若事件是建立连接的请求,则由 Acceptor 通过 accept 处理连接请求,然后创建一个 Handler 对象处理连接建立后的后续业务。

3)若不是建立连接的请求,则分发给此连接对应的 Handler 处理。

4)Handler 会完成 read-->业务处理-->send 的完整处理流程。

简单来说就是:一个线程 处理多个连接的请求、分发、read,send、业务处理 操作

优点是:模型简单,没有多线程、进程通信、竞争的问题,一个线程完成所有的事件响应和业务处理。

缺点是:

1)存在性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈。

2)存在可靠性问题,若线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。

使用场景为:客户端的数量有限,业务处理非常快速,比如 Redis  // 在业务处理的时间复杂度为 O(1)的情况。

Reactor 多线程模式 使用了

一个Reactor主线程 处理 多个客户端的 监听 连接  分发 read和send

多个Worker线程 处理多个客户端的业务

这种模式的优点是可以充分的利用多核 CPU的处理能力,

缺点是多线程数据共享和控制比较复杂,Reactor 处理所有的事件的监听和响应,在单线程中运行,面对高并发场景还是容易出现性能瓶颈。

主从 Reactor 多线程模式 使用了

一个Reactor主线程 处理 多个客户端的监听,连接,分发

多个Reactor子线程处理多个客户端的 read和send

多个Worker线程 处理多个客户端的业务

MainReactor 只负责监听客户端连接请求,和客户端建立连接之后将连接交由 SubReactor 监听后面的 IO 事件。

这种模式的优点是:

1)MainReactor 线程与 SubReactor 线程职责明确,MainReactor 线程只需要接收新连接,SubReactor 线程完成后续的业务处理。

2)交互简单, MainReactor 线程只需要把新连接传给 SubReactor 线程,由SubReactor 返回数据给客户端

3)多个 SubReactor 线程能够应对更高的并发请求。

这种模式的缺点是编程复杂度较高。但是由于其优点明显,在许多项目中被广泛使用,包括 Nginx、Memcached、Netty 等。

这种模式也被叫做服务器的 1+M+N 线程模式,即使用该模式开发的服务器包含一个(或多个,1 只是表示相对较少)连接建立线程+M 个 IO 线程+N 个业务处理线程。这是业界成熟的服务器程序设计模式。

网络IO模型与Reactor模式的更多相关文章

  1. [编织消息框架][网络IO模型]Netty Reactor

    严格来讲Netty Reactor是一种设计模式,一听模式两字就知道了吧,套路哈哈 Reactor中文译为“反应堆”. 看图netty处理流程 1.netty server 至少有两组reactor. ...

  2. Socket-IO 系列(一)Linux 网络 IO 模型

    Socket-IO 系列(一)Linux 网络 IO 模型 一.基本概念 在正式开始讲 Linux IO 模型前,先介绍 5 个基本概念. 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器, ...

  3. 通过实例理解Java网络IO模型

    网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以 ...

  4. 高并发之网络IO模型

    你好,我是坤哥 今天我们聊一下高并发下的网络 IO 模型 高并发即我们所说的 C10K(一个 server 服务 1w 个 client),C10M,写出高并发的程序相信是每个后端程序员的追求,高并发 ...

  5. 5种网络IO模型

    5种网络IO模型(有图,很清楚)   同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...

  6. python网络编程——网络IO模型

    1 网络IO模型介绍 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:    (1)同步阻塞IO(Blocking IO):即传统的IO模型.    (2)同步非阻塞IO(Non-bl ...

  7. 从操作系统层面理解Linux下的网络IO模型

    I/O( INPUT OUTPUT),包括文件I/O.网络I/O. 计算机世界里的速度鄙视: 内存读数据:纳秒级别. 千兆网卡读数据:微妙级别.1微秒=1000纳秒,网卡比内存慢了千倍. 磁盘读数据: ...

  8. 五种网络IO模型以及多路复用IO中select/epoll对比

    下面都是以网络读数据为例 [2阶段网络IO] 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络 ...

  9. 原生JDK网络编程- NIO之Reactor模式

    “反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体事件处理程序通过事件处理器对某 ...

随机推荐

  1. Spring系列之多个数据源配置

    前言 在上篇文章讲到了如何配置单数据源,但是在实际场景中,会有需要配置多个数据源的场景,比如说,我们在支付系统中,单笔操作(包含查询.插入.新增)中需要操作主库,在批量查询或者对账单查询等对实时性要求 ...

  2. 【编程语言】Matlab 学习记录

    title: Matlab Learning Record date: 2020-05-23 20:11:26 author: liudongdong1 img: https://gitee.com/ ...

  3. C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用

    一. 构造函数是干什么的   class Counter   {   public:            // 类Counter的构造函数            // 特点:以类名作为函数名,无返回 ...

  4. WPF 中的 Command 命令

    <Window x:Class="CommandDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx ...

  5. jdbc获取PreparedStatement最终执行的sql语句

    //直接打印PreparedStatement对象 System.out.println(ps); 输出结果: com.mysql.jdbc.JDBC42PreparedStatement@5f205 ...

  6. C# 串口开发

    在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形.温度等).用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 - ...

  7. 【springcloud】一文带你搞懂API网关

    作者:aCoder2013 https://github.com/aCoder2013/blog/issues/35 前言 假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员.商品 ...

  8. Jemeter压力测试

    Jmeter教程 简单的压力测试 Jmeter是一个非常好用的压力测试工具.  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好. 转载自小坦克:https: ...

  9. go协程调度

    目录 前言 1. 线程池的缺陷 2.Goroutine 调度器 3.调度策略 3.1 队列轮转 3.2 系统调用 3.3 工作量窃取 4.GOMAXPROCS设置对性能的影响 参考 前言 Gorout ...

  10. excel快捷键如下:

    ALT+ 空格键,然后按下 X ALT+ 空格键,然后按下 R  首先打开表格,在A1对角用鼠标左键单击,界面会全部选中,然后调整字体大小框里的数字,回车,表格就变大了. 同时按Alt和E,再按L   ...