首页 > 其他分享 >I/O 模型——阻塞 I/O、非阻塞 I/O、 I/O 多路复用、信号驱动 I/O、异步 I/O

I/O 模型——阻塞 I/O、非阻塞 I/O、 I/O 多路复用、信号驱动 I/O、异步 I/O

时间:2025-01-15 23:57:17浏览次数:3  
标签:异步 多路复用 编程 程序 阻塞 线程 操作

目录

1. 阻塞 I/O(Blocking I/O)

2. 非阻塞 I/O(Non-blocking I/O)

3. I/O 多路复用(I/O Multiplexing)

4. 信号驱动 I/O(Signal-driven I/O)

5. 异步 I/O(Asynchronous I/O)

总结


I/O 模型(Input/Output Model)定义了程序与外部设备(如磁盘、网络、终端等)之间的数据交互方式。在计算机系统中,I/O 操作通常是程序与硬件设备之间的交互,而操作系统为此提供了不同的 I/O 模型来支持不同的并发、效率和资源管理需求。常见的 I/O 模型有以下几种:

1. 阻塞 I/O(Blocking I/O)

在阻塞 I/O 模型中,当程序发起一个 I/O 操作(例如读文件、接收网络数据)时,操作系统会阻塞当前线程,直到 I/O 操作完成。换句话说,程序会被挂起,直到 I/O 数据完全读取或写入完毕。此时线程无法做其他事情,直到操作完成。

  • 优点:

    • 编程简单,容易理解,应用程序按顺序执行,不需要处理多线程或事件驱动的复杂逻辑。

  • 缺点:

    • 性能差:如果 I/O 操作需要很长时间,程序将一直等待,浪费时间,无法进行其他操作,造成 CPU 的低效利用。

2. 非阻塞 I/O(Non-blocking I/O)

在非阻塞 I/O 模型中,当程序发起 I/O 操作时,操作系统不会阻塞线程,而是立即返回。如果数据没有准备好,I/O 操作会返回一个错误或特殊状态码,程序可以选择稍后再次尝试。这种方式适用于程序需要同时处理多个 I/O 操作,而不希望因一个操作的延迟而阻塞其他操作。

  • 优点:

    • 可以同时处理多个 I/O 操作,适用于高并发的场景,避免了线程阻塞。

  • 缺点:

    • 编程复杂度较高,需要反复检查 I/O 状态(轮询),可能导致 CPU 使用率较高。

3. I/O 多路复用(I/O Multiplexing)

I/O 多路复用是一种高效的非阻塞 I/O 模型,允许程序同时监听多个文件描述符或套接字的 I/O 事件(例如读取、写入、异常)。通过 I/O 多路复用,程序可以在单个线程中同时处理多个 I/O 操作。常用的实现方法包括 selectpollepoll 等。

  • 优点:
    • 通过单线程或少量线程处理大量并发连接,适用于高并发服务器,能够高效地响应大量 I/O 请求。
  • 缺点:
    • 编程模型较复杂,需要根据不同的 I/O 事件做出响应,并且一些实现(如 select)在文件描述符数量很多时效率较低。

4. 信号驱动 I/O(Signal-driven I/O)

信号驱动 I/O 允许程序通过信号来通知它某个 I/O 操作已完成。在这种模型中,程序注册一个信号处理函数,当文件描述符准备好进行 I/O 操作时,操作系统会发送一个信号给程序,程序收到信号后执行相应的处理。

  • 优点:

    • 避免了轮询,可以减少 CPU 使用率。

  • 缺点:

    • 编程较为复杂,需要处理信号的异步执行问题,可能会影响程序的控制流。

5. 异步 I/O(Asynchronous I/O)

在异步 I/O 模型中,当程序发起一个 I/O 操作时,操作系统立即返回,不会阻塞程序。I/O 操作在后台异步执行,程序可以继续进行其他操作。当 I/O 操作完成时,操作系统会通过回调通知程序结果。异步 I/O 适用于需要执行大量 I/O 操作的应用,且不希望任何 I/O 操作阻塞程序的执行。

  • 优点:

    • 程序可以在等待 I/O 操作完成的同时进行其他任务,提高了程序的整体效率。

    • 高并发场景下,能够提高系统资源的利用率,减少上下文切换。

  • 缺点:

    • 编程复杂,需要处理回调函数或通知机制。

    • 如果 I/O 操作异常,处理方式可能较为复杂。

总结

