- 浏览: 2181789 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
nio(new io)
同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写)。
异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API)。
阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回)。
非 阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去 (使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)。
一、IO NIO AIO
io、nio、aio的区别,类似于resin、apache、nginx在io处理上的区别,从多线程互不干扰的阻塞式执行(resin),到轮询式的同步非阻塞式(apache),再到异步非阻塞式(nginx)。
现在这三种io都在jdk中予以了支持。
1、IO (BIO)
同步并阻塞,服务器实现模式为一个连接一个线程,每个线程亲自处理io并且一直等待io的完成,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
IO的局限:IO是面向流的,阻塞式的,串行的一个过程。对每一个客户端的socket连接,IO都需要一个线程来处理,而且在此期间,这个线程一直被占用,直到socket关闭。在这期间,tcp的连接、数据的读取、数据的返回都是被阻塞的。也就是说这期间大量的浪费了cpu的时间片和线程占用的内存资源。
每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很 简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。
2、NIO (new IO) 从jdk1.4开始
同步非阻塞,服务器实现模式为一个请求一个线程,每个线程亲自处理io,但有另外的线程轮询检查是否io准备完毕,不必等待io完成,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
NIO则是面向缓冲区的,非阻塞式的,基于选择器的,用一个线程来轮询监控多个数据传输通道,哪个通道准备好了(即有了一组可以处理的数据),就处理哪个通道。
服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相 应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭 该端口。这样能充分利用服务器资源,效率得到了很大提高。
3、AIO (Asynchronous io、NIO.2) 从jdk1.7开始
http://stevex.blog.51cto.com/4300375/1284437
异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,每个线程不必亲自处理io,而是委派os来处理,并且也不需要等待io完成了,如果完成后,os会通知的。
采用linux的epoll模型。
3、结论
在连接数不多的情况下,传统IO编写容易、方便使用。但是随着连接数的增多,问题传统IO就不行了。因为传统IO处理每个连接都要消耗一个线程,而程序的效率当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少。所以传统阻塞式IO的 瓶颈在于不能处理过多的连接。
非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理10000个 连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个连接发送请求到服务 器,服务器把这个连接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。 这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。
然后NIO的非阻塞,需要一直轮询,也是一个比较耗资源的。所以出现AIO
4、BIO、NIO、AIO适用场景
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
ps:AIO、NIO是基于IO的,并不是取代IO的意思。
二、NIO的框架
IO的概念:
1. 就IO而言:概念上有5中模型:blocking I/O,nonblocking I/O,I/O multiplexing (select and poll),signal driven I/O (SIGIO),asynchronous I/O (the POSIX aio_functions)。
2. 然后呢 不同的操作系统对上述模型支持不同: unix支持io多路复用,不同系统叫法不同 :freebsd里面叫 kqueue;linux 是epoll。而windows: 2000的时候就诞生了IOCP支持最后一种异步I/O
3.java是一种跨平台语言,为了支持异步IO,诞生了nio,Java1.4引入的NIO 1.0是基于I/O复用的。在各个平台上会选择不同的复用方式。Linux用的epoll,BSD上用kqueue,Windows上应该是重叠I/O(肯定不是IOCP)。
4:基于jdk的nio ,不同公司出了一堆框架:apache mina ,jboss的netty,sun的grizzly。 这些都是直接封装传输层的tcp/udp。
nio直接使用比较难用,所以有了netty等针对网络io部分(tcp/udp-传输层)的封装(nio也有非网络io部分),为了使nio更易用。 netty等只是一个nio框架,不需要web容器的额外支持,也就是说不限定web容器。
3个NIO框架是:
1、Mina
Mina(Multipurpose Infrastructure for Network Applications) 是 Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 Mina 版本2.04支持基于 JavaNIO 技术的 TCP/UDP 应用程序开发、串口通讯程序,Mina 所支持的功能也在进一步的扩展中。目前,正在使用Mina的应用包括:Apache Directory Project、AsyncWeb、AMQP(Advanced MessageQueuing Protocol)、RED5 Server(Macromedia? FlashMedia RTMP)、ObjectRADIUS、 Openfire等等。
2、Netty
Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。
3、Grizzly
Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVANIO作为基础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socketd到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池。
三、Servlet3.0 vs NIO
servlet3.0是一个规范、或者协议,可以用IO实现,也可以用NIO实现,而NIO则只是一种技术实现。类似于一个是架构,一个是具体技术。
相同:
都提供了异步功能。
不同:
jdk的nio直接使用比较难用,所以有了netty这些针对网络io部分(tcp/udp-传输层)的封装(nio也有非网络io部分),为了使nio更易用而已。
servlet3.0是另外一个东西,不是对io的封装,而是javaee6众多规范中的一个。但凡javaee6的实现(或者像tomcat这种web容 器部分的实现),都会支持servlet3.0,servlet理论上可以支持多种应用层协议(不单单只是http),而servlet3.0以后提供的 异步特性与javase提供的nio或aio无直接关系,就是使用bio一样可以实现servlet3.0中提供的异步特性。
可以说NIO的异步是直接处理的更底层的IO,而Servlet3.0的异步指的是上层的请求响应的异步
参考:
io vs nio: http://ifeve.com/java-nio-vs-io/
io vs nio vs aio: http://stevex.blog.51cto.com/4300375/1284437
apache vs nginx: http://blog.csdn.net/xifeijian/article/details/17385831
nio vs netty: http://www.iteye.com/problems/92400
io vs nio: http://blog.csdn.net/showwair/article/details/7488518
netty vs mina vs grizzly: http://blog.csdn.net/poechant/article/details/8439962
io vs nio: http://blog.csdn.net/showwair/article/details/7488523
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1561### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1229如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1121我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2203高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 2089将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1665在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 1063Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 6035之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 988长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2088计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3386### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1105# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3288# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1119# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1471# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1057### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1384# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1367# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 735### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1499前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
例如,介绍了Python开发者的超级开发工具、基于Capistrano工具的Rails程序部署方案、Java IO vs NIO vs AIO的比较以及协议Servlet 3.0和NIO框架的应用。此外,还涉及到了Integer.valueOf(String)方法的困惑和通过...
4. **IO与NIO**:理解Java输入输出(IO)流,以及非阻塞IO(NIO)和异步IO(AIO)的概念,学习如何实现高效的数据读写。 5. **网络编程**:学习Socket编程,了解TCP与UDP的区别,以及如何通过Java进行网络通信。 6...
11. **Java IO与NIO**:了解旧有的IO模型和新引入的非阻塞IO模型(New IO,NIO),以及NIO2(Java 7引入的异步IO,AIO)。 12. **JVM内存模型**:理解Java虚拟机的工作原理,包括类加载机制、内存区域(如堆、栈、...
6. **NIO(非阻塞IO)与AIO(异步IO)**:对于高性能应用,Java提供了NIO和AIO,它们可以提高处理大量并发连接的能力,特别是对于服务器端应用。 7. **IO工具类**:Java提供了一些内置的IO工具类,如Files类(在...
* Java 高级知识:Annotation、IO 和 NIO、AIO、多线程、线程池、阻塞、非阻塞、异步网络通信、反射、动态代理 二、JDBC 编程 * SQL 基础:基础 SQL 语句、基本查询、多表查询、子查询、结果集的交、并、差运算 * ...
此外,书中还可能涵盖Java的泛型、枚举、注解等语言特性,以及IO流、NIO(非阻塞I/O)和新引入的AIO(异步I/O)等输入输出处理。对于面向对象编程,可能会深入到设计模式的应用,如工厂模式、单例模式、装饰器模式等...
4. **多线程处理连接**:对于并发连接,服务器通常需要开启多个线程或者使用非阻塞IO(NIO)或异步IO(AIO)来处理多个客户端请求。`ExecutorService`和`Future`可以用来管理线程池,提高性能和资源利用率。 5. **...
MINA(Multithreaded IO Aio NIO Aggregator)是Apache软件基金会下的一个开源项目,主要设计用于简化Java中的网络通信编程。MINA基于Java的NIO(Non-blocking I/O)技术,能够处理大量的并发连接,从而显著提高系统...
8. **Java企业级开发**:简述Servlet、JSP、JDBC,以及Spring、Hibernate等框架的应用,为Web开发打下基础。 教程中附带的"Core.Java2.chm"文件可能是教程的主干内容,以CHM(Microsoft Compiled HTML Help)格式...
12. **IO/NIO/BIO**:对比传统IO模型和非阻塞I/O模型NIO,以及最新的异步I/O模型AIO。 13. **网络编程**:讲解Socket编程,包括TCP和UDP协议,以及ServerSocket和Socket类的使用。 14. **数据库连接**:JDBC(Java...
集合框架是Java库的核心部分,包括List、Set和Map接口以及它们的实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap和TreeMap等。了解它们的特点和应用场景,以及泛型、迭代器和流API的使用,能够提高代码...
- 精通TCP/UDP协议,理解NIO、BIO、AIO等IO模型,以及Linux内核中的select、poll、epoll机制,还有内存池实现和Reactor线程模型,这在高性能网络编程中至关重要。 13. **消息中间件**: - 掌握Kafka、RocketMQ、...
4. Java网络编程与NIO:这部分内容讲解了Java的网络编程,包括Socket、IO模型(BIO、NIO、AIO)和相关的Linux网络编程知识。同时,介绍了Tomcat和Netty这两个NIO相关的高性能服务器。 5. JavaWeb技术世界:这个专栏...
Tomcat 的 Connector 运行模式有多种,包括 bio、nio、aio、apr 等。其中,bio 是传统的 Java I/O 操作,同步且阻塞 IO。nio 是 JDK 1.4 开始支持的同步阻塞或同步非阻塞 IO。aio 是 JDK 7 开始支持的异步非阻塞 IO...
Netty 是基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。 Netty 的特点 * 高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO...
在Java NIO的基础上,还有高级的异步I/O模型,如Java 7引入的AIO(Asynchronous IO),也称为NIO.2,它进一步简化了异步操作的编程模型。 总之,非阻塞通信是现代网络编程的关键技术之一,通过Java的NIO库,我们...
#### 三、IO/NIO/AIO 1. **IO** - **阻塞IO**:传统Java IO模型,读写操作会阻塞当前线程。 2. **NIO** - **非阻塞IO**:提供了Buffer、Channel等组件,支持非阻塞的读写操作。 3. **AIO** - **异步IO**:引入了...
IO和NIO、AIO涉及文件读写和网络通信。多线程和线程池处理并发任务,阻塞、非阻塞和异步通信提高效率。反射和动态代理则允许在运行时检查和修改类的行为。 4. **SQL基础**:SQL语言用于数据库操作,包括基本查询、...
- **NIO与AIO**:Non-blocking IO和Asynchronous IO为Java提供了更加高效的数据传输方式,适用于高并发场景。 4. **多线程编程**: - **线程基础**:创建线程的多种方式、线程的状态转换、同步机制等。 - **并发...
- **NIO(New IO)与AIO(Asynchronous IO)**:了解非阻塞I/O,提高服务器处理性能。 - **Java 8新特性**:学习Lambda表达式、Stream API、Optional类等新特性。 4. **数据库技术**: - **SQL基础**:掌握SQL...