【笔记】常见的 IO 模型 & 同步和异步 & 阻塞和非阻塞

以前经常听说 IO 模型,同步和异步以及阻塞和非阻塞概念,往往是不知所云,这里刚好读书看到了,就摘录到这里,方便日后参考。

常见的 IO 模型

  • 同步阻塞 IO (Blocking IO)
    • 传统的 IO 模型
  • 同步非阻塞 IO (None-blocking IO)
    • 默认创建的 IO 都是阻塞的,非阻塞 IO 要求 socket 被设置为非阻塞 NONBLOCK
  • IO 多路复用(IO multiplexing, 即为经典的 REACTOR 模型。
    • IO 多路复用会用到 select , poll, epoll 函数,这几个函数也会使进程阻塞,但和阻塞 IO 不同的是,这 2 个函数可以同时阻塞多个 IO 操作。而且可以同时对多个读操作或写操作的 IO 函数进行检测,直到有数据可读或者可写时,才真正进行 IO 操作函数调用
  • 异步 IO
    • 即为经典的 Proactor 设计模式,也成为异步非阻塞 IO, 除了异步 IO 外,其他三个都是同步 IO

同步和异步

同步和异步的概念描述的是用户线程和内核的交互方式. 同步是指用户进程发起 IO 请求后需要等待或者轮询内核 IO 操作完成后才能继续执行。 异步是指用户线程发起 IO 操作后继续执行,当内核 IO 完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞和非阻塞

描述的是用户线程调用内核 IO 的操作方式。阻塞是指 IO 操作要彻底完成后才返回到用户空间。

非阻塞是指 IO 操作调用后立即返回给用户一个值,无需等到 IO 操作彻底完成。


参考书籍: 《PHP核心技术与最佳实践(第2版)