1、概念剖析

后台开发工作的都接触过同步&异步、阻塞&非阻塞这样的概念,即使没有见过,但是IO肯定都听说过。聊IO之前需要我们对几个概念有一定的认识和理解,比如同步、阻塞、异步、非阻塞等等,同步是否等同于阻塞,异步是否等同于非阻塞....,下面就闲对这几个概念做下基本科普(还是那句话不喜勿喷,个人见解如果想探讨咱们有群)。

  • 同步:就是在触发一个功能调用时,在没有得到结果之前,在这段时间内该调用就不返回。也就是必须一件一件处理,等前一件处理完成后才能处理一件事。例如普通B/S模式(Browser/Server,浏览器/服务器模式)同步:提交请求->等待服务器处理->处理完毕返回 (这个期间客户端浏览器不能干任何事);
  • 异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。例如 ajax请求(异步): 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕;
  • 阻塞:是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回;
  • 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

异同点:

或许有时候会把阻塞调用和同步调用等同起来,即使外表象一样,但是实际上内在地他们是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回,它还会抢占cpu去执行其他逻辑,也会主动检测io是否准备好。通俗一点来理解就是:

  1. 同步:就是调用一个功能,该功能没有结束返回之前,我死等结果;
  2. 异步:就是我调用一个功能,不需要一直等待该功能返回结果,因为该功能有结果后会通知我(回调通知);
  3. 阻塞:就是调用一个函数,函数在返回时没有接收完数据或者没有得到结果之前,函数就不会返回;
  4. 非阻塞,就是调用一个函数,函数会立即返回预定提示信息,然后到最后取得最终结果数据后通过select通知调用者。

同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞

阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回

2、五种IO模型

通过上述概念,下面来聊聊五种IO模型。《UNIX网络编程》说得很清楚,5种IO模型分别是阻塞IO模型(blocking I/O)、非阻塞IO模型(nonblocking I/O)、IO复用模型(select 和poll) (I/O multiplexing)、信号驱动的IO模型(signal driven I/O (SIGIO))、异步IO模型(asynchronous I/O (the POSIX aio_functions));前4种为同步IO操作,只有异步IO模型是异步IO操作。下面这样些图,是它里面给出的例子:接收网络UDP数据的流程在IO模型下的分析,在它的基础上再加以简单描述,以区分这些IO模型。

2.1、阻塞I/O

应用程序调用一个IO函数,导致应用程序阻塞,等待数据处理准备。 如果数据没有准备好,应用程序会一直等待直到数据准备好,从内核拷贝到用户空间,IO函数返回成功指示。

阻塞I/O模型图:在调用recv()/recvfrom()函数时,发生在内核中等待数据和复制数据的过程。

当调用recv()函数时,系统首先检测是否准备好数据。如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接应用程序中,当调用recv()函数时,不一定用户空间就已经存在数据,那么此时recv()函数就会一直处于等待状态。

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

阻塞IO的特点:

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

2.2、非阻塞I/O

非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回预定提示信息);在数据拷贝的过程中,进程是阻塞的。这里把一个SOCKET接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个预定的提示信息。这样我们的I/O操作函数将不断的检测数据是否已经准备好,如果没有准备好,继续检测,直到数据准备好为止。在这个不断检测的过程中,会大量的占用CPU的时间。

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

非阻塞IO特点:

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

2.3、IO复用

IO复用主要是select函数和epoll函数;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听; IO复用模型会用到select、poll、epoll函数,Select:注册IO、阻塞扫描,监听的IO最大连接数不能多于FD_SIZE,Poll:原理和Select相似,没有数量限制,但IO数量大扫描线性性能下降,Epoll :事件驱动不阻塞,mmap实现内核与用户空间的消息传递,数量很大,Linux2.6后内核支持。这几个函数也会使进程阻塞,但是和阻塞IO所不同的的,这两个函数可以同时阻塞多个IO操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用IO操作函数。

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

IO复用模型的特点:

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

2.4、信号驱动IO

首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

信号驱动IO特点:回调机制,实现、开发应用难度大;

2.4、异步IO

当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作

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

异步IO特点:

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

3. 五种IO模型比较

阻塞IO调用 :在用户进程(线程)中调用执行的时候,进程会等待该IO操作,而使得其他操作无法执行;

非阻塞IO调用:在用户进程中调用执行的时候,无论成功与否,该IO操作会立即返回,之后进程可以进行其他操作(当然如果是读取到数据,一般就接着进行数据处理)。

