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

    你可能感兴趣的文章
    Python基础之(一)基本数据类型
    查看>>
    Python基础【os】
    查看>>
    Python基础——面向对象
    查看>>
    Python基础——线程锁
    查看>>
    python基础——线程与进程
    查看>>
    Python基础——构造方法和特殊成员方法
    查看>>
    Python基础——多线程值从Thread类继承
    查看>>
    Python基础——多线程之信号量
    查看>>
    Python基础——_thread多线程
    查看>>
    Python基础——Thread类与线程对象
    查看>>
    Python基础——Thread创建管理多线程
    查看>>
    Python基础——SQLite数据库基本操作
    查看>>
    Python基础——MySQL数据库基本操作
    查看>>
    Python基础_列表 list
    查看>>
    python系列【仅供参考】:python异步库调用gevent和asyncio对比
    查看>>
    python基础3
    查看>>
    Python基础08 面向对象的基本概念
    查看>>
    Python基础-函数篇
    查看>>
    python基础---->常用模块
    查看>>
    Python基础(2):控制结构
    查看>>