博客
关于我
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知识点记录
    查看>>
    PHP类数组式访问(ArrayAccess接口)
    查看>>
    PHP系列:浅谈PHP中isset()和empty() 函数的区别
    查看>>
    PHP索引数组unset的坑-array_values解决方案
    查看>>
    PHP索引数组排序方法整理(冒泡、选择、插入、快速)
    查看>>
    PHP线程安全和非线程安全
    查看>>
    R3LIVE开源项目常见问题解决方案
    查看>>
    php缃戠珯,www.wfzwz.com
    查看>>
    php缓存查询函数
    查看>>
    php编写TCP服务端和客户端程序
    查看>>
    php编码规范
    查看>>
    PHP编码规范-PSR1、psr2 /psr3 psr4
    查看>>
    PHP编程效率的20个要点
    查看>>
    PHP网页缓存技术优点及代码
    查看>>
    PHP自动化测试(一)make test 和 phpt
    查看>>
    php自定义函数: 文件大小转换成智能形式
    查看>>
    php英语单词,php常用英语单词,快速学习php编程英语(6)
    查看>>
    R3.4.0安装包时报错“需要TRUE/FALSE值的地方不可以用缺少值”,需升级到R3.5.0
    查看>>
    PHP获取curl传输进度
    查看>>
    PHP获取IP所在地区(转)
    查看>>