您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

I/O网络模型

时间:2019-12-10 11:36:36  来源:  作者:

概述

本文从I/O网络模型出发,介绍目前主流的几种网络模型,然后对同步阻塞I/O、同步非阻塞I/O、I/O多路复用的机制和流程做了详细的阐述,最后通过一个生活中的例子加深对这3中网络模型机制的理解。

I/O操作

网络IO的本质是socket的读取,socket在linux中被抽象为流,IO操作可以理解为对流的操作。为了操作系统的安全性等考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer。整个请求过程可以概括为:用户进程发起请求,内核接受到请求后,从I/O设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间,该用户进程获取到数据后再响应客户端。如下图所示:

I/O网络模型

 

在整个请求过程中,数据从IO设备输入至kernel buffer需要时间,而从kernel buffer复制到用户进程也需要时间(从IO设备到kernel比从kernel到process需要花更多的时间)。因此根据在这两段时间内等待方式的不同,I/O动作可以分为以下五种模式:

  • 阻塞I/O (Blocking I/O)
  • 非阻塞I/O (Non-Blocking I/O)
  • I/O复用(I/O Multiplexing)
  • 信号驱动的I/O (Signal Driven I/O)
  • 异步I/O (Asynchrnous I/O)

这里为了更好的理解I/O复用,主要前3种I/O网络模型

同步阻塞I/O

同步阻塞I/O流程图如下:

I/O网络模型

 

当用户进程调用了recv()/recvfrom()这个系统调用,kernel就开始了IO的第一个阶段:准备数据(对于网络IO来说,很多时候数据在一开始还没有到达。比如,还没有收到一个完整的UDP包。这个时候kernel就要等待足够的数据到来)。这个过程需要等待,也就是说数据被拷贝到操作系统内核的缓冲区中是需要一个过程的。而在用户进程这边,整个进程会被阻塞(当然,是进程自己选择的阻塞)。第二个阶段:当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。

所以,同步阻塞(blocking IO)的特点就是在IO执行的两个阶段都被block了。

同步非阻塞I/O

同步非阻塞I/O流程图如下:

I/O网络模型

 

非阻塞IO也会进行recvform系统调用,检查数据是否准备好。非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。

所以,同步阻塞(nonblocking IO)的特点就是在IO执行的第1个阶段没有被block,第2个阶段被block了。

I/O多路复用

I/O多路复用的基本原理是:select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。实现单个process就可以同时处理多个网络连接的IO。

当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

I/O多路复用的流程图如下:

I/O网络模型

 

I/O多路复用和阻塞I/O类似,不同的是这里使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。I/O多路复用用户进程阻塞的不是recvfrom,而是select/epoll。但是,用select的优势在于它可以同时处理多个connection。(select/epoll的详细原理可以参考大话 Select、Poll、Epoll)

所以,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

场景举例

为了更好的理解以上3个I/O 模型,我们举个生活中的例子。前段时间踢球把膝盖扭了,需要去医院拍核磁共振,然后让专家看看到底如何恢复,我们就拿这个做为例子来讲解。

首先对齐几个概念

  • 病人:看作是用户进程
  • 专家:看作是内核进程
  • 核磁共振片子:I/O请求中的数据
  • 医院:看作操作系统,可以调度专家来处理病人的请求

拍过核磁共振的兄弟都知道,片子一般需要3个工作日才能出来。然后等片子出来后,去医院取完片子再看专家,一般一个病人,专家花10-20分钟就处理完了。对比I/O操作的2个阶段,等待数据接收 <--> 等待片子出来,数据从内核复制到用户态 <--> 取片子后到专家处咨询。然后可以把专家看病看作出是数据处理。

有了以上的概念后,我们再看3个I/O模型分别是个什么情况(为了更好的说明,我们把拍片时间缩短1小时)

同步阻塞I/O

病人去医院找到专家,然后拍核磁共振,然后干等,此时这个专家无法再处理其他病人的请求,医院想要接待更多病人,必须找更多的专家。这个时候,对于医院,一个专家处理一个病人需要 1小时 + 10分钟。对于病人,在这1小时内,只能傻傻等待,做不了其他事。

同步非阻塞I/O

