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之前,数千、数万个客户端来连你的服务器,你的服务器会怎么个死法。
这么简单的道理,自己多想一想。
分享到:
相关推荐
ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。ByteBuffer是一个字节缓冲区,可以存储字节序列。在NIO中,所有的数据读写都通过缓冲区进行,ByteBuffer与其他类型的Buffer...
java学习笔记1(java io/nio)设计模式
### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...
Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一组新的I/O API,它提供了一种不同于传统IO的高效、非阻塞的I/O操作方式。NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统...
Java NIO,全称Non-Blocking Input/Output,是非阻塞式输入输出,它是Java从1.4版本开始引入的一种新的I/O模型,为Java程序员提供了处理I/O操作的新方式。NIO的主要特点是其能够使Java程序以更有效的方式处理I/O流,...
Java NIO(New Input/Output)是Java标准库在JDK 1.4版本中引入的一个新特性,它提供了一种不同于传统IO流的高效I/O处理方式。NIO的核心概念包括通道(Channel)和缓冲区(Buffer),这两个组件使得数据以块的形式...
自己总结的java中NIO的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
**NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与传统I/O不同的数据处理方式。在传统的IO模型中,数据的读写是阻塞式的,即在读取或写入数据时,程序会暂停执行,等待数据...
《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...
这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些核心知识点的详细阐述: 1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过...
"Java超强学习笔记"显然是一份全面且深入的Java学习资料,由一位极具洞察力和组织能力的作者精心编纂。这份笔记可能包含了从基础知识到高级特性的全方位讲解,旨在帮助学习者构建坚实的Java编程基础,并提升他们的...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...
《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...
“尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...
这份《java学习》笔记包含了多个核心主题,旨在帮助初学者和有经验的开发者深入理解和掌握Java技术。 1. **正则表达式(正则.md)**: 正则表达式在Java中用于文本匹配和搜索,是处理字符串的强大工具。Java提供了...
《NIO学习笔记》 在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,与传统的BIO(Blocking I/O)相对应。NIO提供了一种新的方式来处理I/O操作,特别是在处理大量并发连接时,它的...
Java学习笔记源代码是针对清华大学出版的《Java学习笔记》一书,配套的 JDK1.5 版本的源码。这些源代码旨在帮助读者深入理解Java编程语言,通过实践来加强理论学习,提高编程技能。Java作为一种广泛使用的高级编程...
这个压缩包“Java JDK 6学习笔记.zip”显然是一个包含有关Java JDK 6深入学习资源的集合,可能是PDF文档、笔记或者其他形式的教学材料。 在Java JDK 6中,有几个关键的特性值得我们关注: 1. **改进的性能**:JDK ...