I/O 模型

2018-01-29

一、基本概念:

同步与异步

区别:多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。

阻塞与非阻塞:

区别:当发出请求一个操作时,如果条件不满足,是会一直等待还是返回一个标志信息

  1. 阻塞IO:当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。

  2. 非阻塞IO: 当用户线程发起一个read操作后,它马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。

所以在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。

同步IO 与 异步IO

区别:同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。

  1. 同步io:如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程。

  2. 异步io:IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。(这个阶段,用户线程可以干其他的事。)

Note:注意同步IO和异步IO,与阻塞IO和非阻塞IO是不同的两组概念。

二、五个io模型(from Unix网络编程)

  1. 阻塞io(前述)

  2. 非阻塞io(前述)

  3. 多路复用io(nio就是这种)

  4. 信号驱动io

  5. 异步io(最理想的io模型)

参考

原文地址:https://www.cnblogs.com/kirito-c/p/10306234.html