提到I/O模型,会有几个概念:
这里会有四种组合:
- 同步阻塞I/O
- 同步非阻塞I/O
- 异步阻塞I/O
- 异步非阻塞I/O
在解释这些概念之前首先需要先明确一些问题。
- 对于I/O操作一共参与方除了《应用程序》,《I/O对象,比如file,socket》,还有《操作系统》
在这里需要说明操作系统扮演着很重要的元素。因为很多种实现中需要操作系统作为“中介方”-提供服务。
- 不同操作系统在扮演“中介方”的具体实现上可能有些不同,但是并不影响上述概念。
一个应用发出了一次I/O操作后(read/write),其实接下去有两件事情需要注意:
- 由谁去检查是否可以进行操作了
- 在发出操作至确认可以去操作的那段时间中应用可以做什么
OK,到这里就比较清楚了。
第一个问题,其实就是表明了该套系统是同步还是异步的。
- 如果是应用自己负责去检查(通常是轮训)则是同步的。
- 而如果是系统负责通知(多路复用,信号驱动)则是异步的。
在参考帖子里看到一个比喻,我觉得很合适,便是去银行办业务,排队。如果没有任何机制,用户(应用)需要不断的去观察队伍是不是空了,可以进行业务操作了(I/O操作),虽然这时还可以进行其他操作(这个就是非阻塞了),但是可想而知这个效率了。
实际上,银行提供了一个号码纸。当轮到指定用户后,银行会广播通知(这个其实就是多路复用)或者直接通知那个指定的用户(信号驱动),这样便是异步的。在采用这种机制的系统中,应用便从监视中解放了出来,可以去做其他事情。此时应用就是非阻塞的,但是应用仍然可以采用阻塞模式。
第二个问题,就是判断是否是阻塞操作的
在同步I/O中,如果既要负责是否可以操作,又要去做其他事情,这边是非阻塞模式,但通常效率很低,所以一般都是阻塞线程了。
对于异步I/O中,通常应用在发出需要I/O操作后,有系统负责通知应用是否可以进行操作了。所以应用肯定是可以去做其他事情的,也就是非阻塞的。但是应用可以选择工作在阻塞模式下。
总结一下:
同步模式下:由于应用需要检查是否可以进行操作,是否往往就是阻塞的。
异步模式下:由于检查是否可以进行操作有系统负责了,所以应用便可以选择是在阻塞还是飞阻塞模式下工作了。
这里一个关键问题是系统是如何负责通知应用的,这个与操作系统底层有比较紧密的联系。比如linux提供select和epoll函数,及信号量机制。但是这些还不是真正的异步。
而接下来,无论是linxu还是windows都会支持真正的异步模式,对于java这个特性需要jdk7才能够支持了。
参考帖子:
http://blog.csdn.net/kangojian/archive/2010/07/03/5710977.aspx
http://www.iteye.com/topic/868702#1847693
http://www.ibm.com/developerworks/cn/linux/l-async/
- 大小: 43.4 KB
分享到:
相关推荐
NIO的核心概念主要包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),这些组件共同构建了一个基于块数据传输的高效I/O模型。 1. **I/O与NIO对比**: - **传统I/O(IO)**:基于流的I/O模型,数据以单个...
NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统交互的高效I/O模型。 1. **基本概念** IO是Input/Output的缩写,指的是程序与外部设备间的数据传输。在计算机中,数据通常存储在主存中...
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(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,与传统的BIO(Blocking I/O)相对应。NIO提供了一种新的方式来处理I/O操作,特别是在处理大量并发连接时,它的优势更加明显。这...
**NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与传统I/O不同的数据处理方式。在传统的IO模型中,数据的读写是阻塞式的,即在读取或写入数据时,程序会暂停执行,等待数据...
Java源码笔记主要涵盖的是Java编程语言的核心概念和高级特性,特别是与网络编程相关的部分。在深入理解Java源码的过程中,我们不仅可以了解到语言的基础结构,还能探索其在网络通信中的应用。下面将对Java源码和网络...
JDK 5.0引入了新的I/O模型——非阻塞I/O,通过`java.nio`包提供,允许程序在等待数据准备就绪时执行其他任务,提高了I/O操作的性能。 10. **反射(Reflection)** 反射API允许在运行时检查和修改类、接口、字段和...
笔记会讲解流的分类、缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的相关知识。 5. **多线程**:Java支持多线程编程,使得程序能同时执行多个任务。笔记将介绍线程的创建方式、同步机制(如synchronized...
NIO(New I/O)是Java提供的一种I/O模型,与传统的阻塞I/O模型不同,它允许单线程处理多个通道(channels),极大地提高了服务器处理并发连接的能力。选择器是NIO的核心组件,通过注册通道并监听其状态变化,可以...
9. **I/O流的NIO(New I/O)**:非阻塞I/O模型,提供更高效的数据传输。 10. **枚举与注解**:枚举类型及其用法,注解(Annotation)的定义与应用。 11. **泛型**:泛型类、泛型方法、通配符等。 12. **设计模式**:...
11. **Java IO/NIO**:深入理解流的分类,学习非阻塞I/O模型NIO(New Input/Output)。 12. **Java 8及更高版本新特性**:包括Lambda表达式、Stream API、Optional类、日期时间API的改进等。 这些笔记内容全面覆盖...
- **阻塞、非阻塞、AIO**:Java的I/O模型包括阻塞I/O(BIO)、非阻塞I/O(NIO)和异步I/O(AIO)。NIO允许单线程处理多个连接,AIO则进一步提供异步通知机制。 9. **网络编程**: - **套接字编程(单客户)**:`...
11. **IO与NIO**:Java NIO(New Input/Output)是Java SE 1.4引入的改进,提供了一种非阻塞I/O模型,笔记会对比传统IO和NIO的区别,并介绍Channel、Buffer、Selector等核心概念。 12. **JVM原理**:理解JVM的工作...
NIO(Non-blocking I/O),即非阻塞I/O,是Java为提高I/O操作效率而引入的一种新模型,主要包含在`java.nio`包中。 - **缓冲区(Buffer)**:是NIO的核心概念之一,用于存储数据,具有容量、位置和限制等属性。Buffer...
此外,还涉及了Java的I/O和NIO(非阻塞I/O)框架,这些都是进行文件操作和网络通信的基础。 最后,书中还涉及了Java的反射机制和注解,这两个高级特性在编写灵活、动态的代码时非常有用。反射允许程序在运行时检查...
最后,JAVA NIO(New IO)是JAVA从1.4版本引入的,提供了一种非阻塞I/O模型,显著提高了处理大量并发连接的能力。NIO包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors),通过选择器,一个线程可以同时...
11. **Java I/O和NIO**:Java NIO(New IO)提供了一种非阻塞的I/O模型,相比传统的IO更加高效。 12. **Java注解**:注解(Annotation)是元数据的一种形式,用于向编译器或JVM提供额外的信息,比如Spring框架中的@...
4. NIO.2:提供了一种新的I/O API,增强了非阻塞I/O的能力,使得网络编程更加高效。 三、学习笔记内容推测 笔记可能涵盖: 1. Java语法详解:包括变量声明、运算符、流程控制、异常处理等。 2. 面向对象编程:深入...