引言

IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO复用模型、信号驱动式IO模型、异步IO模型。

因为学习Netty必不可少的要了解IO多路复用模型,本篇是基础。

名词概念

  • 阻塞:指向调用方,在调用结果返回之前,调用方线程会挂起,直到结果返回。
  • 非阻塞:指向调用方,在调用结果返回之前,调用方线程会处理其他事情,不会阻塞。
  • 同步:指向被调用方,被调用方得到结果后再返回给调用方。
  • 异步:指向被调用方,被调用方先应答调用方,然后计算结果,最终通知并返回给调用方。
  • recvfrom函数:系统调用,经socket接收数据。

5中IO模型

1、阻塞式IO模型(blocking I/O)



进程调用recvfrom函数,在数据没有返回之前,进程阻塞,直到数据返回后,才会处理数据。

2、非阻塞式IO模型(non-blocking I/O)



进程调用recvfrom函数,如果数据没有准备好就返回错误提示,之后进程循环调用recvfrom函数,直到有数据返回。

3、IO复用模型(I/O multiplexing)



进程调用select,如果没有套接字变为可读,则阻塞,直到有可读套接字之后,调用recvfrom函数,返回结果。

4、信号驱动式IO模型(signal-driven I/O)



进程先注册信号驱动,之后进程不阻塞,当数据准备好后,会给进程返回信号提示,这时进程调用ecvfrom函数,返回数据。

5、异步IO模型(asynchronous I/O)



由POSIX规范定义,应用程序告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。这种模型与信号驱动模型的主要区别在于:信号驱动I/O是由内核通知应用程序何时启动一个I/O操作,而异步I/O模型是由内核通知应用程序I/O操作何时完成。

IO模型对比



阻塞越少,理论上性能也越优。

  • 阻塞式IO,每个连接要对应一个线程单独处理,浪费资源。
  • 非阻塞式IO,需要不断的轮询,也耗费CPU资源。
  • 信号驱动式IO,在大量IO操作时会有信号队列溢出,且对于TCP而言,通知条件过多,每一个进行判断会消耗资源。
  • 异步IO,理论最优,但是目前Linux支持还不是很完善。

因此在Linux下网络编程都以IO复用模型为主。

参考

理解高性能网络模型

IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

最新文章

  1. finally回收资源
  2. sqlservr (708) 打开日志文件 C:\Windows\system32\LogFiles\Sum\Api.log 时出现错误 -1032 (0xfffffbf8)
  3. 一篇文看懂Hadoop:风雨十年,未来何去何从
  4. PoEdu - C++阶段班【Po学校】- 第1课
  5. std的find和reverse_iterator联合使用
  6. Tomcat提示Null component
  7. 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值
  8. php 开启缓冲,页面纯静态化
  9. 手机变为电脑的摄像头,使像素高清起来-使用DroidCam
  10. 使用html5兼容低版本浏览器
  11. 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码
  12. Kafka如何保证消息的可靠性传输
  13. POI SXSSFWorkbook 读取模板 存在公式解决
  14. 机器学习基石笔记:15 Validation
  15. 手游开发Android平台周边工具介绍
  16. 29 Socketserver和 ftp
  17. MySQL查询语句练习题(面试时可能会遇到哦!)
  18. .net mvc C#生成网页快照
  19. GIS平台结构设计
  20. postgreSQL php及客户端

热门文章

  1. wps 2011 破解版软件
  2. 精讲RestTemplate第3篇-GET请求使用方法详解
  3. 暑期java(面向对象设计)学习第一阶段总结
  4. 常哥带你认识NoSQL和Redis的强大
  5. SkyWalking 搭建及简单使用(Linux)
  6. Python学习笔记之 Python设计思想&设计原则
  7. Vue 使用mixin抽取共通方法
  8. 用它5分钟以后,我放弃用了四年的 Flask
  9. 关于Hexo,Next主题的‘下一页’、‘上一页’按钮错误显示为html代码 的解决方法
  10. ExcelWeb脚本助手,自定义脚本,批量操作Excel与网页