重点参考下面文章:

聊聊同步、异步、阻塞与非阻塞

聊聊Linux 五种IO模型

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。

本文是在《UNIX网络编程 卷1:套接字联网API》6.2节"I/O 模型 "的基础上,即UNIX/LINUX环境下的网络 IO环境下的理解,它里面给出的例子是读取(接收)网络UDP数据。下面简单写写自己对这些IO模型的理解。

1、IO

IO (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作,通常用户进程中的一个完整IO分为两阶段:用户进程空间<–>内核空间、内核空间<–>设备空间(磁盘、网络等)。IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。

LINUX中进程无法直接操作I/O设备,其必须通过系统调用请求kernel来协助完成I/O动作;内核会为每个I/O设备维护一个缓冲区。

对于一个输入操作来说,进程IO系统调用后,内核会先看缓冲区中有没有相应的缓存数据,没有的话再到设备中读取,因为设备IO一般速度较慢,需要等待;内核缓冲区有数据则直接复制到进程空间。

所以,对于一个网络输入操作通常包括两个不同阶段:

等待网络数据到达网卡→读取到内核缓冲区,数据准备好;
从内核缓冲区复制数据到进程空间。
2、5种IO模型
《UNIX网络编程》说得很清楚,5种IO模型分别是阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型、异步IO模型;前4种为同步IO操作,只有异步IO模型是异步IO操作。

下面这样些图,是它里面给出的例子:接收网络UDP数据的流程在IO模型下的分析,在它的基础上再加以简单描述,以区分这些IO模型。搜索Java知音公众号,回复“后端面试”,送你一份Java面试题宝典

2-1、阻塞IO模型

进程发起IO系统调用后,进程被阻塞,转到内核空间处理,整个IO处理完毕后返回进程。操作成功则进程获取到数据。

1、典型应用:阻塞socket、Java BIO;

2、特点:

进程阻塞挂起不消耗CPU资源,及时响应每个操作;
实现难度低、开发应用较容易;
适用并发量小的网络应用开发;
不适用并发量大的应用:因为一个请求IO会阻塞进程,所以,得为每请求分配一个处理进程(线程)以及时响应,系统开销大。

2-2、非阻塞IO模型

进程发起IO系统调用后,如果内核缓冲区没有数据,需要到IO设备中读取,进程返回一个错误而不会被阻塞;进程发起IO系统调用后,如果内核缓冲区有数据,内核就会把数据返回进程。

对于上面的阻塞IO模型来说,内核数据没准备好需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞。搜索Java知音公众号,回复“后端面试”,送你一份Java面试题宝典

1、典型应用:socket是非阻塞的方式(设置为NONBLOCK)

2、特点:

进程轮询(重复)调用,消耗CPU的资源;
实现难度低、开发应用相对阻塞IO模式较难;
适用并发量较小、且不需要及时响应的网络应用开发;
2-3、IO复用模型

多个的进程的IO可以注册到一个复用器(select)上,然后用一个进程调用该select, select会监听所有注册进来的IO;

如果select没有监听的IO在内核缓冲区都没有可读数据,select调用进程会被阻塞;而当任一IO在内核缓冲区中有可数据时,select调用就会返回;

而后select调用进程可以自己或通知另外的进程(注册进程)来再次发起读取IO,读取内核中准备好的数据。

可以看到,多个进程注册IO后,只有另一个select调用进程被阻塞。

1、典型应用:select、poll、epoll三种方案,nginx都可以选择使用这三个方案;Java NIO;

2、特点:

专一进程解决多个进程IO的阻塞问题,性能好;Reactor模式;
实现、开发应用难度较大;
适用高并发服务应用开发:一个进程(线程)响应多个请求;
3、select、poll、epoll

Linux中IO复用的实现方式主要有select、poll和epoll:
Select:注册IO、阻塞扫描,监听的IO最大连接数不能多于FD_SIZE;
Poll:原理和Select相似,没有数量限制,但IO数量大扫描线性性能下降;
Epoll :事件驱动不阻塞,mmap实现内核与用户空间的消息传递,数量很大,Linux2.6后内核支持;
2-4、信号驱动IO模型

当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。

特点:回调机制,实现、开发应用难度大;

2-5、异步IO模型

当进程发起一个IO操作,进程返回(不阻塞),但也不能返回果结;内核把整个IO处理完后,会通知进程结果。如果IO操作成功则进程直接获取到数据。

1、典型应用:JAVA7 AIO、高性能服务器应用

2、特点:

不阻塞,数据一步到位;Proactor模式;
需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;
实现、开发应用难度大;
非常适合高性能高并发应用;
3、IO模型比较

3-1、阻塞IO调用和非阻塞IO调用、阻塞IO模型和非阻塞IO模型
注意这里的阻塞IO调用和非阻塞IO调用不是指阻塞IO模型和非阻塞IO模型:

阻塞IO调用 :在用户进程(线程)中调用执行的时候,进程会等待该IO操作,而使得其他操作无法执行。
非阻塞IO调用:在用户进程中调用执行的时候,无论成功与否,该IO操作会立即返回,之后进程可以进行其他操作(当然如果是读取到数据,一般就接着进行数据处理)。
这个直接理解就好,进程(线程)IO调用会不会阻塞进程自己。所以这里两个概念是相对调用进程本身状态来讲的。

从上面对比图片来说,阻塞IO模型是一个阻塞IO调用,而非阻塞IO模型是多个非阻塞IO调用+一个阻塞IO调用,因为多个IO检查会立即返回错误,不会阻塞进程。

而上面也说过了,非阻塞IO模型对于阻塞IO模型来说区别就是,内核数据没准备好需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞。

3-2、同步IO和异步IO
同步IO:导致请求进程阻塞,直到I/O操作完成。
异步IO:不导致请求进程阻塞。
上面两个定义是《UNIX网络编程 卷1:套接字联网API》给出的。这不是很好理解,我们来扩展一下,先说说同步和异步,同步和异步关注的是双方的消息通信机制:

同步:双方的动作是经过双方协调的,步调一致的。
异步:双方并不需要协调,都可以随意进行各自的操作。
这里我们的双方是指,用户进程和IO设备;明确同步和异步之后,我们在上面网络输入操作例子的基础上,进行扩展定义:

同步IO:用户进程发出IO调用,去获取IO设备数据,双方的数据要经过内核缓冲区同步,完全准备好后,再复制返回到用户进程。而复制返回到用户进程会导致请求进程阻塞,直到I/O操作完成。
异步IO:用户进程发出IO调用,去获取IO设备数据,并不需要同步,内核直接复制到进程,整个过程不导致请求进程阻塞。
所以, 阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型者为同步IO模型,只有异步IO模型是异步IO。

五种IO模型:阻塞IO和非阻塞IO、同步IO和异步IO相关推荐

  1. java非阻塞io流_阻塞式和非阻塞io流初认识

    1  什么是阻塞式和非阻塞式? 阻塞式IO:IO即input/output,阻塞式IO指的是"一旦输入/输出工作没有完成,则程序阻塞,直到输入/输出工作完成".在目前,我们从书本上 ...

  2. springBoot整合rabbitmq并测试五种常用模型

    之前我们记录了原生java代码使用rabbitmq的方法,很简单,类似于原生jdbc代码一样,将连接对象抽离出来作为工具类,生产者和消费者通过工具类获取连接对象,进而获取通道对象,再注册交换机或者是队 ...

  3. Web3 网络效应:五种心智模型

    Web3 网络效应:五种心智模型 在过去的十年里,网络效应推动了Web2平台的崛起,也奠定了其主导地位,同时激发了建设者和投资者的想象力.一些人认为网络效应在Web3中会更加强大,而另一些人则认为We ...

  4. AEB 五种安全距离模型

    写在前面当汤喝   AEB,即"Autonomous Emergency Braking"的缩写,意为自动紧急制动系统,可以在检测到危险时通过系统协助驾驶者进行制动,从而避免或减少 ...

  5. RabbitMQ除开RPC的五种消模型----原生API

    2.五种消息模型 RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习.那么也就剩下5种. 但是其实3.4.5这三种都属于订阅模型,只不过进行路由的方式不同. 通过一个 ...

  6. Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结

    同步和异步:与消息的通知机制有关. 本质区别 现实例子 同步模式 由处理消息者自己去等待消息是否被触发 我去银行办理业务,选择排队等,排到头了就办理. 异步模式 由触发机制来通知处理消息者 我去银行办 ...

  7. python非阻塞输入_python_非阻塞套接字及I/O流

    首先,我们要明确2个问题: 普通套接字实现的服务端有什么缺陷吗? 有,一次只能服务一个客户端! 这种缺陷是如何造成的? accept阻塞:当没有套接字连接请求过来的时候会一直等待着 recv阻塞:当连 ...

  8. 深入理解阻塞socket和非阻塞socket

    什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式. 阻塞的意思是指,当试图对该文件描述符进行 ...

  9. 嵌入式驱动之阻塞操作、非阻塞操作

    阻塞 阻塞操作     是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作. 被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足. 非阻塞操作   进 ...

  10. (13)FPGA面试题阻塞赋值与非阻塞赋值

    1.1 FPGA面试题阻塞赋值与非阻塞赋值 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题阻塞赋值与非阻塞赋值: 5)结束语. 1.1.2 本节引言 &q ...

