从上一次讲的I/O模式中可以看出,效率最高的I/O模式还是异步非阻塞AIO。目前在不同的系统中也有不同的实现方式,Win2k的IOCP、Linux的EPOLL等都是实现AIO的一种编程模型,java也是在jdk1.7版本中加入了异步aio。在不同操作系统上在高并发情况下最好都采用操作系统推荐的方式。
但是不管是linux下还是java下的实现,都并不是完全的异步,只算是用线程和select模拟异步操作。那下面看一下并发编程模式中的两种IO多路复用模式Reactor与Proactor。
讲之前先看一下传统的多线程和多路复用两种不同方式,那么对于网络服务底层的socket的操作来说,他们都有的一个共同结构是:
1. 读取请求Read request
2. 解析请求Decode request
3. 处理请求Process service
4. 编码 Encode reply
5. 响应Send reply
多线程模型
在每个线程中完成对数据的处理
多路复用模型(reactor模式下的)
多路复用模式类似与AWT中的EVENT机制
Reactor与Proactor这 两个模型属于后者都是用于派发/分离IO操作事件的。这里所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方在于,Proactor用于异步IO,而Reactor用于同步IO。
两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。在结构上,两者也有相同点:分发器负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler。不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write),handler这个时候开始提交操作。
在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。比如,在windows上,处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。典型的异步模式实现,都建立在操作系统支持异步API的基础之上,我们将这种实现称为“系统级”异步或“真”异步,因为应用程序完全依赖操作系统执行真正的IO工作。
举个例子,将有助于理解Reactor与Proactor二者的差异,以读操作为例(类操作类似)。
在Reactor中实现读:
- 注册读就绪事件和相应的事件处理器
- 事件分离器等待事件
- 事件到来,激活分离器,分离器调用事件对应的处理器。
- 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。
与如下Proactor(真异步)中的读过程比较:
- 处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件。
- 事件分离器等待操作完成事件
- 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。
- 事件分离器呼唤处理器。
- 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器。
参考自:两种高性能I/O设计模式比较 http://www.artima.com/articles/io_design_patterns2.html
- 大小: 16.9 KB
- 大小: 19.4 KB
- 大小: 26.3 KB
- 大小: 20 KB
- 大小: 27.1 KB
分享到:
相关推荐
3. **Mina2源码分析**(Mina2源码分析.doc):源码分析文档通常由经验丰富的开发者编写,通过深入剖析MINA的源代码,揭示其内部工作原理,帮助开发者理解MINA如何实现非阻塞I/O,以及如何高效地处理网络连接和数据...
- **传输层**:探讨Mina支持的不同传输协议及其工作原理,例如APR传输和串行传输等。 ### Part II - MINA Core核心 #### Chapter 8 - IoBuffer - **IoBuffer详解**:IoBuffer是Mina用于高效内存管理的数据结构,...
Socket编程和Apache Mina框架是Java中用于网络通信的重要工具,尤其在开发分布式...通过理解Socket和Mina的工作原理,开发者可以更好地构建高效、稳定的网络通信系统,尤其是在开发需要实时推送功能的Android应用时。
在这个“mina-2.0.0-M6.zip”压缩包中,包含了MINA库的源代码和示例,是学习和理解MINA工作原理的理想资源。 MINA的核心特性包括: 1. **非阻塞I/O**:MINA采用Java NIO(Non-blocking Input/Output)API,允许在...
在Mina 1.1.7版本中,提供的示例源码是学习和理解Mina框架工作原理及其实现各种网络协议的重要资源。这个压缩包"apache.mina.example"包含了一系列的示例项目,可以帮助开发者快速上手并深入理解Mina。 1. **Mina...
下面将详细介绍Mina框架在Android中的应用及其核心概念。 1. **Mina框架基础** Mina源于Java平台,但在Android上同样适用。它提供了事件驱动的非阻塞I/O模型,提高了网络通信的效率。Mina的核心组件包括Acceptor...
以下将详细介绍Mina、Spring和Hibernate的整合过程及其实现原理。 1. Mina简介 Mina(Java NIO-based Network Application Framework)是基于Java NIO(非阻塞I/O)的网络应用程序框架。它提供了一个事件驱动、异步...
本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和掌握Mina2的工作原理及其在实际开发中的应用。 #### 核心包介绍 Mina2的核心组成部分主要包括以下四个包: 1. **org.apache.mina.core.service**:包含服务...
Apache Mina是一个基于Java的网络通信框架,专为高性能、高可用性和可扩展性而设计。...在深入学习Mina的过程中,理解IoService及其子类的工作原理,以及如何结合IoHandler实现业务逻辑,对于掌握Mina框架至关重要。
4. **学习API**:MINA提供了一套丰富的API,包括Session、Filter、Handler等核心概念,理解这些接口及其使用方式是使用MINA的关键。 5. **编写代码**:根据你的需求,创建自定义的处理器(Handler)和过滤器(Filter...
本DEMO将帮助我们深入理解Mina的工作原理及其在实际应用中的使用。 ### 1. Mina 框架的核心概念 - **事件驱动模型**:Mina 采用非阻塞I/O模型,基于Java NIO(New IO)库,使得系统能够处理大量并发连接,提高...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、...在实际项目中,配合源码阅读和测试,能更好地理解和掌握MINA FtpServer的工作原理及其在复杂环境中的应用。
接下来,我们将逐步深入分析 Mina 2.0 的核心组件及其实现原理。 **2.1 IoAcceptor** `IoAcceptor` 接口是 Mina 2.0 中的核心接口之一,它代表了一个网络服务端点。通过该接口可以设置各种处理器、配置参数以及...
本文将深入探讨CumulativeProtocolDecoder的使用及其背后的原理。 CumulativeProtocolDecoder的设计目标是处理那些需要累积多个数据片段才能完全解析的数据包。在许多网络协议中,数据包可能跨越多个TCP/IP报文...
为了更好地理解和使用 Mina,我们需要深入了解其核心组件及其工作原理: 1. **`IoService`**:这是一个抽象接口,在 Mina 中负责管理网络连接和服务。它包含两个主要实现:`IoAcceptor` 和 `IoConnector`。`...
- **Java NIO**:理解非阻塞IO的基本原理及其在Java中的实现。 - **Java Socket**:了解如何使用Socket进行网络通信。 - **Java多线程和并发**:掌握Java线程和并发控制的基本概念。 #### 四、Mina Server核心组件 ...
本文旨在通过深入解析`ProtocolCodecFilter`的工作原理及其使用方法,帮助开发者更好地理解和应用这一组件。 #### 二、为何使用`ProtocolCodecFilter` 在探讨如何使用`ProtocolCodecFilter`之前,我们首先需要了解...
#### 二、MINA的核心组件及其功能 ##### 1. MINA源码包结构 MINA的源码包结构主要分为以下几个部分: - `core` 包:包含核心组件和接口,如`IoService`、`IoHandler`等。 - 其他相关包,例如用于支持特定功能的...