IO五种模型

BIO(同步阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞)

  1. 阻塞IO(BIO):IO请求发出去后同步等待kernel的返回结果,直到结果返回或者异常。中间用户线程处于阻塞等待状态。默认socket都是阻塞的。
  2. 非阻塞IO(NIO):IO请求发出去后,马上得到kernel的返回结果。可能是正常,或者是异常。用户线程可以重复请求或者去做其他事情。
  3. 多路复用IO:用一个或一组线程处理多个IO操作。有三种模式select、poll、epoll。Java中的Selector和Linux中的epoll都是这种模型。
  4. 信号驱动IO:IO请求发出去后,等待kernel的返回信号。中间可以做其他事情,等到信号返回后,需要调用信号中定义的函数获取数据。
  5. 异步IO(AIO):需要系统aio_*系列的内核接口支持。用户调用kernel的aio_read接口后,由kernel自己负责把数据copy到用户空间,然后告诉用户数据准备好了。

同步和异步:描述用户线程和kernel的交互方式,同步是指用户线程发起IO请求后需要获取到本次请求的结果;而异步是指用户线程发起IO请求后仍继续执行,不需要获取最终结果。当内核IO操作完成后会调用用户线程注册的回调函数通知用户。

阻塞和非阻塞:描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作时用户线程是阻塞的,不能做其他事情;而非阻塞是指IO操作是由kernel异步执行的,请求发出去后用户线程不需要等待IO完成,等kernel把数据copy到用户空间后,会通知用户数据准备完成。

你可能感兴趣的:(知识整理,nio,aio,bio)