进程(线程)IO调用会不会阻塞进程自己。所以这里两个概念是相对调用进程本身状态来讲的。从上面对比图片来说,阻塞IO模型是一个阻塞IO调用,而非阻塞IO模型是多个非阻塞IO调用+一个阻塞IO调用,因为多个IO检查会立即返回错误,不会阻塞进程。而上面也说过了,非阻塞IO模型对于阻塞IO模型来说区别就是,内核数据没准备好需要进程阻塞的时候,就返回一个预定提示信息,使得进程不被阻塞。

如有披露或问题欢迎留言或者入群探讨

IO学习之概念剖析及五种IO模型相关推荐

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

  2. 你应该知道的五种IO模型

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 写在前面 linux操作系统包含了五种IO模型,各种上层编程语言或者网络编程框架的上层实现都是基于操作系统的这些IO实现来实 ...

  3. Linux五种IO模型性能分析

    转载:http://blog.csdn.net/jay900323/article/details/18141217     Linux五种IO模型性能分析 目录(?)[-] 概念理解 Linux下的 ...

  4. 程序员成长之旅——同步IO和异步IO(五种IO模型)

    程序员成长之旅--同步IO和异步IO(五种IO模型) 同步和异步 同步 异步 消息通知 场景比喻 阻塞和非阻塞 阻塞 非阻塞 事例 同步IO 阻塞IO 非阻塞IO 信号驱动IO 多路转接IO 异步IO ...

  5. 深入聊聊Linux五种IO模型

    一.相关概念讲解 1.同步与异步 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列.要么成功都成功,失败都失败,两个任务的状态可以 ...

  6. 一文弄懂Linux下五种IO模型

    Linux下主要的IO主要分为:阻塞IO(Blocking IO),非阻塞IO(Non-blocking IO),同步IO(Sync IO)和异步IO(Async IO). 同步:调用端会一直等待服务 ...

  7. Linux/Unix五种IO模型

    文章目录 引入 操作系统的内核态和用户态 文件描述符fd IO操作过程: 阻塞和非阻塞 同步和异步 同步IO和异步IO 五种IO模型 1.(同步)阻塞IO模型 2.(同步)非阻塞IO模型 3.IO多路 ...

  8. 漫谈五种IO模型(主讲IO多路复用)

    首先引用levin的回答让我们理清楚五种IO模型 1.阻塞I/O模型 老李去火车站买票,排队三天买到一张退票. 耗费:在车站吃喝拉撒睡 3天,其他事一件没干. 2.非阻塞I/O模型 老李去火车站买票, ...

  9. linux 五种IO模型 简介

    Linux下主要的IO主要分为:阻塞IO(Blocking IO),非阻塞IO(Non-blocking IO),同步IO(Sync IO)和异步IO(Async IO). 同步:调用端会一直等待服务 ...

最新文章

  1. python编写用户输入的是q么代码_Python课 #01号作业
  2. c语言修仙角色,C语言修仙手游-C语言修仙手游安卓版V7.4.0预约_第一手游网
  3. 20个强大的jQuery翻书插件【 jQuery flipbook】
  4. 使用数据库的压测工具super-smack测试mysql数据库性能
  5. Kotlin 5 控制流,返回和跳转
  6. java项目qq聊天室_简单的qq聊天室项目(作者涂俊伟)
  7. Let’s Encrypt 将在两天内撤销约200万份HTTPS 证书
  8. Internet流量监管机制之漏桶算法和令牌桶算法
  9. tensorflow: 重置/清空计算图
  10. java 图片处理 图片缩略图_java 生成图片缩略图
  11. 用井字游戏理解 Minimax 算法
  12. Python openpyxl 删除excel有删除线的文字
  13. 群晖DS918+硬盘选择和阵列选择
  14. 为什么要加密所有个人身份信息(PII)
  15. 计算机预测自己未来的相貌,AI算法预测未来相貌,准确率高达90%以上
  16. 就..而言as far as ..is concerned
  17. Python基础学习笔记(一)
  18. twitter推文不收录_如何阻止Twitter用户的转发(但仍然看到他们的推文)
  19. 电商项目1、后端环境搭建
  20. QQ聊天记录器演示程序

热门文章

  1. java osgi 模块热插拔_osgi记录
  2. python decimal函数_Python之decimal模块的使用
  3. Oracle与空间数据,GIS 与Oracle 空间数据格式的转化
  4. 【Swing 6】绝对定位—QQ登录界面
  5. 世界级标杆项目!联合利华全国首个全品类生产和营销基地落户广州;菲仕兰中国首家体验店在上海黄浦正式启用 | 美通社头条...
  6. 基于51单片机的带记忆功能的电子密码锁设计
  7. 【第十五篇】Camunda系列-任务回退【驳回回退】
  8. 猴子爬山—递推算法(图文详解)
  9. leetcode 427. Construct Quad Tree(构建四叉树)
  10. 腰间盘突出方(刘力红)