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

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO5 种 IO 模型 阻塞 IO 和非阻塞 IO 同步 IO 和异步 IO 看了一些文章 发现有很多不同的理解 可能是因为大家入切的角度 环境不一样 所以 我们先说明基本的 IO 操作及环境 本文是在 UNIX 网络编程卷 1 套接字联网 API 6 2 节 I O 模型 的基础上 即 UNIX LINUX 环境下的网络 IO 环境下的理解 它里面给出的例子是读取 接收 网络 UDP 数据 下面简单写写自己对这些 IO

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

       看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。本文是在《UNIX网络编程 卷1:套接字联网API》6.2节”I/O 模型 “的基础上,即UNIX/LINUX环境下的网络 IO环境下的理解,它里面给出的例子是读取(接收)网络UDP数据。下面简单写写自己对这些IO模型的理解。

1、IO

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

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

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

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

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

(1)等待网络数据到达网卡→读取到内核缓冲区,数据准备好;

(2)从内核缓冲区复制数据到进程空间。

2、5种IO模型

       《UNIX网络编程》说得很清楚,5种IO模型分别是阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型、异步IO模型;前4种为同步IO操作,只有异步IO模型是异步IO操作。下面这样些图,是它里面给出的例子:接收网络UDP数据的流程在IO模型下的分析,在它的基础上再加以简单描述,以区分这些IO模型。

2-1、阻塞IO模型

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

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

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

2、特点:

进程阻塞挂起不消耗CPU资源,及时响应每个操作

实现难度低、开发应用较容易;

适用并发量小的网络应用开发;

不适用并发量大的应用:因为一个请求IO会阻塞进程,所以,得为每请求分配一个处理进程(线程)以及时响应,系统开销大。

2-2、非阻塞IO模型

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

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

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

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

2、特点:

进程轮询(重复)调用,消耗CPU的资源

实现难度低、开发应用相对阻塞IO模式较难;

 适用并发量较小、且不需要及时响应的网络应用开发;

2-3、IO复用模型

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步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模型

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

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

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

2-5、异步IO模型

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

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

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

2、特点:

不阻塞,数据一步到位Proactor模式

需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;

实现、开发应用难度大;

非常适合高性能高并发应用;

3、IO模型比较

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步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。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217414.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:37
下一篇 2026年3月18日 上午9:37


相关推荐

  • Android基于百度OCR识别图片中的文字

    Android基于百度OCR识别图片中的文字    OCR(OpticalCharacterRecognition),即光学字符识别,指的是针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。简单的来说,OCR技术就是可以把图片上的文字识别出来,并以文本格式的形式提取出来。    该技术已广泛应用于生活中。比如很多翻译软件都有的拍照翻译功能,就利用了该技术。这里尝试使用百度OCR接口实现Android拍照识别文字功能。请求模块定义   

    2022年5月13日
    46
  • FPS游戏:实现GDI方框透视「建议收藏」

    FPS游戏:实现GDI方框透视「建议收藏」FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视

    2022年7月1日
    159
  • Java学习之final与匿名内部类篇

    Java学习之final与匿名内部类0x00前言续上几篇文章,得知子类继承父类后是可以在父类的基础上进行改写的,那么在程序中有些东西可能是不能让我们给轻易给改动的,那么Java给提供了final

    2021年12月11日
    59
  • 【stm32】UART和USART简单区别

    【stm32】UART和USART简单区别USART:通用同步和异步收发器UART:通用异步收发器当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能。这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。…

    2022年5月12日
    45
  • DHCP Option 60 的理解

    DHCP Option 60 的理解

    2021年11月28日
    46
  • 【前端】HTML底部返回顶部悬浮按钮

    【前端】HTML底部返回顶部悬浮按钮CSS样式:.back-to{ bottom:55px; overflow:hidden; position:fixed; right:10px; width:110px; z-index:999; } .back-to.back-top{ background:url(“./imag…

    2022年7月13日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号