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

相关文章
|
5月前
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
112 0
|
4月前
|
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的返回,别的事情什么也不干。
35 0
Linux 下的五种 IO 模型详细介绍
|
8月前
|
NoSQL Unix Linux
Redis核心技术与实践 03 | 高性能IO模型:为什么单线程Redis能那么快?
Redis核心技术与实践 03 | 高性能IO模型:为什么单线程Redis能那么快?
|
5月前
|
存储 Linux
图解IO多路复用模型之select、poll、epoll
图解IO多路复用模型之select、poll、epoll
55 0
|
7月前
|
Java
【面试题精讲】Java IO 模型
【面试题精讲】Java IO 模型
|
4月前
|
缓存 Java Unix
五种网络IO模型
前言   本文重点在于介绍五种网络IO模型
438 0
|
4月前
|
Java 数据处理
fastdfs源码阅读:文件传输原理与网络IO模型(accept线程、work线程(网络io处理)、dio线程(文件io处理))
fastdfs源码阅读:文件传输原理与网络IO模型(accept线程、work线程(网络io处理)、dio线程(文件io处理))
46 0
|
4月前
|
Unix Linux
Linux五种IO模型
Linux五种IO模型
|
4月前
|
存储 Java Windows
JAVA BIO IO 模型概述
【1月更文挑战第1天】JAVA BIO IO 模型概述