Linux Io Model
Linux Io Model
May 29, 2025
IO 的同步、异步、阻塞、非阻塞取决于相关 syscall 的实现。
用户空间获取数据前提是什么?
- 数据准备阶段
- 内核准备数据,这就引出了问题,内核还没准备好数据,等(sleep)还是不等?
- 比如内核
sock
的 sk_receive_queue 没有数据
- 比如内核
- 内核没准备好数据,进程进入 sleep 状态 ->
阻塞 IO
- 内核没准备好数据,进程不进入 sleep 状态 ->
非阻塞 IO
- 内核准备数据,这就引出了问题,内核还没准备好数据,等(sleep)还是不等?
- 数据拷贝阶段
- 数据从内核空间复制到用户空间,这就引出了问题,谁来负责复制?
- 比如内核
sock
的 sk_receive_queue 的数据由谁来复制到用户空间
- 比如内核
- 由
用户线程
的内核态来负责 ->同步 IO
- 由
内核线程
负责 ->异步 IO
- 数据从内核空间复制到用户空间,这就引出了问题,谁来负责复制?
- 根据以上两大阶段理解 block/non-block sync/async
I/O 模型
Blocking I/O
阻塞
- 用户调用阻塞的
read
后,没有数据进程就放弃 CPU,进入阻塞状态(sleep)
Non-blocking I/O
非阻塞
- 用户自己去调用非阻塞的
read
轮询
I/O Multiplexing
同步非阻塞
Signal-Driven I/O
信号驱动 SIGIO 只有一种状态
kill -l | grep SIGIO
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
Asynchronous I/O
异步
References
Last updated on