博客
关于我
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/

    你可能感兴趣的文章
    POJ 3041 - 最大二分匹配
    查看>>
    POJ 3041 Asteroids(二分匹配模板题)
    查看>>
    Qt笔记——标准文件对话框QFileDialog
    查看>>
    poj 3083 Children of the Candy Corn
    查看>>
    POJ 3083 Children of the Candy Corn 解题报告
    查看>>
    POJ 3253 Fence Repair C++ STL multiset 可解 (同51nod 1117 聪明的木匠)
    查看>>
    Qt笔记——控件总结
    查看>>
    poj 3262 Protecting the Flowers 贪心
    查看>>
    poj 3264(简单线段树)
    查看>>
    Qt笔记——布局管理三件套分割窗口、停靠窗口和堆栈窗口
    查看>>
    poj 3277 线段树
    查看>>
    POJ 3349 Snowflake Snow Snowflakes
    查看>>
    POJ 3411 DFS
    查看>>
    poj 3422 Kaka's Matrix Travels (费用流 + 拆点)
    查看>>
    Qt笔记——官方文档全局定义(二)Functions函数
    查看>>
    POJ 3468 A Simple Problem with Integers
    查看>>
    poj 3468 A Simple Problem with Integers 降维线段树
    查看>>
    poj 3468 A Simple Problem with Integers(线段树 插线问线)
    查看>>
    poj 3485 区间选点
    查看>>
    poj 3518 Prime Gap
    查看>>