和同步阻塞I/O不同的是,病人拍完片后就可以立即回去,不需要在医院干等1小时。这个时候对于病人来说,在这个1小时中可以去干其他事,但是病人必须每隔一段时间来问专家片子是不是已经ready(因为片子随时可能准备好,并非严格1小时)。这就类似轮询机制。所以同步非阻塞I/O机制收益的是病人,理解此机制的主要视角是从应用程序出发。

I/O多路复用

以上两种场景,医院想要接待更多的病人,只能通过增加专家人数。当病人数量不多的情况下,这种模式没问题。但是当病人数不断增多后,医院的处理能力就跟不上了。这时候,医院就想出了一种机制:将核磁共振拍摄单独拎出来,有专门的医生处理(简称片子医生)。每个病人拍完片子后都会记录下来,这个片子医生会定期去看哪个病人的片子已经出来(select轮询)/ 医院建立了erp系统,一旦某个病人的片子出来,就会通知片子医生,同时通知到对应的病人(epoll)。从医院角度看,这样的机制下,一个专家 + 一个片子医生就可以处理多个病人(拍片子的时间远远少于片子产出的时间)。当然医院为了达到更大的规模,还是可以招聘更多的专家,多线程和IO多路复用并不冲突。

所以以上机制的一个核心思想:将集中(中央)处理变为分散(分布式)处理。原本是一个专家负责 拍片+诊断,现在变为拍片医生+诊断专家,将耗时的I/O等待剥离出来,实现了高吞吐量。

关注、转发、评论头条号每天分享JAVA 知识,私信回复 “源码” 赠送Spring源码分析、Dubbo、redis、Netty、zookeeper、Spring cloud、分布式资料

也欢迎关注我的公众号:Java大型网站架构



