`
sharp-fcc
  • 浏览: 106312 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

      在传统的I/O系统中,都是基于byte和流的 ,相应的i/o都是阻塞型的,所以服务器程序也采用阻塞型i/o进行读写操作,而且线程也会阻塞,系统中会有大量用于同客户端进行交互的线程,每个线程都需要较多的系统资源(内存,栈,寄存器),在不同的线程之间切换上下文是个很费时的操作,频繁的线程切换会造成系统性能的急速下降。
   

      nio特性:

      针对传统的i/o,java nio通信机制采用了基于buffer,channel,selector的机制。

      buffer(缓冲区):Buffer是个抽象类,每个基本类型都有Buffer的封装,比如说IntBuffer,他们都重写了Buffer 的方法,都包含一个数组作为当然ByteBuffer是个例外,他比较特殊,由于channel是直接对ByteBuffer进行读写的。

     Channel(通道):Channel是一个接口,功能类似于传统io中的stream,但是通道具有两面性,即可以读,也可以写。

     Selector(选择器):负责已经注册的Socket通道,提供channel的状态信息,控制各类channel协同工作。

     这三个重要的抽象定义了非阻塞套接字的工具,非阻塞io作为REACTOR模式的实现,实际上实现了事件发生,自我激活,主动通知机制。selector是实现所有非阻塞技术的主要实现,当一些有意义的事发生在通道上时,选择器便会通知应用程序处理请求。通知的方式是创建一个selectionKey的一个实例,每个关键词都保持着原有的channel和请求的类型。

     

    nio工作机制:

    nio基本思想是有事我通知你,你再去做你的事情,没事件你可以去做其他的事,nio的主线程只有一个,不像多线程,所以使得jvm更加高效,使得jvm处理数据时更加高效,在服务器中使用nio,其实就是用通过网络驱动模型实现的,我们只要将想要关注的事注册到selector,用这一个单线程来管理大量的事件,更好的利用了系统的资源,从而减少了维护系统io需要的开销,大幅度的提高了系统的性能。nio做的事很简单,就是实现的事件的收集和分发。

       打个比方,就像在一辆公交车上,原来是司机到了一站问一下,谁要下车,每个人都得保持时刻清醒,而现在的nio就相当于让每个乘客都睡觉,在睡觉前将所要到的地点告诉乘务员,乘务员在到达目的站后会唤醒乘客。    

    总结:

     好处有两点:第一个线程不在通信时阻塞了。

    第二点,Selector能够处理大量的链接,从而降低了服务器的开销。

   

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics