五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。

阻塞IO模型:

不管是网络IO还是磁盘IO,对于读操作而言,都是等到网络的某个数据分组到达后/数据准备好后,将数据拷贝到内核空间的缓冲区中,再从内核空间拷贝到用户空间的缓冲区。

阻塞IO的执行过程是进程进行系统调用,等待内核将数据准备好并复制到用户态缓冲区后,进程放弃使用CPU并一直阻塞在此,直到数据准备好。

非阻塞IO模型:

每次应用程序询问内核是否有数据准备好。如果就绪,就进行拷贝操作;如果未就绪,就不阻塞程序,内核直接返回未就绪的返回值,等待用户程序下一个轮询。

大致经历两个阶段:

  • 等待数据阶段:未阻塞, 用户进程需要盲等,不停的去轮询内核。

  • 数据复制阶段:阻塞,此时进行数据复制。

在这两个阶段中,用户进程只有在数据复制阶段被阻塞了,而等待数据阶段没有阻塞,但是用户进程需要盲等,不停地轮询内核,看数据是否准备好。

IO多路复用模型:

多路复用一般都是用于网络IO,服务端与多个客户端的建立连接。

多路复用只是多了一个select/poll/epoll函数。select函数会不断地轮询自己所负责的文件描述符/套接字的到达状态,当某个套接字就绪时,就对这个套接字进行处理。select负责轮询等待,recvfrom负责拷贝。当用户进程调用该select,select会监听所有注册好的IO,如果所有IO都没注册好,调用进程就阻塞。

对于客户端来说,一般感受不到阻塞,因为请求来了,可以用放到线程池里执行;但对于执行select的操作系统而言,是阻塞的,需要阻塞地等待某个套接字变为可读。

IO多路复用其实是阻塞在select,poll,epoll这类系统调用上的,复用的是执行select,poll,epoll的线程。

信号驱动IO模型:

当数据报准备好的时候,内核会向应用程序发送一个信号,进程对信号进行捕捉,并且调用信号处理函数来获取数据报。

该模型也分为两个阶段:

  • 数据准备阶段:未阻塞,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,对用户进程做一个回调。

  • 数据拷贝阶段:阻塞用户进程,等待数据拷贝。

异步IO模型:

用户进程发起系统调用后,立刻就可以开始去做其他的事情,然后直到I/O数据准备好并复制完成后,内核会给用户进程发送通知,告诉用户进程操作已经完成了。

特点:

  1. 异步I/O执行的两个阶段都不会阻塞读写操作,由内核完成。

  2. 完成后内核将数据放到指定的缓冲区,通知应用程序来取。

最新文章

  1. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
  2. Li-Fi,LED光无线局域网
  3. kali 2016的基础配置
  4. ansible的playbook组件
  5. LoadRunner error -27257
  6. nginx 1.3.9/1.4.0 x86 Brute Force Remote Exploit
  7. 关于cookie, iphone及chrome的异同
  8. WindowsPhone8中实现圆形图片的生成显示
  9. java8新特性,使用流遍历集合
  10. linkin大话面向对象--闭包和回调
  11. Ionic2生成的main.js执行时间10s+
  12. Docker Toolbox
  13. IDEA: Call Hierarchy
  14. 采用ddt 可以把ddt获取的数据 塞进测试用例里面的备注里面去展示 (还没有试)
  15. Memcached 总结 启动多个Memcached服务 配置文件详解
  16. 模拟prompt
  17. 基于Linux的智能家居的设计(3)
  18. CAD扩展属性的提取--FME方式
  19. opengl摄像机
  20. 简单易懂的snmpd.conf配置文件说明

热门文章

  1. 移动开发之h5学习大纲
  2. [PE结构]导出表结构浅析
  3. HTTP初识
  4. 【Linux】【Shell】【Basic】变量与数据类型
  5. Linux系统下部署eleasticsearch+kibana
  6. centos7 docker 修改Nginx文件
  7. 【C/C++】习题3-1 得分/算法竞赛入门经典
  8. JAVA日志发展史
  9. Redis学习推荐资料合集
  10. 【已解决】关于echarts的splitArea分割区域背景闪烁问题