jdon看到的一篇帖子。现记录如下。
问题:
很简单 100个请求过来了,每个请求都会有三个事件 ,accept,read write ,如果只有一个主线程轮询,每遍历到一个事件都得线性的去处理他,等处理完了再处理第二个事件,如果有个write的写操作要写很多数据,那也得等这个 write写完了再处理下一个, 要改善这种情况,还得用一个新线程去处理,或是线程池任务队列之类的处理也好,这样就不至于非得等到上一个事件处理完,那这样又回到了之前的阻塞 socket多线程处理用户请求的模式了,
非阻塞,非阻塞其实就是channel的write和read不会阻塞,读不到或是写不出去方法会马上返回,但是如果你能读有能写,但是得花时间读写呢,我想这样其实和单线程处理所有请求的情况一样了吧 。
评论1:
Threaded vs Evented Servers
在服务器端,目前共有两种方法处理并发请求:
(1)Threaded线程类服务器是使用多个并行线程来处理请求,每个线程处理一个客户端请求,典型的是J2EE或JavaEE服务器。
(2)Evented事件类服务器则是循环运行一个事件,用来处理所有连接客户端信息。
线程类服务器受限于CPU和线程界限,而事件类服务器并不受限于线程方面约束,因为它只用一个线程,只是受限于CPU能力。
文章对多个情况下两种模式性能比较,当我们需要执行一个后台服务,有高延迟high-latency(无高一致性要求场合),那么事件类服务器模式的性能要好些。
最后一个测试情况是long polling客户端,客户端发出长时间拉请求,也就是通常的AJAX发出的异步请求,事件类服务器模式要更好些。
转贴这篇文章想说明的是:jdonframework的domain events采取的是Evented事件类服务器模式,这种模式非常适合AJAX发出的轮询或高延迟的异步请求,这种模式对CPU负载低,不象传统同步多线程模式会Block堵塞住CPU。
适合事件类服务器模式是一些无需分享状态的应用,或者对状态的一致性要求比较低的应用,或者可以说对状态高一致性要求的避免使用事件类服务器模式。
评论2:
>>非阻塞,非阻塞其实就是channel的write和read不会阻塞,读不到或是写不出去方法会马上返回,但是如果你能读有能写,但是得花时间读写呢,我想这样其实和单线程处理所有请求的情况一样了吧 。
首先如果有读有写,还得花时间读写呢?这个是同步IO和异步IO的问题,异步IO可以不让应用程序关心怎么读写数据,只需要传递内存缓存区给内核就OK了,内核负责读取,但是目前JAVA的IO都是同步IO,NIO属于同步非阻塞IO。
至于非阻塞IO肯定是有好处,比如在使用同步阻塞IO的时候,因为线程是一种很昂贵的资源,如果每一个请求过来,都分配一个线程处理的话,就会因为某些任务的阻塞,而使得线程处于阻塞状态,而如果有一个线程专门负责轮训的话,这样所有真正实现读写操作的线程就不会阻塞,每次都是可读或者可写的时候,才会真正的将channel与线程关联,从而不会占用宝贵的系统资源而啥都不干,这样线程花的时间都是真正读取和写入数据的时间了,而取消了阻塞的时间,这样在系统资源一定的情况下,会更好的榨取CPU的性能。
另外JAVA7好像要支持异步IO,而异步非阻塞IO,更本不用应用关系如何读取数据,有内核来完成,但是这也需要操作系统从底层支持异步IO,不过我们可以通过Proactor来模拟异步IO的实现。
评论3:
NIO解决的问题
线程过多时,对系统资源的过度占用比单线程循环处理的代价更高时的一种权衡
不是NIO就比IO好,存在一个临界值
1、响应时间
2、资源点用
3、变量控制
三个指标的权衡,找到临界值,选择处理方式
评论4:
设想一下没有NIO之前,数千、数万个客户端来连你的服务器,你的服务器会怎么个死法。
这么简单的道理,自己多想一想。
分享到:
相关推荐
java NIO的基本知识点学习笔记,不包含具体代码
javaNIO学习笔记(csdn)————程序
java学习笔记1(java io/nio)设计模式
NULL 博文链接:https://zheng12tian.iteye.com/blog/1094811
IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的... (c 的 printf scanf,java 的面向对象封装 )
Nio学习笔记
Contents: 1 核心概念以及基本读写 2 缓冲区的实现机制 3 连网与异步IO 4 分散和聚集IO 5 文件锁定
自己总结的java中NIO的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
尚硅谷java教程全程跟听,手动整理,从面向对象开始按章节按课时整理,适合对照视频作为笔试使用/java知识脉络梳理/八股理解背诵
JAVA学习笔记,包含JAVA编程思想,JAVA多线程设计模式,JAVA网络编程,以及JAVA NIO,适合初学者学习JAVA语言及项目开发模式
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
java_Java_学习笔记.pdf Java_Performance.pdf java代码效率优化.docx Java内存模型的历史变迁.docx Java在游戏服务器开发中的应用.docx java基础总结大全.txt Java开发与技术挑战——关于技术的技术思考.docx Java...
Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...
1.学习时的一个聊天室程序,将服务端改为NIO机制 2.支持多人同时在线局域网聊天 3.知识面:JSwing,NIO,消息包加密,解密,单列模式的线程安全机制等.
学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,及时得到文章推送,谢谢支持。 说明:如无特别说明,所有代码都基于JDK8 JavaSE(Java基础) Java Core 关键字 synchronized...
丰富的MINA实例介绍,java NIO 学习,mina快速入门宝典
java_Java_学习笔记.pdf Java_Performance.pdf java代码效率优化.docx Java内存模型的历史变迁.docx Java在游戏服务器开发中的应用.docx java基础总结大全.txt Java开发与技术挑战——关于技术的技术思考.docx Java...
未来会详细整理到javaNIO基础前置笔记网上搜集。 网上搜集网上搜集停止更新,还是官方文档好用网上搜集基础上进行补充整理网上搜集基础上进行补充整理网上搜集基础上进行补充整理网上搜集待整理进行中数据库笔记...
Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助...它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
Java 的学习笔记和整理的知识点,包含Java语言基础、Java服务端方向的框架、设计模式、计算机网络、算法、Java 虚拟机和数据库等多个方面的内容。想了解前端的内容参考,Android相关的内容参考。 目录结构 语言基础...