博客
关于我
5种IO模型和IO多路复用详解
阅读量:302 次
发布时间:2019-03-01

本文共 956 字,大约阅读时间需要 3 分钟。

I/O 模型概述

1. 同步I/O

1.1 阻塞式I/O

  • 阻塞式I/O是最传统的I/O模型,调用如recvfrom后,用户进程会阻塞等待数据到达内核缓冲区并复制到应用进程缓冲区。

1.2 非阻塞式I/O

  • 非阻塞式I/O通过循环调用recvfrom实现数据读取,若数据未到达则返回错误,否则复制数据到应用进程缓冲区(称为轮询机制)。

1.3 I/O 复用

  • I/O 复用允许应用进程同时监控多个I/O流,首先调用select(或poll/epoll)阻塞直至检测到数据准备就绪,然后复制数据到应用进程缓冲区。

1.4 信号驱动I/O

  • 信号驱动I/O通过设置信号处理函数,接收到信号后主循环再调用recvfrom读取数据,避免阻塞。

2. 异步I/O

  • 异步I/O由 POSIX 规范定义,通过调用aio_read完成数据读取,内核完成数据处理后通知应用进程。

3. 输入操作流程

  • 等待数据准备
    • 对于套接字操作,等待数据在网络中到达内核缓冲区。
  • 复制数据
    • 将数据从内核缓冲区复制到应用进程缓冲区。
  • 4. 同步I/O vs 异步I/O

    • 同步I/O操作导致进程阻塞,适用于简单场景。
    • 异步I/O不阻塞进程,适用于复杂或多任务环境。

    5. 五种I/O模型

    5.1 阻塞式I/O

    • 数据到达后用户进程阻塞等待,直到数据被复制到应用进程缓冲区。

    5.2 非阻塞式I/O

    • 数据读取循环调用recvfrom,轮询数据状态,提升读取效率。

    5.3 I/O 复用

    • 应用进程阻塞调用select/poll/epoll,检测数据到达后复制数据。

    5.4 信号驱动I/O

    • 应用进程通过信号处理函数主动读取数据,避免阻塞。

    5.5 异步I/O

    • 内核完成数据读取后通知应用进程,进程通过信号处理函数读取数据。

    6. I/O 多路复用详解

    6.1 select

    • 参数:文件描述符数组和 bitmap(1024位)。
    • 内核复制文件描述符到内核态,检测数据到达并置位 bitmap,应用进程遍历文件描述符读取数据。

    6.2 poll

    • 结构体pollfd包含事件和重置位,函数复制文件描述符到内核态,使用 revent 置位,应用进程遍历读取数据。

    6.3 epoll

    • 不需要拷贝文件描述符到内核态,优化了性能,返回数据文件描述符数量,应用进程直接处理。

    转载地址:http://ytio.baihongyu.com/

    你可能感兴趣的文章
    Neo4j(2):环境搭建
    查看>>
    nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Nessus漏洞扫描教程之配置Nessus
    查看>>
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    netsh advfirewall
    查看>>
    Netty WebSocket客户端
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0013---Channel应用案例4Copy图片
    查看>>
    Netty工作笔记0014---Buffer类型化和只读
    查看>>
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>