Linux Io Model

Linux Io Model

May 29, 2025

IO 的同步、异步、阻塞、非阻塞取决于相关 syscall 的实现。

用户空间获取数据前提是什么?

  1. 数据准备阶段
    • 内核准备数据,这就引出了问题,内核还没准备好数据,等(sleep)还是不等?
    • 内核没准备好数据,进程进入 sleep 状态 -> 阻塞 IO
    • 内核没准备好数据,进程不进入 sleep 状态 -> 非阻塞 IO
  2. 数据拷贝阶段
    • 数据从内核空间复制到用户空间,这就引出了问题,谁来负责复制?
    • 用户线程的内核态来负责 -> 同步 IO
    • 内核线程负责 -> 异步 IO
  3. 根据以上两大阶段理解 block/non-block sync/async

I/O 模型

Blocking I/O

阻塞

  1. 用户调用阻塞的 read 后,没有数据进程就放弃 CPU,进入阻塞状态(sleep)

Non-blocking I/O

非阻塞

  1. 用户自己去调用非阻塞的 read 轮询

I/O Multiplexing

同步非阻塞

  1. select 内核轮询,返回结果。用户再遍历获取哪些 IO ready。
  2. epoll

Signal-Driven I/O

信号驱动 SIGIO 只有一种状态

 kill -l | grep SIGIO
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR

Asynchronous I/O

异步

References

  1. 内核角度看 I/O 模型-强烈推荐
  2. syscall 分类
Last updated on