模型特点使用场景优缺点
阻塞 I/O阻塞操作,直到完成才返回简单应用场景,如文件操作编程简单,但性能差,阻塞线程,不适合高并发
非阻塞 I/O发起 I/O 操作后立即返回,若没有准备好则返回错误适合高并发场景,轮询检查 I/O 状态编程复杂,CPU 占用高
I/O 多路复用单线程监听多个 I/O 事件,减少线程切换开销高并发服务器,网络通信编程复杂,某些实现效率低,需频繁系统调用
信号驱动 I/O使用信号来通知 I/O 完成较少使用,主要用于特定的事件处理编程复杂,信号处理可能影响控制流
异步 I/OI/O 操作异步执行,程序可以继续执行其他操作高并发应用,实时性要求较高编程复杂,回调处理较麻烦、

标签:异步,多路复用,编程,程序,阻塞,线程,操作
From: https://blog.csdn.net/fengjingping11/article/details/145149510

相关文章

  • Java ProcessBuilder 启动的进程阻塞不退出问题。
    https://wiki.sei.cmu.edu/confluence/display/java/FIO07-J.+Do+not+let+external+processes+block+on+IO+buffers java通过调用进程读取输出启动进程的标准输出时,如果被调用进程的,标准输出以及错误流的缓冲区被写满,后续写入会导致调用进程会卡住,无法正常结束。 确保waiffo......
  • Python异步编程在股票交易系统中的应用:如何减少延迟提升效率
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • 网络编程I/O多路复用—动态数组
    函数声明#ifndef__VECTOR_H__#define__VECTOR_H__typedefstruct{ int*fd; intcounter; intmax_counter;}VectorFD;externVectorFD*create_vector_fd(void);externvoid destroy_vector_fd(VectorFD*);externint get_fd(VectorFD*,intindex);ext......
  • 使用 CompletableFuture 实现异步编程
    使用CompletableFuture实现异步编程在现代Java开发中,异步编程是一项重要技能。而CompletableFuture是从Java8开始提供的一个功能强大的工具,用于简化异步任务的编写和组合。本文将详细介绍CompletableFuture的基本使用和一些常见的应用场景。1.为什么选择Completab......
  • 多路复用与多路分解
    主机维护一个Socket表,通过表中记录的ipport与socket对应关系进行封装报文,接受到报文时使用报文的ip和port查找对应socket的过程称为多路复用与多路分解TCPsocket存有本机进程到对端进程的映射关系UDPudp是无连接的,本机ipport没有和对端ipport构成映射关系,udp的socket只与......
  • Qt异步实现事件的定时执行 - QTimer和QThread的联合使用
    引言在Qt开发中,异步定时执行事件是常见需求。为了提高应用程序的响应能力和性能,合理使用QTimer和QThread可以实现高效的异步定时任务。本文将详细介绍如何在Qt中通过QTimer和QThread的联合使用,实现异步事件的定时执行。QTimer简介QTimer是Qt中用于定时操作的类。它可以在指定的......
  • JavaScript 交互逻辑与异步编程
    JavaScript作为前端实现交互逻辑的核心语言,其复杂性和重要性不言而喻。在构建诸如表单验证、菜单展开收起、页面动态加载等交互功能时,我常常需要处理各种事件监听、DOM操作以及数据的动态更新。尤其是当涉及到异步操作,比如从后端接口获取数据并实时更新页面内容时,JavaScript的......
  • FastApi框架异步调用同步问题
    Fastapi项目,在接口中调用同步方法,如果该同步方法,耗时较长(比如连接redis超时),会造成整个项目接口的阻塞,这是任何接口的访问都会被阻塞超时一、为什么会阻塞FastAPI是基于异步框架(如asyncio或anyio)构建的,它的核心是一个事件循环(EventLoop)。事件循环负责调度和执行所有的异步......
  • 聊一聊 C#异步 任务延续的三种底层玩法
    一:背景1.讲故事最近聊了不少和异步相关的话题,有点疲倦了,今天再写最后一篇作为近期这类话题的一个封笔吧,下篇继续写我熟悉的 生产故障 系列,突然亲切感油然而生,哈哈,免费给别人看程序故障,是一种积阴德阳善的事情,欲知前世因,今生受者是。欲知来世果,今生做者是。在任务延续方面......
  • 聊一聊 C#异步 任务延续的三种底层玩法
    一:背景1.讲故事最近聊了不少和异步相关的话题,有点疲倦了,今天再写最后一篇作为近期这类话题的一个封笔吧,下篇继续写我熟悉的生产故障系列,突然亲切感油然而生,哈哈,免费给别人看程序故障,是一种积阴德阳善的事情,欲知前世因,今生受者是。欲知来世果,今生做者是。在任务延续方面,我个......