5种网络IO模型介绍

IO 模型分为以下几种:

阻塞IO

非阻塞IO

信号驱动IO

IO多路复用

异步IO

前四个为同步IO

1 阻塞IO

一个IO操作需要两步: 等待数据和拷贝数据。

blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。

一直阻塞,知道两步完成

2 非阻塞IO

从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。

等待数据的不用阻塞,而是轮询check,第二步阻塞。

所以,在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。

3 多路复用IO

和第二种一样,调用system call之后,并不等待内核的返回结果而是立即返回。虽然返回结果的调用函数是一个异步的方式,但应用程序会被像select、poll和epoll等具有多个文件描述符的函数阻塞住,一直等到这个system call有结果返回了,再通知应用程序。这种情况,从IO操作的实际效果来看,多路复用IO和第一种同步阻塞IO是一样的,应用程序都是一直等到IO操作成功之后(数据已经被写入或者读取),才开始进行下面的工作。不同点在于多路复用IO用一个select函数可以为多个文件描述符提供通知,提供了并发性。举个例子:例如有一万个并发的read请求,但是网络上仍然没有数据,此时这一万个read会同时各自阻塞,现在用select、poll、epoll这样的函数来专门负责阻塞同时监听这一万个请求的状态,一旦有数据到达了就负责通知,这样就将一万个等待和阻塞转化为一个专门的函数来负责与管理。

多路复用技术应用于JAVA NIO的核心类库多路复用器Selector中,目前支持I/O多路复用的系统调用有select、pselect、poll、epoll,在linux编程中有一段时间一直在使用select做轮询和网络事件通知的,但是select支持一个进程打开的socket描述符(FD)收到了限制,一般为1024,由于这一限制,现在使用了epoll代替了select,而epoll支持一个进程打开的FD不受限制。

和第二个一样,只是select可以支持并发。

4 异步IO

用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了

实现了真正的非阻塞,从开始发起操作到最后读取完成,都不需要阻塞。

5 信号驱动IO

应用程序提交read请求,调用system call,然后内核开始处理相应的IO操作,而同时,应用程序并不等内核返回响应,就会开始执行其他的处理操作(应用程序没有被IO阻塞),当内核执行完毕,返回read响应,就会产生一个信号或执行一个基于线程的回调函数来完成这次IO处理过程。在这里IO的读写操作是在IO事件发生之后由应用程序来完成。

6 同步和异步的区别

异步IO与同步IO的区别在于:同步IO是需要应用程序主动地循环去询问是否有数据,而异步IO是通过像select等IO多路复用函数来同时检测多个事件句柄来告知应用程序是否有数据。

同步是需要主动等待消息通知,而异步则是被动接受消息通知,通过回调、通知、状态等方式来被动获取消息。IO多路复用在阻塞到select阶段时,用户进程是主动等待并调用select函数来获取就绪状态消息,并且其进程状态为阻塞。所以IO多路复用是同步阻塞模式。

7 阻塞和非阻塞的区别

调用一个方法,一直到拿到结果为止等待,则为阻塞。
调用一个方法,直接给你结果,则为非阻塞。

这么看来,同步和阻塞,异步和非阻塞看起来意思是一样的,但是其实不然,同步异步强调的是方法的结果如何返回,而阻塞非阻塞强调的是执行方法的过程如何执行。比如,你去餐馆吃饭,你点了一盘菜,你是继续等待还是出去等老板打电话给你说菜好了,这就是同步异步。而你时不时问老板说菜好了吗,老板可以在你问了之后回答马上好一直到最后说好了是非阻塞,而阻塞是你问了一次,老板不说话,直到菜好了端出来回答一句好了。

5种网络IO模型介绍相关推荐

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

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

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

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

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

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

  4. 五种网络IO模型:阻塞式IO 非阻塞式IO IO复用(IO multiplexing) 信号驱动式IO 异步IO

    文章目录 五种网络IO模型 举例说明 阻塞式I/O模型 非阻塞式I/O I/O多路复用 信号驱动式I/O 异步I/O 比较结果 总结 同步 异步 阻塞 非阻塞 阻塞/非阻塞: 同步/异步: 举例子:小 ...

  5. 五种网络IO模型详解

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

  6. mysql io模型_5种网络IO模型

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  7. 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO

    目录 前言 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) 模型间的区别 ...

  8. 浅谈5种网络IO模型

    五种 IO 模型 1.阻塞式 IO 阻塞 IO 是最流行的 IO 模型 在网络 IO 的时候,进程发起 recvfrom 系统调用,然后进程就被阻塞了,什么也不干,直到数据准备好,并且将数据从内核复制 ...

  9. 【Linux网络编程】深入理解Linux五种网络IO模型

    相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分别是什么含义. ...

最新文章

  1. echarts切换折线图变大_这个月,我就和折线图杠上了...
  2. 如何拼通网络ip地址_如何解决IP地址冲突
  3. Mui Webview下来刷新上拉加载实现
  4. 51单片机c语言乘法,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!
  5. 【小白学习PyTorch教程】八、使用图像数据增强手段,提升CIFAR-10 数据集精确度...
  6. 菜品三级分类_分类器的惊人替代品
  7. vim学习笔记(3)眼花缭乱的Vim模式
  8. 20190530本科教学PPT 文本挖掘的两种基本方法(TF-IDF和LDA)
  9. 像素级复制!荣威R品牌“撞车”小鹏P7剪刀门,还是手动的?
  10. 20种语言说圣诞快乐
  11. mysql创建外键失败_mysql创建外键错误
  12. HNOI2017 滚粗记
  13. c#先进行uri解码_JavaScript、C# URL编码、解码总结
  14. froala 的使用
  15. oracle制造分销模块,oracle ebs表结构及功能总结(财务,制造,分销模块)
  16. 译:谷歌OKR指导手册(全文)
  17. oracle 数据库不用了,改用SQL,要学SQL了,第一个手工写的存储过程
  18. 移动端判断手机横竖屏状态及加载相应样式或内容的解决方案
  19. awscli配置Access key ID和Secret access key
  20. 计算机cat的应用,计算机辅助系统

热门文章

  1. java京东查询物流轨迹事例_Java爬虫实现京东物流查询
  2. 【Python金融量化 10- 100 】十、怎样的收益率预测模型才是好的模型?
  3. 节能原理 复习(能量平衡+热电联产+联合循环)
  4. 十一、练习:爬取图虫网付费图片
  5. 杭州/北京/新加坡 | 蚂蚁集团数字身份团队招聘计算机视觉算法实习生
  6. 今日arXiv精选 | ICCV 2021/CIKM 2021/ACM MM 2021
  7. NLP Chinese Corpus:大规模中文自然语言处理语料
  8. CMU Facebook论文解读 | 非局部神经网络(附代码实现)
  9. Android 开发 技术大纲 某学课堂
  10. javaweb和ajax使用查询出来的数据做下拉菜单_不会用Excel做数据筛选,老板叼的你没话说!...