深入了解Netty【四】IO模型
2024-09-05 04:26:37
引言
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 - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
最新文章
- finally回收资源
- sqlservr (708) 打开日志文件 C:\Windows\system32\LogFiles\Sum\Api.log 时出现错误 -1032 (0xfffffbf8)
- 一篇文看懂Hadoop:风雨十年,未来何去何从
- PoEdu - C++阶段班【Po学校】- 第1课
- std的find和reverse_iterator联合使用
- Tomcat提示Null component
- 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值
- php 开启缓冲,页面纯静态化
- 手机变为电脑的摄像头,使像素高清起来-使用DroidCam
- 使用html5兼容低版本浏览器
- 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码
- Kafka如何保证消息的可靠性传输
- POI SXSSFWorkbook 读取模板 存在公式解决
- 机器学习基石笔记:15 Validation
- 手游开发Android平台周边工具介绍
- 29 Socketserver和 ftp
- MySQL查询语句练习题(面试时可能会遇到哦!)
- .net mvc C#生成网页快照
- GIS平台结构设计
- postgreSQL php及客户端
热门文章
- wps 2011 破解版软件
- 精讲RestTemplate第3篇-GET请求使用方法详解
- 暑期java(面向对象设计)学习第一阶段总结
- 常哥带你认识NoSQL和Redis的强大
- SkyWalking 搭建及简单使用(Linux)
- Python学习笔记之 Python设计思想&;设计原则
- Vue 使用mixin抽取共通方法
- 用它5分钟以后,我放弃用了四年的 Flask
- 关于Hexo,Next主题的‘下一页’、‘上一页’按钮错误显示为html代码 的解决方法
- ExcelWeb脚本助手,自定义脚本,批量操作Excel与网页