zoukankan      html  css  js  c++  java
  • 关于java nio在windows下实现

    java 1.4提供了nio,也就是之前我的一片博客中所说的multiplexed non-blocking I/O。这种模型比阻塞模型的并发性能要好一些,Java很多的网络应用都因此重写了底层模块,包括Tomcat、Jetty等等,也出现了基于nio的框架mina、国产的cindy等等。

    java nio带来的影响是巨大的,得到了很多拥护和赞赏。

    不过有一些是谣言,例如windows下的实现是Windows中并发性能最好的I/O模型IOCP,但事实上是这样么?

    JDK 6.0 RC版提供了源码下载,下载路径:http://www.java.net/download/jdk6/jdk-6-rc-src-b104-jrl-01_nov_2006.jar

    我们看最终Windows的实现:
    j2se\src\windows\native\sun\nio\ch\WindowsSelectorImpl.c


    82行开始:
        /* Call select */
        
    if ((result = select(0 , &readfds, &writefds, &exceptfds, tv)) 
                                                                 
    == SOCKET_ERROR) {
            
    /* Bad error - this should not happen frequently */
            
    /* Iterate over sockets and call select() on each separately */
            FD_SET errreadfds, errwritefds, errexceptfds;
            readfds.fd_count 
    = 0;
            writefds.fd_count 
    = 0;
            exceptfds.fd_count 
    = 0;
            
    for (i = 0; i < numfds; i++{
                
    /* prepare select structures for the i-th socket */
                errreadfds.fd_count 
    = 0;
                errwritefds.fd_count 
    = 0;
                
    if (fds[i].events & POLLIN) {
                   errreadfds.fd_array[
    0= fds[i].fd;
                   errreadfds.fd_count 
    = 1;
                }

                
    if (fds[i].events & (POLLOUT | POLLCONN)) {
                    errwritefds.fd_array[
    0= fds[i].fd;
                    errwritefds.fd_count 
    = 1;
                }

                errexceptfds.fd_array[
    0= fds[i].fd;
                errexceptfds.fd_count 
    = 1;

                
    /* call select on the i-th socket */
                
    if (select(0&errreadfds, &errwritefds, &errexceptfds, &zerotime) 
                                                                 
    == SOCKET_ERROR) {
                    
    /* This socket causes an error. Add it to exceptfds set */
                    exceptfds.fd_array[exceptfds.fd_count] 
    = fds[i].fd;
                    exceptfds.fd_count
    ++;
                }
     else {
                    
    /* This socket does not cause an error. Process result */
                    
    if (errreadfds.fd_count == 1{
                        readfds.fd_array[readfds.fd_count] 
    = fds[i].fd;
                        readfds.fd_count
    ++;
                    }

                    
    if (errwritefds.fd_count == 1{
                        writefds.fd_array[writefds.fd_count] 
    = fds[i].fd;
                        writefds.fd_count
    ++;
                    }

                    
    if (errexceptfds.fd_count == 1{
                        exceptfds.fd_array[exceptfds.fd_count] 
    = fds[i].fd;
                        exceptfds.fd_count
    ++;
                    }

                }

            }

        }
                

    这就是广泛应用在Winsock中使用的select模型,也众所周知,并发性能不是很好。而且FD_SETSIZE不能超过Windows下层提供者的限制,这个限制通常是1024。也就是说Windows下,JDK的nio模型,不能超过1024个连接,这个跟我之前做的测试结果相似。

    而且,如果FD_SETSIZE很大的话,例如是1000,调用select之前,必须设置1000个socket,返回之后又必须检查这1000个socket。

    也就说,Windows下使用SUN JDK java的nio,并不能提高很好的并发性能。


    温少的日志 2006-11-22 00:35 发表评论
  • 相关阅读:
    BZOJ1233 干草堆
    POJ1321棋盘问题【搜索】
    1008
    10.2训练赛
    2014 ACM/ICPC Asia Regional Shanghai Online【未完成】
    hdu5045||2014 ACM/ICPC Asia Regional Shanghai Online【数位dp】
    0926
    poj1007【求逆序数】
    hlg1287数字去重和排序II【hash】
    hlgChocolate Auction【并查集】
  • 原文地址:https://www.cnblogs.com/jobs/p/568023.html
Copyright © 2011-2022 走看看