Tags:I/O   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
如果 ESXi 主机对 LUN 生成的命令超过 LUN 队列深度所允许的数量,则超出的命令会在 VMkernel 中排队。这会增加滞后时间,或是完成 I/O 请求所需的时间。问题主机完成 I/O 请求...【详细内容】
2021-06-23  Tags: I/O  点击:(127)  评论:(0)  加入收藏
​​​​​​​很多对技术有追求的读者朋友,做到一定阶段后都希望技术有所精进。有些读者朋友可能会研究一些中间件的技术架构和实现原理。比如,Nginx为什么能同时支撑数万乃至数十万的连接?为什么单工作线程的Redis性能...【详细内容】
2021-06-11  Tags: I/O  点击:(144)  评论:(0)  加入收藏
你真的了解多线程吗?如果问你“为什么多线程可以提高程序运行效率?”,想必你会说“计算机并行执行任务啊,当然效率高!” 这显然不是一个内行该给出的答案。要知道,一个 CPU 在任何...【详细内容】
2020-11-10  Tags: I/O  点击:(142)  评论:(0)  加入收藏
Netty 怎么切换三种 I/O 模式什么是经典的三种 I/O 模式?生活场景:当我们去饭店吃饭时:&bull; 食堂排队打饭模式:排队在窗口,打好才走;&bull; 点单、等待被叫模式:等待被叫,好了自己...【详细内容】
2020-10-13  Tags: I/O  点击:(101)  评论:(0)  加入收藏
虽然 I/O 的性能指标很多,相应的性能分析工具也有好几个,但理解了各种指标的含义后,你就会发现它们其实都有一定的关联。顺着这些关系往下理解,你就会发现,掌握这些常用的瓶颈分...【详细内容】
2020-07-06  Tags: I/O  点击:(144)  评论:(0)  加入收藏
在Intel今天凌晨公布的2020年第一季度财报,我们发现他们提供的幻灯片中有提到Tiger Lake处理器,而且会在今年年中就发,这个时间点可能会在6月到8月份,其实早在今年CES上他们就提...【详细内容】
2020-04-24  Tags: I/O  点击:(67)  评论:(0)  加入收藏
概述本文从I/O网络模型出发,介绍目前主流的几种网络模型,然后对同步阻塞I/O、同步非阻塞I/O、I/O多路复用的机制和流程做了详细的阐述,最后通过一个生活中的例子加深对这3中网...【详细内容】
2019-12-10  Tags: I/O  点击:(59)  评论:(0)  加入收藏
对于Java I/O来说,I意味着Input(输入),O意味着Output(输出)。读书写作并非易事,而创建一个好的I/O系统更是一项艰难的任务。古人云:“读书破万卷,下笔如有神”。也就是说,只有大量的阅...【详细内容】
2019-11-11  Tags: I/O  点击:(72)  评论:(0)  加入收藏
本文主要讲解怎么解决Linux LVM I/O报错,/dev/sdf: read failed after 0 of 4096 at 0: Input/output error...【详细内容】
2019-09-12  Tags: I/O  点击:(266)  评论:(0)  加入收藏
Java NIO全称Java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网...【详细内容】
2019-07-22  Tags: I/O  点击:(424)  评论:(0)  加入收藏
▌简易百科推荐
以京训钉开发平台接口文档为例,使用HttpClient类请求调用其接口,对数据进行增删改查等操作。 文档地址: https://www.yuque.com/bjjnts/jxd/bo1oszusing System;using System.C...【详细内容】
2021-12-28  Wednes    Tags:HttpClient   点击:(1)  评论:(0)  加入收藏
阿里云与爱快路由安装组网教程一、开通好阿里云轻量服务器之后在服务器运维-远程连接处进行远程 二、进入控制台后在root权限下根据需要安装的固件位数复制下面命令。32位:wg...【详细内容】
2021-12-28  ikuai    Tags:组网   点击:(1)  评论:(0)  加入收藏
HTTP 报文是在应用程序之间发送的数据块,这些数据块将通过以文本形式的元信息开头,用于 HTTP 协议交互。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应...【详细内容】
2021-12-27  程序员蛋蛋    Tags:HTTP 报文   点击:(5)  评论:(0)  加入收藏
一 网络概念:1.带宽: 标识网卡的最大传输速率,单位为 b/s,比如 1Gbps,10Gbps,相当于马路多宽2.吞吐量: 单位时间内传输数据量大小单位为 b/s 或 B/s ,吞吐量/带宽,就是网络的使用率...【详细内容】
2021-12-27  码农世界    Tags:网络   点击:(3)  评论:(0)  加入收藏
1.TCP/IP 网络模型有几层?分别有什么用? TCP/IP网络模型总共有五层 1.应用层:我们能接触到的就是应用层了,手机,电脑这些这些设备都属于应用层。 2.传输层:就是为应用层提供网络...【详细内容】
2021-12-22  憨猪哥08    Tags:TCP/IP   点击:(35)  评论:(0)  加入收藏
TCP握手的时候维护的队列 半连接队列(SYN队列) 全连接队列(accepted队列)半连接队列是什么?服务器收到客户端SYN数据包后,Linux内核会把该连接存储到半连接队列中,并响应SYN+ACK报...【详细内容】
2021-12-21  DifferentJava    Tags:TCP   点击:(10)  评论:(0)  加入收藏
你好,这里是科技前哨。 随着“元宇宙”概念的爆火,下一代互联网即将到来,也成了互联网前沿热议的话题,12月9日美国众议院的听证会上,共和党议员Patrick McHenry甚至宣称,要调整现...【详细内容】
2021-12-17  王煜全    Tags:Web3   点击:(14)  评论:(0)  加入收藏
一、demopublic static void main(String[] args) throws Exception { RetryPolicy retryPolicy = new ExponentialBackoffRetry( 1000, 3);...【详细内容】
2021-12-15  程序员阿龙    Tags:Curator   点击:(22)  评论:(0)  加入收藏
一、计算机网络概述 1.1 计算机网络的分类按照网络的作用范围:广域网(WAN)、城域网(MAN)、局域网(LAN);按照网络使用者:公用网络、专用网络。1.2 计算机网络的层次结构 TCP/IP四层模...【详细内容】
2021-12-14  一口Linux    Tags:网络知识   点击:(31)  评论:(0)  加入收藏
无论是在外面还是在家里,许多人都习惯了用手机连接 WiFi 进行上网。不知道大家有没有遇到过这样一种情况, 明明已经显示成功连接 WiFi,却仍然提示“网络不可用”或“不可上网”...【详细内容】
2021-12-14  UGREEN绿联    Tags:WiFi   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条