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

相关文章
|
3月前
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
143 0
|
3月前
|
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的返回,别的事情什么也不干。
57 0
Linux 下的五种 IO 模型详细介绍
|
3月前
|
存储 Linux
图解IO多路复用模型之select、poll、epoll
图解IO多路复用模型之select、poll、epoll
81 0
|
6天前
|
消息中间件 网络协议 Java
你不得不了解的网络IO模型知识
该文章主要讲述了网络I/O模型的相关知识,包括不同的I/O模型以及它们的特点和应用场景。
你不得不了解的网络IO模型知识
|
13天前
五种IO模型基本概念
正确选择与应用适合的I/O模型是提升程序性能,保证响应时间和处理能力的关键。选择时需要综合考虑程序的实际应用场景、性能要求以及开发和维护的复杂性。
17 1
|
19天前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
|
19天前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
|
1月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
|
2月前
|
Linux C++
c++高级篇(三) ——Linux下IO多路复用之poll模型
c++高级篇(三) ——Linux下IO多路复用之poll模型