IO 模型

简介: IO 模型

IO 的两个阶段

  • 数据准备阶段
  • 数据拷贝阶段

1、阻塞 IO

linux 中,默认所有的 socket 都是阻塞的。

阻塞 IO


2、非阻塞 IO

数据准备阶段,非阻塞立即返回,未准备好返回-1。而数据拷贝阶段都是阻塞的。

非阻塞 IO


2.1、阻塞 IO 与 非阻塞 IO

两者的差异在于:IO 函数在数据准备阶段(数据未就绪时)是否立刻返回

int n = read(fd, buf, size) | write(fd, buf, size)
 // 1、阻塞IO,阻塞在网络线程
 // 2、非阻塞IO,errno = EWOULDBLOCK,未发送完的数据注册写事件,等待下次写事件触发时发送
 if (-1 == n) errno = EWOULDBLOCK

fd 默认是阻塞的,连接的 fd 阻塞属性决定了 IO 函数是否阻塞

// 设置非阻塞 IO
 int flag = fcntl(fd, F_GETFL, 0);
 fcntl(fd, F_SETFL, O_NONBLOCK);

3、IO 多路复用

用一个线程来检测多个 IO 事件,作用于数据准备阶段。

IO 多路复用


应用程序通过 IO 复用函数向内核注册一组事件,内核通过 IO 复用函数把其中就绪的事件通知给应用程序,又称为事件驱动 IO。IO 复用函数本身是阻塞的,但可同时监听多个 IO 事件,对 IO 本身的读写操作是非阻塞的。

注:边缘触发的时候,IO 函数只能是非阻塞的。

4、信号驱动IO

信号触发读写就绪事件,用户信号处理函数完成读写操作,不阻塞。

信号驱动 IO


缺点:大量 IO 操作时,信号较多,SIGIO 处理函数不能及时处理可能导致信号队列溢出,而且内核空间与用户空间的频繁信号交互性能较低。

5、异步IO

同步 IO 向用户通知的是 IO 就绪事件,异步 IO 向用户通知的是 IO 完成事件,真正实现了非阻塞。

异步 IO


6、总结

  • 阻塞 IO 与非阻塞 IO:数据准备阶段是否阻塞。
  • 同步 IO 与 异步 IO:数据拷贝阶段是否同步。

IO 模型

相关文章
|
7月前
|
Java Linux API
IO模型
BIO、NIO、AIO是Java中处理网络I/O的三种模型。BIO为阻塞式,每个连接需单独线程,高并发下性能受限;NIO通过非阻塞与多路复用提升并发能力,少量线程可处理大量请求;AIO进一步实现异步非阻塞,数据复制时线程可释放,由回调机制处理后续操作。三者适用于不同场景,BIO易用但低效,NIO高效但复杂,AIO理论性能更优但目前在Linux上仍依赖多路复用实现。Java 21引入虚拟线程后,BIO也可兼具高性能与易编写特性。
214 2
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
523 4
网络协议与IO模型
|
安全 NoSQL Java
一文搞懂网络通信的基石✅IO模型与零拷贝
【10月更文挑战第1天】本文深入探讨了网络通信中的IO模型及其优化方法——零拷贝技术。首先介绍了IO模型的概念及五种常见类型:同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO模型。文章详细分析了每种模型的特点和适用场景,特别是多路复用和异步IO在高并发场景中的优势。接着介绍了零拷贝技术,通过DMA直接进行数据传输,避免了多次CPU拷贝,进一步提升了效率。最后总结了各种模型的优缺点,并提供了相关的代码示例和资源链接。
一文搞懂网络通信的基石✅IO模型与零拷贝
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
140 3
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
557 3
|
数据挖掘 开发者
网络IO模型如何选择?
网络IO模型如何选择?【10月更文挑战第5天】
186 2
|
数据库
同步IO模型是一种常见的编程模型
【10月更文挑战第5天】同步IO模型是一种常见的编程模型
183 2
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
242 1