您的位置:首页 > 理论基础 > 计算机网络

网络编程的5个IO模型

2016-10-18 16:26 218 查看

IO模型分类

根据Unix网络编程,主要的IO模型分为阻塞IO、非阻塞IO、信号驱动IO、IO复用、异步IO;其中前四种都是同步,只有最后一种才是真正意义上的异步IO。在理解这几种模型前,我们先要搞懂阻塞、非阻塞、同步、异步的概念。

阻塞、非阻塞、同步、异步IO

许多人对同步、阻塞概念混为一谈,包括作者之前也认为同步的就是阻塞的,阻塞的就是同步,但其实阻塞与同步是两个层面上的概念,这里详细说明。

阻塞IO和非阻塞IO:这两个概念是内核收到用户线程的IO请求时,是否立刻返回给用户线程IO结果的问题。前者内核会一直等待数据的到来,进而导致用户线程也会一直等待,直到内核返回数据;后者内核会立即返回给用户线程结果。在模型图中,对应“等待数据”这一阶段。

同步IO和异步IO:这两个概念是用户线程发出IO请求后,数据的拷贝是否需要由用户线程来完成。 前者当用户线程请求进行IO操作时,必须由用户线程将数据从内核中拷贝出来。后者当用户线程发出IO操作时,会继续执行IO操作后面的程序,内核在数据都到达后将其拷贝到用户线程中。本质:同步IO是由用户线程将数据从内核拷贝到线程中,异步IO是由内核将数据从内核拷贝到线程中,并通知线程数据已准备好。在模型图中,对应“数据拷贝”这一阶段。

网络模型图解

1.阻塞IO:当用户线程发出请求IO操作时,会在调用接口时一直等待,直到有数据返回,从图中可以看出用户线程会一直阻塞,直到内核接收到数据,并将数据拷贝到用户线程。由于阻塞IO由用户线程拷贝数据,所以是阻塞同步IO的。(有同学提出,将用户线程分为业务线程和IO处理线程,IO处理线程有结果时回调业务线程,即为非阻塞异步IO,这与IO复用模型类似,但只是伪异步,底层IO操作并不是真正意义上的异步)



2.非阻塞IO:非阻塞IO在发出请求后,可以立即得到返回结果,并通过线程反复调用IO函数来获取数据。同时非阻塞IO由用户线程拷贝数据,所以也是同步的。



3.信号驱动IO:两次调用,两次返回。可以看到用户线程在发出IO操作时内核立即返回,即非阻塞型IO,且数据的拷贝需要由用户线程本身完成,所以是同步IO,该种模型在实际中应用并不多。



4.IO复用:将多个Socket注册到一个select中,由该select来管理并执行socket的读写操作,比阻塞型IO没有什么优越性,关键是能实现单独的线程对多个Socket操作;当select管理的Socket都没有数据时,相关的所有用户线程就会阻塞在select操作上,且数据的拷贝由用户线程完成,所以为阻塞同步型IO,在实际应用中较为广泛,比较著名的是Reactor模式。(Java Nio Netty Thrift都实现了该种模型,经常有人称之为异步阻塞型服务,但我们应当明白,这里的异步不是严格意义上的IO异步,只是将应用程序中的IO操作从业务线程中分离出来,使IO操作独运行在select调用中)



5.异步IO:IO请求会立即返回,且内核在数据到达后会主动拷贝到用户线程中,是真正意义上的异步非阻塞模型,但由于需要系统级别的接口支持,编程实现较复杂,所以在实际应用中较少。



参考资料:

http://www.cnblogs.com/fanzhidongyzby/p/4098546.html

http://www.cnblogs.com/dolphin0520/p/3916526.html

http://www.cnblogs.com/duanxz/p/3696849.html

http://blog.csdn.net/yinwenjie/article/details/48274255
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程