标题索引


  • 追溯IO原因

  • 网络数据流

  • 网络IO模型

  • IO模型举例


追溯IO原因

    从事项目多年来,有个问题一直困扰着我,但因种种原因一直没有翻阅资料去释怀,随着项目经历的增加、年龄的增长和责任的使命促使我去诠释这个困扰我多年的问题,这个问题就是"网络IO模型",希望这个问题能够给知识库项目的建设添砖加瓦,希望这个问题能够给后续兄弟们带来启发和避免行走不必要的弯路,希望这个问题促进我对“有物为证”的理解更上一层。

网络数据流

客户端发起一个http请求,服务器端处理响应http请求,这一过程在服务器端以网络IO的角度,经历了哪些阶段,具体可参考下图:

图1-1网络进程IO流程图

如上图当服务器接受到一个http请求时,具体操作流程如下:

1.用户空间进程通过reveform函数接收等待接收数据包,并将接收到的数据包在内核通过四表五链检查网络状态,若通过网络检查,则提交给用户空间http进程;

2.http进程解析请求,并发起系统调用read函数,到达内核空间;

3.内核空间执行read函数读取磁盘内容,并将此内容加载至内存;

4.内核空间提交给用户空间http进程,告知数据已经read完毕;

5.用户空间http进程根据请求报文进行构建响应报文;

6.构建完http响应报文后,通知内核空间构建网络封装;

7.内核空间再次通过四表五链网络状态,通过网卡发送构建好的http的响应报文。

此为服务器构建网络数据包触发IO的过程,根据此过程进行分析IO模型,若在高并发的情况下,在哪一步可以实现多IO并存,哪一步可以实现IO的优化。

单纯根据流程可得信息如下

1.单进程接收响应数据报文调用receform函数时,与此同时不执行其他函数调用,此时严重影响效率;

2.当内核空间执行read函数后提交给用户空间进行http封装,最后调用内核空间进行网络封装构建并发送报文;

网络IO模型

    根据上述的流程可以将一次IO逻辑意义上处于两种形态,在这两种形态上进行优化IO才可进行优化整体的性能,此两种形态在Linux网络编程中定义如下:

第一种:Waiting for the data to be ready

等待数据准备,逻辑意义上是内核网络驱动等待接收网络数据包,即上述案例中第1步,表现在内核形态,同时也是数据流可得信息的第1步,在用户空间封装完毕后如何通知内核层再次进行网络报文的构建,在此状态下诞生两种状态同步(synchronous)和异步(asynchronous),同步为进程自已主动等待函数执行成功并返回消息后才能继续执行其他函数,异步为函数执行完成后主动通知进程进行执行其他还是,最后进行内核空间对网络IO进行解封装。

第二种:Copying the data from the kernel to the process

将数据从内核拷贝到进程中,逻辑意义上是内核空间调用并执行系统调用函数后将执行的结果反馈给用户空间,让用户空间进行构建响应报文,即上述案例中第4步,同时也是数据流可得信息的第2步,用户空间的进程能否执行其他函数,从而提升整体性能。在此状态下诞生两种状态,阻塞(blocking)和非阻塞(nonblocking),阻塞状态为指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,即进程调用函数后被挂起,直到函数返回结果后才能执行其他操作,非阻塞状态指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起,即进程在执行函数后,无需等待执行结果,仍可继续执行其他函数。

因此通过组合形成如下模型:

1、阻塞IO模型

同步阻塞IO模型具体如下图

图2-1 阻塞IO模型图

在同步阻塞IO模型中,

2.非阻塞IO模型

    同步阻塞IO模型具体如下图

图2-2 非阻塞IO模型图

    3.IO多路复用模型

    IO多路复用模型如下图

图2-3 IO多路复用模型图

    4.

转载于:https://blog.51cto.com/weiboxue/1976045

网络IO模型的深入浅出相关推荐

  1. C++后台开发—网络IO模型与Reactor模式

    一.三种网络IO模型: 分类: BIO 同步的.阻塞式 IO NIO 同步的.非阻塞式 IO AIO 异步非阻塞式 IO 推荐视频: C++架构师学习地址:C/C++Linux服务器开发高级架构师/L ...

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

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

  3. Linux 网络 IO 模型

    写在前面 本文主要介绍 Unix/Linux 下五种网络 IO 模型,但是.为了更好的理解下面提到的五种网络 IO 的概念,我们有必要先理清下面这几个概念. 用户空间与内核空间 一个计算机通常有一定大 ...

  4. 5种网络IO模型介绍

    5种网络IO模型介绍 IO 模型分为以下几种: 阻塞IO 非阻塞IO 信号驱动IO IO多路复用 异步IO 前四个为同步IO 1 阻塞IO 一个IO操作需要两步: 等待数据和拷贝数据. blockin ...

  5. linux 网络io命令详解,Linux下五种网络IO模型详解

    本文我们主要来了解一下Unix/Linux下5种网络IO模型:blocking IO, nonblocking IO, IO multiplexing, signal driven IO, async ...

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

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

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

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

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

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

  9. Socket基础八:网络IO模型的应用

    Socket基础八:网络IO模型的应用 作者:刘磊 2020.4.27 参考书目:<Windows网络编程>刘琰等著 一.实验目的 1)掌握WindowsI/O操作的基本原理. 2)掌握阻 ...

最新文章

  1. 注册不上zookeeper无报错_Zookeeper 跨区高可用方案
  2. 条件编译用法(#ifndef #define #endif#else)
  3. MFC启动和关闭线程
  4. 在Silverlight 2应用程序中集成Virtual Earth
  5. 如何添加二级标题_怎样给Word文档添加目录?
  6. 信签纸有虚线怎么写_edm邮件营销,专注解决你的开发信难题
  7. easyui确认取消弹窗_Jquery EasyUI中弹出确认对话框
  8. [导入]Asp.net页面的生命周期之通俗理解
  9. 24.Creating Customer Groups
  10. Linux启动tomcat带控制台
  11. Visio| Visio简易使用指南
  12. 只用一招!Python实现微信防撤回!
  13. 人脸重建速览,从3DMM到表情驱动动画
  14. 如何看旷视南京负责人魏秀参跳槽高校工作?
  15. 向全国推荐优秀古籍整理图书活动入选书目公示(zz)
  16. sql优化之b+树锁引实战
  17. Linux基础8-TCP的面向链接(三次四次)
  18. 关于TypeScript开发的6个小技巧
  19. openwrt配置doh
  20. Set 集合以及Set集合的一些常用方法

热门文章

  1. pandas 查询数据
  2. ubuntu18.04.4 安装 dlib (解决 Running setup.py install for dlib ... error错误)
  3. 图像处理中的Mask是什么
  4. 大数据分布式集群搭建(1)
  5. 级联人脸检测--Detecting Faces Using Inside Cascaded Contextual CNN
  6. GitHub-jekyll静态博客快速构建与优化--jekyll serve --incremental --profile
  7. dacom蓝牙耳机怎么重置_双蓝牙耳机另一半怎么连接
  8. 下列哪项不属于以太网交换机的特点_网络测试作业题
  9. mysql _rowid_mysql 5.7 _rowid虚列之一
  10. Elasticsearch7.x 安装及集群的配置