高性能IO模型

常见的IO模型

  1. 同步阻塞IO(Blocking IO) :传统的IO类型

  2. 同步非阻塞IO(Non-blocking IO):默认创建的scoket都是堵塞的,非堵塞IO要求socket被设置为NONBLOCK.

  3. IO多路服用(IO Multiplexing):经典的Reactor设计模式,异步阻塞IO,java中的Selector和Linux的epoll都是这种模型.

  4. 异步IO(AIO): 经典的Proactor设计模式,也称为异步非堵塞IO.

同步和异步

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

堵塞和非堵塞

堵塞和非堵塞的概念描述的是用户线程调用内核IO操作方式:堵塞是指IO操作需要彻底完成后才返回到用户空间;而非堵塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成.

同步堵塞IO

同步堵塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时候是堵塞的.

bio

如上图所示,用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间.内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作.

这个过程伪代码描述

1
2
3
4
{
read(scoket,buffer)
process(buffer)
}

用户需要等待read将socket中的数据读取到buffer后,才继续处理接收的数据,整个IO请求的过程中,用户线程是被堵塞的,这导致用户在发起IO请求时,不能做任何操作,对CPU的资源利用率不够.

同步非堵塞IO

IO多路复用

异步IO