最近做一个android app的服务器端开发,而以前接触到的无非都是通过多线程编程来处理socket并发连接,但是考虑到一旦并发连接数达到一定的数量级,服务器肯定会效率直线下降而且容易死掉,所以就想采取Apache的网络通信框架Mina来实现通信功能,由于也是初步接触,下面对一些简单的原理东西做一些总结。
谈论Mina前必须得清楚的是一些简单的通信概念
I/O操作
进程执行I/O操作,归结起来,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)。进程使用这一机制处理所有数据进出操作。操作系统内部处理这一任务的机制,其复杂程度可能超乎想像,但就概念而言,却非常直白易懂。
图1-1简单描述了数据从外部磁盘向运行中的进程的内存区域移动的过程。进程使用read( )系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过DMA完成,无需主CPU协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行read( )调用时指定的缓冲区。
图1-1 I/O缓冲区操作简图
I/O模型
图 1-2. 基本 Linux I/O 模型的简单矩阵
由图1-2可知I/O模型可以分为四种
1.同步阻塞
2.同步非阻塞
3.异步阻塞
4.异步非阻塞
1.同步阻塞I/O
图2 给出了传统的阻塞 I/O 模型,这也是目前应用程序中最为常用的一种模型。其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。在调用 read
系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻(read
调用返回)。
从应用程序的角度来说,read
调用会延续很长时间。实际上,在内核执行读操作和其他工作时,应用程序的确会被阻塞。
I/O 密集型与 CPU 密集型进程的比较
I/O 密集型进程所执行的 I/O 操作比执行的处理操作更多。CPU 密集型的进程所执行的处理操作比 I/O 操作更多。Linux 2.6 的调度器实际上更加偏爱 I/O 密集型的进程,因为它们通常会发起一个 I/O 操作,然后进行阻塞,这就意味着其他工作都可以在两者之间有效地交错进行。
2.同步非阻塞I/O
同步阻塞 I/O 的一种效率稍低的变种是同步非阻塞 I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着 I/O 操作不会立即完成,read
操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAIN
或 EWOULDBLOCK
),如图 3 所示。
非阻塞的实现是 I/O 命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。正如图 3 所示的一样,这个方法可以引入 I/O 操作的延时,因为数据在内核中变为可用到用户调用 read
返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。
3.异步阻塞I/O
另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select
系统调用来确定一个 I/O 描述符何时有操作。使 select
调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。
select
调用的主要问题是它的效率不是非常高。尽管这是异步通知使用的一种方便模型,但是对于高性能的 I/O 操作来说不建议使用。
4.异步非阻塞I/O(AIO)
最后,异步非阻塞 I/O 模型是一种处理与 I/O 重叠进行的模型。读请求会立即返回,说明 read
请求已经成功发起了。在后台完成读操作时,应用程序然后会执行其他处理操作。当 read
的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。
在一个进程中为了执行多个 I/O 请求而对计算操作和 I/O 处理进行重叠处理的能力利用了处理速度与 I/O 速度之间的差异。当一个或多个 I/O 请求挂起时,CPU 可以执行其他任务;或者更为常见的是,在发起其他 I/O 的同时对已经完成的 I/O 进行操作。
参考:使用异步 I/O 大大提高应用程序的性能 http://www.ibm.com/developerworks/cn/linux/l-async/
Java NIO Ron Hitchens 著
- 描述: I/O模型的简单矩阵
- 大小: 4.6 KB
- 大小: 24.2 KB
- 大小: 16.9 KB
- 大小: 31.8 KB
- 大小: 10 KB
- 大小: 7 KB
分享到:
相关推荐
- **传输层**:探讨Mina支持的不同传输协议及其工作原理,例如APR传输和串行传输等。 ### Part II - MINA Core核心 #### Chapter 8 - IoBuffer - **IoBuffer详解**:IoBuffer是Mina用于高效内存管理的数据结构,...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。这个框架适用于多种协议,如TCP/IP和UDP/IP,以及NIO(非...
在Mina 1.1.7版本中,提供的示例源码是学习和理解Mina框架工作原理及其实现各种网络协议的重要资源。这个压缩包"apache.mina.example"包含了一系列的示例项目,可以帮助开发者快速上手并深入理解Mina。 1. **Mina...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序。MINA 提供了一套高级的网络编程抽象层,简化了开发过程,特别是对于那些处理TCP/IP...
使用Mina构建推送服务时,开发者可以创建一个服务器端应用,监听特定端口,当收到新的推送消息时,通过过滤器链进行数据处理和格式化,然后通过连接池向已注册的客户端发送。客户端则使用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)的网络应用程序框架。它提供了一个事件驱动、异步...
Apache Mina是一个基于Java的网络通信框架,专为高性能、高可用性和可扩展性而设计。...在深入学习Mina的过程中,理解IoService及其子类的工作原理,以及如何结合IoHandler实现业务逻辑,对于掌握Mina框架至关重要。
本DEMO将帮助我们深入理解Mina的工作原理及其在实际应用中的使用。 ### 1. Mina 框架的核心概念 - **事件驱动模型**:Mina 采用非阻塞I/O模型,基于Java NIO(New IO)库,使得系统能够处理大量并发连接,提高...
本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和掌握Mina2的工作原理及其在实际开发中的应用。 #### 核心包介绍 Mina2的核心组成部分主要包括以下四个包: 1. **org.apache.mina.core.service**:包含服务...
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 的设计模式、架构原理及其核心组件之间的交互机制。 2. **IoBuffer 封装** - IoBuffer 的封装是为了提高数据处理效率,并简化开发者的工作。 - 理解 IoBuffer 的内部实现对于优化性能至关...
为了更好地理解和使用 Mina,我们需要深入了解其核心组件及其工作原理: 1. **`IoService`**:这是一个抽象接口,在 Mina 中负责管理网络连接和服务。它包含两个主要实现:`IoAcceptor` 和 `IoConnector`。`...
- **Java NIO**:理解非阻塞IO的基本原理及其在Java中的实现。 - **Java Socket**:了解如何使用Socket进行网络通信。 - **Java多线程和并发**:掌握Java线程和并发控制的基本概念。 #### 四、Mina Server核心组件 ...
本文旨在通过深入解析`ProtocolCodecFilter`的工作原理及其使用方法,帮助开发者更好地理解和应用这一组件。 #### 二、为何使用`ProtocolCodecFilter` 在探讨如何使用`ProtocolCodecFilter`之前,我们首先需要了解...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写,用于简化开发服务器端和客户端的网络应用程序。MINA为各种传输协议(如...