一、三种网络IO模型:

分类:

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

推荐视频:

C++架构师学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频

epoll原理剖析以及reactor模型应用

linux epoll网络编程细节处理

阻塞和同步的概念:

  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、业务处理 操作

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

文章福利:现在C++程序员面临的竞争压力越来越大。那么,作为一名C++程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。为了帮助大家少走弯路,技术要做到知其然还要知其所以然。以下视频获取点击:C++架构师学习资料

如果想学习C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx源码分析Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux内核,P2P,K8S,Docker,TCP/IP,协程,DPDK的朋友可以看一下这个学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师https://ke.qq.com/course/417774?flowToken=1013189

缺点是:

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 个业务处理线程。这是业界成熟的服务器程序设计模式。

C++后台开发—网络IO模型与Reactor模式相关推荐

  1. reactor线程模型_面试一文搞定JAVA的网络IO模型

    1,最原始的BIO模型 该模型的整体思路是有一个独立的Acceptor线程负责监听客户端的链接,它接收到客户端链接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客 ...

  2. 五种网络IO模型详解

    一 IO操作本质 数据复制的过程中不会消耗CPU # 1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作.网络请求 ...

  3. 03 Redis 网络IO模型简介

    1 Redis中的单线程模型 提起Redis,我们经常会说其底层是一个单线程模型,但这是不严谨的.Redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块该使用多线程, ...

  4. python 网络编程 异步io_python网络编程——网络IO模型

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  5. 因为取了个快递我搞懂了五种网络IO模型

    五种网络IO模型 目录 前段时间,我有个朋友因为拿快递和家里闹别扭了,今天我就借这事来讲讲五大网络模型 阻塞IO模型 第一天: 刘:今天因为拿快递被我妈骂了一顿 我:说来听听 刘:我本来在家里打扫家务 ...

  6. 网络模型——四种常见网络IO模型

    文章目录 1.IO读写原理 1.1 内核缓冲区和进程缓存区 1.1.1 用户进程和操作系统 1.1.2 缓冲区的目的 1.2 Java读写IO底层流程 2.四种主要的IO模型 2.1 基本概念 2.1 ...

  7. 网络IO模型的介绍引出nginx的网络IO模型

    1. 什么是IO? 简单来说就是输入输出 2. 网络IO经历步骤 用户在获取网络资源是在进入网卡,经过网络七层模型将请求交给nginx用户进程 用户进程无法直接获取磁盘上的资源,会将请求获取什么资源翻 ...

  8. mysql 网络io_如何在MySQL源码中看其网络IO模型

    前言 MySQL是当今最流行的开源数据库,阅读其源码是一件大有裨益的事情(虽然其代码感觉比较凌乱).而笔者阅读一个Server源码的习惯就是先从其网络IO模型看起.于是,便有了本篇博客. MySQL启 ...

  9. 大白话详解5种网络IO模型

    1 前言 我们都知道,为了实现高性能的通信服务器,BIO在高并发的情况下会出现性能急剧下降的问题,甚至会由于创建过多线程而导致系统OOM.因此在Java业界,BIO的性能问题一直被开发者所诟病,所幸的 ...

最新文章

  1. 三点弯曲弹性模量怎么计算公式_拉力试验机常用力学计算公式
  2. lvs服务器需要开启web服务么_如何检测 Web 服务请求丢失问题
  3. java之对象的复制
  4. 复旦大学高等数学期末试题合集
  5. C++之dynamic_cast、static_cast、const_cast、reinterpret_cast的用法和区别
  6. 面试题 锁消除是什么
  7. 网站性能优化的三重境界
  8. java框架谁搭建_从零开始搭建一个开发框架(Java + Hibernate + Spring + Oracle)
  9. Android OpenGL显示任意3D模型文件
  10. Oracle start with.connect by prior子句实现递归查询
  11. [转载]安全设置 IIS 中的权限
  12. 拓端tecdat|R语言用多重插补法估算相对风险
  13. poj-3034 Whac-a-Mole
  14. 苹果手机各种型号图片_iphone全部机型图片
  15. TI DSP各种库文件
  16. python零基础电子书免费下载-零基础入门学习Python PDF 扫描版
  17. 2《小学数学教材解读策略研究》开题报告
  18. ICP测试无机试样的分解
  19. Geek爱旅行 - 向日葵的花语 呼呼呼~~
  20. Product-based Neural Networks

热门文章

  1. 消费者人群画像—信用智能评分 :信用分预测
  2. 工信部部长苗圩:今年我国部分地区将发放5G临时牌照...
  3. 本地tomcat地址_Android服务器——TomCat服务器的搭建
  4. Java8与JDK1.8与JDK8与J2SE8与J2SE1.8的区别是什么?——Java的各个版本和各个版本的历史版本号的关系与解读
  5. Gate Level Simulation (前仿及后仿总结)
  6. Python爬虫笔记——字符串的常用方法
  7. WordPress主题 JustNews4.3.0适合源码站虚拟资源站
  8. mac android 打包,android studio如何生成apk android studio打包apk教程
  9. Hadoop3.2.1 【 HDFS 】源码分析 : ZKFailoverController解析
  10. 解决群晖 docker 人人影视 no data 的问题