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

    你可能感兴趣的文章
    PHP mongoDB 操作
    查看>>
    ReentrantLock读写锁
    查看>>
    ReentrantLock的公平锁与非公平锁
    查看>>
    php mysql procedure获取多个结果集
    查看>>
    php mysql query 行数,PHP和MySQL:返回的行数
    查看>>
    php mysql session_php使用MySQL保存session会话
    查看>>
    PHP mysql_real_escape_string() 函数防SQL注入
    查看>>
    php mysql优化方法_MySQL优化常用方法
    查看>>
    PHP OAuth 2.0 Server
    查看>>
    php odbc驱动,php常用ODBC函数集(详细)
    查看>>
    php openssl aes ecb,php openssl_encrypt AES-128-ECB iOS
    查看>>
    php paypal rest api,PayPal REST API指定网络配置文件PHP
    查看>>
    php pcntl 多进程学习
    查看>>
    PHP pcntl_fork不能在web服务器中使用的变通方法
    查看>>
    php private ,public protected三者的区别
    查看>>
    php PSR规范
    查看>>
    php rand() 重复,array_rand()函数从另外一个数组中随机取得的一定数量的数组的元素是否会重复?...
    查看>>
    php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
    查看>>
    php redis 集群扩展类文件
    查看>>
    php redis(2)
    查看>>