2018-01-29
一、基本概念:
同步与异步
区别:多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。
阻塞与非阻塞:
区别:当发出请求一个操作时,如果条件不满足,是会一直等待还是返回一个标志信息
阻塞IO:当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。
非阻塞IO: 当用户线程发起一个read操作后,它马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。
所以在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。
同步IO 与 异步IO
区别:同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。
同步io:如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程。
异步io:IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。(这个阶段,用户线程可以干其他的事。)
Note:注意同步IO和异步IO,与阻塞IO和非阻塞IO是不同的两组概念。
二、五个io模型(from Unix网络编程)
阻塞io(前述)
非阻塞io(前述)
多路复用io(nio就是这种)
信号驱动io
异步io(最理想的io模型)
参考
来源:https://www.cnblogs.com/kirito-c/p/10306234.html