`
QING____
  • 浏览: 2231027 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NIO中Channel.spi学习

 
阅读更多

一.channel.spi底层实现我们首先看看SelectorProvider:
SelectorProvider提供了通过底层输出各种NIO实现的接口:

  • public abstract DatagramChannel openDatagramChannel():创建并打开一个DatagramChannel...DatagramChannel.open()方法调用.
  • public abstract SocketChannel openSocketChannel():创建并打开一个SocketChannel,SocketChannel.open()方法调用
  • public abstract ServerSocketChannel openServerSocketChannel():由ServerSocketChannel.open()方法调用
  • public abstract SocketChannel openSocketChannel():由SocketChannel.open()方法调用.
  • public abstract Pipe openPipe():由Pile.open()调用
  • public abstract AbstractSelector openSelector():此方法由Selector.open()调用
  • public static SelectorProvider provider():获得当前应用所使用的provider;不同的OS,对IO Selector模型各不相同,JAVA API中也提供了与其适配的provider,那么对provider的选择是怎么做的呢?在静态方法provider中执行如下:
  1.  如果系统定义了"java.nio.channels.spi.SelectorProvider"参数,例如-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider,那么系统将会加载并使用此provider.(loadProviderFromProperty()).
  2. 如果对系统类加载器可见的jar文件中安装了provider,并且jar文件包含资源目录META-INF/services中名为java.nio.channels.spi.SelectorProvider的提供者配置文件,则遍历provider列表,并加载和初始化第一个类名称.
  3. 如果上述,都不能获得provider,将会通过DefaultSelectorProvider.create()获得结果.前两步均可以被应用开发者所操作.对于3)返回的结果可能在不同的JDK版本下有所不同.
/////代码样例(来自openJDK)
public static SelectorProvider create() {
      PrivilegedAction pa = new GetPropertyAction("os.name");
      String osname = (String) AccessController.doPrivileged(pa);
      if ("SunOS".equals(osname)) {//1、如果SunOS
          return new sun.nio.ch.DevPollSelectorProvider();
      }
      //2、Linux 内核>=2.6
      // use EPollSelectorProvider for Linux kernels >= 2.6
      if ("Linux".equals(osname)) {
          pa = new GetPropertyAction("os.version");
          String osversion = (String) AccessController.doPrivileged(pa);
          String[] vers = osversion.split("\\.", 0);
          if (vers.length >= 2) {
              try {
                  int major = Integer.parseInt(vers[0]);
                  int minor = Integer.parseInt(vers[1]);
                  if (major > 2 || (major == 2 && minor >= 6)) {
                      return new sun.nio.ch.EPollSelectorProvider();
                  }
              } catch (NumberFormatException x) {
                  // format not recognized
              }
          }
      }
      return new sun.nio.ch.PollSelectorProvider();
}

 
可以简单归纳如下:在Solaris系统下将会使用DevPollSelectorProdiver;在Linux系统下(2.6+版本),将会使用EPollSelectorProvider;否则将会使用PollSelectorProvider.对于SunJDK,DefaultSelectorProvider将直接返回WindowsSelectorProvider.这是一种基于Poll机制.


二.多路IO复用模型:

目前广泛支持的多路IO复用模型:epoll,poll,devpoll,select.

  1. select:同步IO,目前已经不能再被推荐使用.缺点:单个进程能够监视(打开)的FD(文件描述符)的个数是有最大限制的(2048);select需要复制大量的句柄数据结构,产生巨大的开销;应用程序需要遍历句柄列表才能知道哪个句柄(socket)发生了事件.
  2. epoll:一种被认为性能最好的IO多路复用模型.这是一种异步IO,它能在大量并发连接环境中,显著提高性能.因为它互惠复用文件描述符集合来传递结果而迫使开发者每次都必须重新准备要被侦听的文件描述符集合,另一点原因是,获取事件时无需遍历整个被侦听的描述符集,而只需要遍历那些被内核IO事件异步唤醒加入Ready队列的描述符集合就行了.(事件可以被水平触发/边缘触发)
  3. 因为IO模型存在历史原因,它所涉及到的内容相当复杂,我们到此为止吧.
分享到:
评论

相关推荐

    xnio-nio-3.8.0.Final-API文档-中英对照版.zip

    赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    xnio-nio-3.8.4.Final-API文档-中英对照版.zip

    赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    xnio-nio-3.8.0.Final-API文档-中文版.zip

    赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    xnio-nio-3.8.4.Final-API文档-中文版.zip

    赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Java IO, NIO and NIO.2(Apress,2015)

    Finally, you'll discover NIO.2's offerings in terms of an improved file system interface, asynchronous I/O, and the completion of socket channel functionality. After reading and using thi book, you'...

    httpcore-nio-4.3.jar包

    用Java实现非阻塞通信 ,用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式。 httpcore-nio-4.3.jar包

    Java IO, NIO and NIO.2 原版pdf by Friesen

    New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...

    Java IO, NIO and NIO.2

    这是一本介绍java io以及nio相关知识的书,书中对知识的讲解通俗易懂,是学习java nio以及复习java io相关知识的必备书籍。注意:本书为英文版!!!

    NIO项目源码.zip

    NIO项目源码.zip

    基于Java NIO实现五子棋游戏.zip

    基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...

    Apress.Pro.Java.7.NIO.2.2011

    Apress.Pro.Java.7.NIO.2.2011

    Java NIO 中文版.rar

    Java NIO 中文版.rar

    httpcore-nio-4.4.13.jar

    java运行依赖jar包

    Pro Java 7 NIO.2.pdf

    Pro Java 7 NIO.2.pdf,2011 by Anghel Leonard

    httpcore-nio-4.4.9.jar

    httpcore-nio-4.4.9.jar

    Java.nio 与Java.io比较

    Java.nio 与Java.io比较

    httpcore-nio-4.4.11.jar

    java运行依赖jar包

    nio+Future.rar

    nio+Future.rar

    httpcore-nio-4.4.6.zip

    httpcore-nio-4.4.6.zip包含了httpcore-nio-4.4.6.jar包。 欢迎大家下载,大家也可关注我的博客,欢迎一起交流,如有疑问请留言!

Global site tag (gtag.js) - Google Analytics