最新文章

  1. master.dbo.spt_values
  2. 5分钟让你懂得什么是容器技术?
  3. appfog下用客户端管理你的mongodb、mysql(类似)
  4. new vue 方法参数_vue源码解析 lt;1gt; 数据驱动
  5. MySQL 服务器变量 数据操作DML-视图
  6. wildfly管理控制台_WildFly管理控制台已更新–请求反馈
  7. echarts如何显示在页面上
  8. 天使玩偶/SJY摆棋子
  9. Python基础学习笔记(一)python发展史与优缺点,岗位与薪资
  10. 《我的互联网方法论》读书笔记
  11. jira怎么提交bug_请停止编写糟糕的提交消息!
  12. 【Python实例第6讲】多标签分类
  13. javascript设计模式_JavaScript设计模式:命令模式(通俗易懂)
  14. 机器学习PCA——实验报告
  15. 一款简洁大气的个人主页源码
  16. 我的毕业设计后端技术栈
  17. 有个空间,名叫 Gamma
  18. MWC 2018前瞻:三星华为诺基亚们会展示这些黑科技!
  19. RSA加解密的OAEP MGF1 填充解析
  20. xshell是什么软件

热门文章

  1. 增长量计算n+1原则_事业单位行测:巧解增长量计算公式
  2. ssm 酒店管理系统
  3. 远程办公软件华为云WeLink视频会议指南(下篇:记录会议纪要)
  4. 华为交换机vlan创建命令
  5. Unity3D贪吃蛇
  6. 1 LoRa 基本知识(参考LoRa物联网通信技术)
  7. P2525 Uim的情人节礼物·其之壱
  8. 光立方体c语言程序,444光立方程序怎么写 光立方原理图、源代码及制作教程
  9. jBPM Designer 2.4.0.Final版发布
  10. 个人博客系统开发记录