pub fn basic_concept()
Expand description
§异步 I/O 模型
§基本概念
- 同步和异步,关注的是消息通信机制。(调用者视角)
- 同步,发出一个调用,在没有得到结果之前不返回。
- 异步,发出一个调用,在没有得到结果之前返回。
- 阻塞和非阻塞,关注的是程序等待调用结果的状态。(被调用者视角)
- 阻塞,在调用结果返回之前,线程被挂起。
- 非阻塞,在调用结果返回之前,线程不会被挂起。
阻塞,与系统调用有关。
§I/O 模型
+-+ 阻 塞 I/O (BIO)
|
+-+ 非 阻 塞 I/O (NIO)
|
+----+ 同 步 I/O +--+
| |
| +-+ I/O 多 路 复 用
| |
| +-+ 信 号 驱 动 I/O
I/O 模 型 +---+
|
|
| +-+ Linux (AIO)
| | (io_uring)
+----+ 异 步 I/O +--+
|
+-+ windows (IOCP)
§同步阻塞I/O (blocking I/O)
Application kernel
+---------+ +-----------+ +---+
| | syscall | no | |
| Read | +--------> | datagram | |
| recvfrom| | ready | |
| | | + | +-+ wait for
| | | | | +-+ data
| | | v | |
| | | datagram | |
| | | ready | +---+
| | | |
| | | copy | +---+
| | | datagram | |
|process | | + | +-+ copy data
|datagram | return | | | +-+ from kernel to user
| | <--------+ | v | |
| | | copy | +---+
| | | complete |
+---------+ +-----------+
输入操作两个阶段:
- 进程等待内核把数据准备好;这个阶段可以阻塞也可非阻塞,设置socket属性。
- 阻塞: recvfrom 阻塞线程直到返回数据就绪的结果。
- 非阻塞:立即返回一个错误,轮询直到数据就绪。
- 从内核缓冲区向进程缓冲区复制数据。(一直阻塞)
异步I/O,recvfrom总是立即返回,两个阶段都由内核完成。
§I/O 多路复用(I/O Multiplexing )
IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄。
支持I/O多路复用的系统调用有 select/pselect/poll/epoll,本质都是 同步 I/O,因为数据拷贝都是阻塞的。 通过 select/epoll 来判断数据报是否准备好,即判断可读可写状态。