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 模型

相关文章
|
6月前
|
Linux C++
|
6月前
|
Linux
Linux 下的五种 IO 模型详细介绍
根据上述定义,我们的前4种模型——阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型和信号驱动式I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom )将阻塞进程。异步请求:A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。和上面的阻塞IO模型相比,非阻塞IO模型在内核数据没准备好,需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞。阻塞请求:A调用B,A一直等着B的返回,别的事情什么也不干。
93 0
Linux 下的五种 IO 模型详细介绍
|
3月前
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
1月前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
1月前
|
安全 NoSQL Java
一文搞懂网络通信的基石✅IO模型与零拷贝
【10月更文挑战第1天】本文深入探讨了网络通信中的IO模型及其优化方法——零拷贝技术。首先介绍了IO模型的概念及五种常见类型:同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO模型。文章详细分析了每种模型的特点和适用场景,特别是多路复用和异步IO在高并发场景中的优势。接着介绍了零拷贝技术,通过DMA直接进行数据传输,避免了多次CPU拷贝,进一步提升了效率。最后总结了各种模型的优缺点,并提供了相关的代码示例和资源链接。
一文搞懂网络通信的基石✅IO模型与零拷贝
|
1月前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
21 3
|
1月前
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
38 3
|
1月前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
1月前
|
数据挖掘 开发者
网络IO模型如何选择?
网络IO模型如何选择?【10月更文挑战第5天】
19 2
|
1月前
|
数据库
同步IO模型是一种常见的编程模型
【10月更文挑战第5天】同步IO模型是一种常见的编程模型
20 2