网络编程的5个IO模型

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值