关于同步和异步IO,从网上查到的相关资料:
两种I/O多路复用模式:Reactor和Proactor
一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。
在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。
而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。比如,在windows上,处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。典型的异步模式实现,都建立在操作系统支持异步API的基础之上,我们将这种实现称为“系统级”异步或“真”异步,因为应用程序完全依赖操作系统执行真正的IO工作。
举个例子,将有助于理解Reactor与Proactor二者的差异,以读操作为例(类操作类似)。
在Reactor中实现读:
- 注册读就绪事件和相应的事件处理器
- 事件分离器等待事件
- 事件到来,激活分离器,分离器调用事件对应的处理器。
- 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。
与如下Proactor(真异步)中的读过程比较:
- 处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件。
- 事件分离器等待操作完成事件
- 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。
- 事件分离器呼唤处理器。
- 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器。
java自1.4提供对NOI操作的支持,7提供对AOI的支持。java自身包可通过tcp/ip及udp/ip实现系统间通信,支持bio及nio。开源框架方面,Mina是基于NIO构建的Apache顶级项目,对外屏蔽了NIO的复杂性,并在性能上做了优化。
分享到:
相关推荐
根据给定文件的信息,我们可以总结出以下几个重要的知识点: ### 1. 高级程序设计语言的特点 - **特点概述**:高级程序设计语言是相对于低级语言(如汇编语言)而言的一种编程语言,它更加贴近人类自然语言,易于...
根据给定的信息,我们可以提取并展开以下几个重要的IT知识点: ### 1. Access 2003 表的设计视图和数据表视图切换 - **知识点解析**:在Access 2003中,表有两种主要视图模式:设计视图和数据表视图。设计视图用于...
根据给定文件的信息,我们可以总结出以下几个知识点: ### 1. 菜单命令的可用性判断 **知识点概述:** 在用户界面中,如果某个菜单命令呈现为灰色(即通常所说的“灰化”),这表示当前状态下该命令不可用。 **...
6. 在Java编程中,使用`import java.io.*;`引入了输入/输出流相关的类和接口,以便创建I/O流对象。 7. 在数据库中,每个表通常只有一个自动编号字段,用于自动生成唯一的标识符。 8. 要使Print方法在Form_Load事件...
根据给定文件的信息,我们可以总结出以下几个重要的知识点: ### 1. 关键字与属性概念 **知识点描述:** 在数据库领域中,关键字通常指能够唯一标识一条记录的属性或属性集。 - **关键字(Key)**:在关系数据库...
- `java.io`包包含I/O相关的类和接口。 - `java.util`包包含集合框架、实用工具类以及日期和字符串操作类。 - `java.awt`包提供用于创建GUI应用程序的图形用户界面组件。 - `java.lang`包包含了构成Java语言核心...
27. ObjectInputStream与ObjectOutputStream:这两个类是Java中的IO流,用于处理对象的序列化和反序列化,它们允许将对象写入流并在稍后恢复。 以上知识点涵盖了计算机二级等级考试中的编程基础、数据库、网络、...
import java.io.*; public class MyClass { public static void main(String args[]) { if (args.length != 0) { for (int i = 0; i ; i++) { System.out.println("i=" + i); } } } } ``` - **正确答案**...
### wgcloud监控系统v3.2.9操作手册知识点总结 #### 一、系统简介与特点 **wgcloud**是一款采用微服务架构(SpringBoot)设计的分布式监控系统,结合Java和Go语言开发而成。该系统提供了丰富的核心监控功能,包括但...
在表达式中使用算术运算符时要注意以下几点: 1,运算符两边的运算数字必须是数字 2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35 使用内建的int函数可...