zoukankan      html  css  js  c++  java
  • NIO--1

    1.为什么不直接用jdk NIO
    (1) API繁杂
    (2) 原始NIO可靠性不是很高。可靠性包括:断开重连,网络闪断,半包读写,失败缓存
    (3) NIO 的epoll BUG会导致多路复用器Selector,空轮训,导致cpu消耗过大,在jdk1.6update18版本已修复,但是经过测试,该问题还存在,只是触发概率降低。

    2.早期的BIO缺点
    (1)没有数据缓冲区,IO性能有问题
    (2)没有C或者C++中的通道Channel(双高速写入读出)概念,只有输入和输出流 (单向)
    (3)同步阻塞io,会导致通信线程被长时间阻塞

    3. nio和BIO区别
    (1) nio数据结构上,增加了数据缓冲区,
    (2) 传统的io管首改成双通道channel
    (3) 线程模型,由同步阻塞,改为同步非阻塞,和异步非阻塞
    (4) 分发机制,加入多路复用机制,Selector
    (5)epoll多路复用机制

    4.网络linux IO模型
    (1)阻塞IO模型,拿到数据包或者发生错误,才返回,其它情况一直在等待执行。效率非常低,容易导致线程任务等待超时。(去食堂排队打饭)
    (2)非阻塞IO,应用发起一个IO操作后,不等内核IO操作完成,继续执行,内核IO操作完成后,会通知应用程序。
    老板-->让财务去银行
    老板-->去睡觉


    5.NIO类库

    (1)缓冲区,Buffer , 体现了NIO和IO的区别,是一个字节数组,增大了IO的吞吐性(类似港口),除了boolean,其余基本数据类型,都有对应的Buffer

    (2)高速通道,Channel,(类似自来水管道),每一个网络数据,都通过通道读取或写入。与流Stream不同的是,channel是双向的。业务包容性增大,减少频繁创建其它管道 。每一个客户端会用一个通道。

    (3)多路复用器,Selector,用来不断轮循注册到上面Channel,如果channel上发生的读或写事件,说明通道已就绪,就会被Selector轮循出来(NIO内部机制)

    (4)被Selector轮循出来之后,通过SelectorKey获取这些就绪通道的集合(SelectionKeys的作用)。一个多路复用器Selector,可以轮询多个通道Channel,然后进行IO操作,

    (5)jdk底层使用epoll取代了传统的select实现,优势在于,没有了最大句柄(Channel对象)1024/2048限制,所以,只需要一个线程负责,Selector

    轮循,就可以接入成千上万个客户端的接入,(这就是netty为什么这么快)


    (6) ServerSocketChannel,NIO专用的服务类,配合Channel高速通道的一个服务类。
    ServerSocket 配传统IO
    ServerSocketChannel 配Channel

    NIO工作模型

  • 相关阅读:
    40 +必不可少的前端Web开发备忘单
    web前端开发必读的HTML5的书籍
    Java String的内存机制
    使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题
    CI(CodeIgniter)的"Disallowed Key Characters."异常处理
    开源软件许可协议简介
    读《考拉小巫的英语学习日记》有感
    vi的复制、粘贴、查找、删除等常用命令
    读《马云创业启示录》有感
    jQuery ajax 同步失效?
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/7536986.html
Copyright © 2011-2022 走看看