Netty之四种常用 IO 模型

简介: Netty之四种常用 IO 模型

四种常用 IO 模型:



同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞.


数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区.


image.png


用户线程在 IO 过程中被阻塞,不能做任何事情,对 CPU 的资源利用率不高.


同步非阻塞 NIO: 用户线程不断发起 IO 请求. 数据未到达时系统返回一状态值; 数据到达后才真正读取数据.image.png

image.png


用户线程每次请求 IO 都可以立即返回,但是为了拿到数据,需不断轮询,无谓地消耗了大量的 CPU. 一般很少直接使用这种模型,而是在其他 IO 模型中使用非阻塞 IO 这一特性


IO 多路复用: IO 多路复用建立在内核提供的阻塞函数 select 上,用户先将需要进行 IO 操作的 socket 添加到 select 中,然后等待阻塞函数 select 返回。当数据到达后,socket 被激活,select 返回,用户线程就能接着发起 read 请求。


image.png


实际上, 我们可以给 select 注册多个 socket, 然后不断调用 select 读取被激活的 socket,实现在同一线程内同时处理多个 IO 请求的效果. 更进一步, 我们把 select 轮询抽出来放在一个线程里, 用户线程向其注册相关 socket 或 IO请求,等到数据到达时通知用户线程,则可以提高用户线程的 CPU 利用率. 这样, 便实现了用户数据读写的异步方式.


image.png


IO 多路复用是最常使用的 IO 模型,因其轮询 select 的线程会被阻塞, 异步程度还不够“彻底”, 所以常被称为异步阻塞 IO


异步 AIO: 真正的异步 IO 需要操作系统更强的支持。IO 多路复用模型中,数据到达内核后通知用户线程,用户线程负责从内核空间拷贝数据;而在异步 IO 模型中,当用户线程收到通知时,数据已经被操作系统从内核拷贝到用户指定的缓冲区内,用户线程直接使用即可。


image.png


相比于 IO 多路复用,异步 IO 并不常用,因为目前操作系统对异步 IO 的支持并不完善,IO多路复用也基本够用. 有很多做法是用 IO 多路复用模型模拟异步 IO(IO 事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)。

目录
相关文章
|
2月前
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
|
2月前
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
10天前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
16天前
|
安全 NoSQL Java
一文搞懂网络通信的基石✅IO模型与零拷贝
【10月更文挑战第1天】本文深入探讨了网络通信中的IO模型及其优化方法——零拷贝技术。首先介绍了IO模型的概念及五种常见类型:同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO模型。文章详细分析了每种模型的特点和适用场景,特别是多路复用和异步IO在高并发场景中的优势。接着介绍了零拷贝技术,通过DMA直接进行数据传输,避免了多次CPU拷贝,进一步提升了效率。最后总结了各种模型的优缺点,并提供了相关的代码示例和资源链接。
一文搞懂网络通信的基石✅IO模型与零拷贝
|
11天前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
16 3
|
11天前
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
25 3
|
11天前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
12天前
|
数据挖掘 开发者
网络IO模型如何选择?
网络IO模型如何选择?【10月更文挑战第5天】
13 2
|
12天前
|
数据库
同步IO模型是一种常见的编程模型
【10月更文挑战第5天】同步IO模型是一种常见的编程模型
12 2
|
1月前
|
存储 机器人 Linux
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty(二)-服务端网络编程常见网络IO模型讲解