xd96dx Docs
  • c/c++
    • 网络编程
      • linux 网络
        • linux 网络io模型
        • Signal-Driven I/O Model(信号驱动)
        • Asynchronous I/O Model(异步IO)
      • IO多路复用
        • select 示例
        • poll 示例
        • epoll 示例
      • Reactor实例之 muduo 源码分析
    • stl实现
      • 容器(Containers)
        • Vector(动态数组)
        • List(双向链表)
        • Deque(二级动态数组)
  • 游戏开发
    • skynet 从demo到源码
      • server-client demo
      • skynet 源码分析-启动流程之初始化
      • skynet 源码分析-启动流程之创建service
      • skynet 源码分析-启动流程之线程池启动
Powered by GitBook
On this page
  • 1. 阻塞IO(Blocking I/O)
  • 2. 非阻塞IO(Non-blocking I/O)
  • 3. IO多路复用(I/O Multiplexing)
  • 4. 信号驱动I/O(Signal-driven I/O)
  • 5. 异步IO(Asynchronous I/O)
  1. c/c++
  2. 网络编程
  3. linux 网络

linux 网络io模型

Previouslinux 网络NextSignal-Driven I/O Model(信号驱动)

Last updated 4 months ago

1. 阻塞IO(Blocking I/O)

特点: 进程发起IO请求后,一直阻塞等待内核返回结果

过程:

  1. 用户线程发起系统调用(如read),进入内核

  2. 内核等待数据准备就绪

  3. 数据准备就绪后,内核将数据拷贝到用户空间

  4. 系统调用返回,用户线程开始处理数据

2. 非阻塞IO(Non-blocking I/O)

特点: I/O操作不会阻塞进程,如果数据未准备好,系统会立即返回错误,进程可以选择继续执行其他任务或稍后再试

过程:

  1. 用户线程发起系统调用,设置文件描述符为非阻塞

  2. 内核立即返回,不管数据是否准备就绪

  3. 用户线程需要不断地发起系统调用,检查数据是否就绪

3. IO多路复用(I/O Multiplexing)

特点: 通过select、poll、epoll等系统调用,允许一个线程/进程同时监听多个文件描述符,当某个文件描述符准备就绪时,系统会通知应用程序去处理

过程:

  1. 用户线程将多个文件描述符注册到内核

  2. 内核监控这些文件描述符

  3. 当某个文件描述符就绪时,内核通知用户线程

  4. 用户线程对就绪的文件描述符进行读写操作

示例: IO多路复用

4. 信号驱动I/O(Signal-driven I/O)

特点: 进程发起IO请求后,既不阻塞,也不需要不断地检查IO操作是否就绪,内核完全负责IO操作,当I/O操作准备好时,内核通过信号通知进程

过程:

  1. 用户线程发起系统调用,请求内核在IO操作就绪时发送信号

  2. 内核继续执行,当IO操作就绪时,发送信号给用户线程

  3. 用户线程收到信号后,再发起系统调用进行实际的IO操作

示例: Signal-Driven I/O Model(信号驱动)

5. 异步IO(Asynchronous I/O)

特点: 进程发起I/O操作后,不会等待I/O完成,而是继续执行其他任务。当I/O操作完成时,内核通过回调机制通知应用程序

过程:

  1. 用户线程发起IO请求

  2. 内核完全负责IO操作,包括数据传输

  3. 当IO操作完成后,内核通知用户线程

示例: Asynchronous I/O Model(异步IO)

阻塞io
非阻塞io
I/O Multiplexing Model