Function basic_concept

Source
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 |
+---------+            +-----------+

输入操作两个阶段:

  1. 进程等待内核把数据准备好;这个阶段可以阻塞也可非阻塞,设置socket属性。
    • 阻塞: recvfrom 阻塞线程直到返回数据就绪的结果。
    • 非阻塞:立即返回一个错误,轮询直到数据就绪。
  2. 从内核缓冲区向进程缓冲区复制数据。(一直阻塞)

异步I/O,recvfrom总是立即返回,两个阶段都由内核完成。

§I/O 多路复用(I/O Multiplexing )

IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄。

支持I/O多路复用的系统调用有 select/pselect/poll/epoll,本质都是 同步 I/O,因为数据拷贝都是阻塞的。 通过 select/epoll 来判断数据报是否准备好,即判断可读可写状态。