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

nio和io的服务器端比较

    博客分类:
  • J2SE
阅读更多



 1.) io:

传统的io,JDK1.4以前:
即当程序执行输入/输出操作后,在这些操作返回之前会一直阻塞该线程,
所以服务器必须为每个客户端都提供一条独立线程进行处理(否则无法继续运行),
当服务器需要同时处理大量客户端时,这种做法会导致性能下降.(比如在单核状态下,CPU同一时刻处理一个线程).

做为服务器端,其处理结构如下图所示:



 

假设如 [jdk1.4]socket举例--基于nio 中的Server程序,有4个client同时到达,Server端accept其中1个连接,建立一个线程(A为Server主线程,B为新建的线程).

A线程继续accept,并同上处理其他3个线程..这时,就新建了4个线程

B线程读取client输入(阻塞),假设这里等待了10秒,才接收到流,并处理.那么,这个线程B至少存在10秒..

我们假设程序的处理时间,接收流的时间以及创建线程的时间可以忽略不计,那么,A线程处理完全部4个请求的时间为10秒..


2.) nio

说到nio,就不得不提其的设计模式,反应器模式,其核心思想:

1).将事件多路分用
2).将事件分派到各自相应的事件处理程序

Selector 类是 Channel 的多路复用器。 Selector 类将传入客户机请求多路分用并将它们分派到各自的请求处理程序。

做为服务器端,其处理结构如下图所示:

 

假设如上文传统socket举例--基于io 中的Server程序,有4个client同时到达,Server端select其中1个连接,这里它并没有创建新的线程,而是

判断,当client有读/写操作时,在对应建立写/读操作..

好比4个人去食堂吃饭,饭菜好比流:

io做法是:4个人不停地问,我的菜好了没有(CPU的时间片)..

nio的做法是:委托另外一个人看着,当自己的好了通知自己就行(不通知自己的时候自己不做动作)..


长连接时和普通io差不多..

这样看来,nio在socket并发量大,且短连接的时候,有优势..

网上还有种说法,说nio在windows下的实现是iocp ,在linux下的实现是epoll..如果是这样,那么从底层实现来讲,nio的效率要好的多,不过我没有查阅native的c的源码..不知道这种说法是否属实,有兴趣的童鞋可以查阅下,然后给我留个言,这里先谢过了..

  • 大小: 72.1 KB
  • 大小: 81.5 KB
分享到:
评论

相关推荐

    基于事件的 NIO 多线程服务器

    基于事件的 NIO 多线程服务器

    t-io是基于aio(nio2)的网络编程框架和netty属于同类

    t-io是基于aio(nio2)的网络编程框架,和netty属于同类,但t-io更注重开发一线工程师的感受,提供...基于t-io来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、Socket将会变得空前的简单。

    java-nio.rar_NIO_java nio

    自己实现的java nio, 在客户端和服务器端都使用非阻塞io实现

    高性能IO模型浅析

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置...

    BIO,NIO,AIO,Netty面试题 35道.pdf

    BIO:同步并阻塞,服务器实现一个连接一个线程,即客户端有连接请求时服务器端就需要启动一 个线程进行处理,没处理完之前此线程不能做其他操作(如果是单线程的情况下,我传输的文件很 大呢?),当然可以通过...

    Java NIO 聊天室 JSwing

    import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels....

    基于javatcpsocket通信的拆包和装包源码-niochatroom:基于Javanio的聊天室

    群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2)实现多人群聊 3)服务器端:可以监测用户上线,离线,并实现消息转发功能 4)客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受...

    netty面试专题-答案-一起学习

    BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。 伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接...

    Netty面试专题及答案.pdf

    BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接...

    高性能网络应用框架 Netty.zip

    也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,...

    高清Netty5.0架构剖析和源码解读

    传统BIO通信的弊端 在JDK 1.4推出JAVANIO1.0之前,基于JAVA 的所有Socket通信都采用 BIO 了同步阻塞模式( ),这种一请求一应答的通信模型简化了上层的应用开发, 但是在可靠性和性能方面存在巨大的弊端。...

    JAVA_API1.6文档(中文)

    javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据...

    JDK_API_1_6_zh_CN_downcc.com.zip 良心一级分

    java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理...

    learn-mina-the-hard-way

    learn mina the hard way Java NIO java NIO 和阻塞I/O的区别及各自的优缺点? 参见资料,, I/O通信模型(5种) java NIO服务端和客户端代码实现 ... - 服务器端和客户端的read方法都不为空,就会一直的交互下去. 参见

    JDK_1_6 API

    javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据...

    java api最新7.0

    javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型...

    java jdk-api-1.6 中文 chmd

    javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据...

    JavaAPI1.6中文chm文档 part1

    javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据...

    JavaAPI中文chm文档 part2

    javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据...

Global site tag (gtag.js) - Google Analytics