zoukankan      html  css  js  c++  java
  • 个人BIO、NIO、AIO学习

    网络上关于讲解三种通信方式的文章合起来看总有矛盾之处,看了好几篇都觉得不能理解,读的时候也知道了这三种通信涉及了很多linux OS方面的知识(我并不理解),所以基于大手子的资料,加深记忆,我只能做一些概念上的总结,其实我这个人比较相信书本的,尤其是外国的,所以参考的文章可能出错,不可尽信,有差错也希望大手子看到能提点我 

    贴上一些参考的文章

    1、如何深刻理解reactor和proactor?:https://www.zhihu.com/question/26943938

    2、聊聊BIO,NIO和AIO (1):https://www.jianshu.com/p/ef418ccf2f7d 

    3、Netty序章之BIO NIO AIO演变(Java代码实例):https://segmentfault.com/a/1190000012976683

     

    怎样理解网络IO中的阻塞非阻塞与同步异步的区别?

    可以去读UNIX网络编程P122页开始的一章说的非常清楚

    BIO:阻塞IO,一直阻塞直到有数据报来,从内核复制到进程之后才开始处理数据

    NIO:非阻塞IO,会反复有没有问数据报来(立即返回),有了才开始复制到进程,复制完才处理数据

    AIO:异步IO,通知内核如果有数据来了,内核复制完成之后,再叫我处理数据

     拿吃饭做比喻,现在11点,妈妈煮饭,饭还没来,流程如下

    BIO:我一直站在厨房看着电饭煲看她做饭,做完了,妈妈把饭盛出来,我吃饭

    NIO:我会隔五分钟问一句妈妈饭有没有煮好,做完了,妈妈把饭盛出来,我吃饭

    AIO:我跟妈妈说你做完了饭帮我把饭盛好放桌子上叫一声我就来吃,然后我就去敲代码了,饭熟了妈妈把饭盛好了,叫我,我吃饭。

    via 必看:怎样理解阻塞非阻塞与同步异步的区别?大姚灵剑的回答——https://www.zhihu.com/question/19732473

                   为什么NIO被称为同步非阻塞? 祖春雷回答——https://www.zhihu.com/question/56673416

     

    Reactor、Proactor是什么?

    两种基于IO复用的设计模式(关于IO复用可以看文章《聊聊BIO,NIO和AIO 》),Reactor需要select,poll,epoll,kqueue(按效率排序,操作系统层面的调用支持),Proactor需要iocp的支持(linux用epoll模拟异步),前者为同步IO,后者为异步IO,不太了解,既然是设计模式,抽象程度比较高,可以先放着。

    以Java的 API 为例

    BIO

    Blocking IO,字面意思阻塞IO,比如用ServerSocket的accpet获取连接,不用想都是同步阻塞的,当拿到流对象时进行IO请求(read)时,如果没有数据到来,方法是阻塞的,且如果是阻塞IO的那么必定是同步IO(这句话看不懂可以先放着,同步表示,内核的缓冲区复制到进程缓冲区阶段发生在IO请求的执行过程中,如果看完了知乎的两个答案应该能理解),一般用线程池和连接绑定,线程太多又没有实际的数据到来,光维持连接线程都会爆炸,所以发展处NIO

    NIO

    Non-Blocking IO ,字面意思不阻塞IO,如何做到不阻塞?循环询问是否有没有数据到达,可以类比为锁里的tryLock方法,这样就可以算作非阻塞了,但这样很傻比,因为你需要不断地重复问一个线程同样的问题直到他有数据了,

    所以延伸出IO复用机制,用一个监听复用器去轮询注册在其上的Socket Channel,并把数据和IO操作封装为事件,当有事件就绪时,再传递给线程执行我们的IO请求(read),这样可以做到几个线程的就可以管理很多的Socket,并且保证了当执行IO请求时,数据已经存在,线程并不会阻塞。

    这里可以看到,IO操作不会阻塞,得益于 IO复用机制 把BIO的 IO阻塞时间成本 优化并提前至轮询阶段,并且NIO还是同步的,因为内核的缓冲区复制到进程缓冲区阶段仍发生在IO请求的执行过程中,轮询间隔和同步造成的一些费用仍然是个问题。

    虽然不知道怎么解释,但可以这么理解,阻塞就一定同步,但不阻塞就有可能异步

    AIO

    Asynchronous IO,异步非阻塞IO,这里解决了内核的缓冲区复制到进程缓冲区的时间问题,当复制完成后才会通知线程进行处理,感觉像Ajax的回调函数,Java API AsynchronousSocketChannel和AsynchronousServerSocketChannel

    这个感觉更复杂了,所以看个大概随便写了点应付面试

    select、poll、epoll、kqueue、IOCP、Reactor、Proactor、NIO、AIO、netty有什么关系?

     select、poll、epoll、kqueue、IOCP是操作系统层面的网络模型

    Reactor、Proactor软件框架层面的设计模式

    NIO、AIO应该是根据以上两种材料,构建的软件框架模型

    netty应该就是用上面的模型实现的框架库

  • 相关阅读:
    TCP/IP学习笔记:组播
    使用WITH AS 优化SQL
    帮盖尔优化SQL子查询优化的经典案例
    帮盖尔优化SQL
    子查询里面有树形查询,子查询选择使用in/exists需要特别留意
    [Linux] 服务器性能调优(CPU绑定)
    TCP/IP学习笔记:RIP
    TCP/IP学习笔记:路由与BGP
    利用Merge代替复杂的UPDATE语句
    android开机启动流程说明
  • 原文地址:https://www.cnblogs.com/haon/p/11043260.html
Copyright © 2011-2022 走看看