基于Java NIO 开发高性能并发型服务器程序的研究
第8卷%第5期
软件导刊
2009年5月SoftwareGuide
Vol.8No.5May.2009
基于JavaNIO开发高性能并发型服务器程序的研究
段艳明,肖辉辉
(河池学院计算机与信息科学系,广西宜州546300)
摘
要:分析了应用传统阻塞型网络I/O在进行服务器程序设计时的不足,在此基础上研究了非阻塞型网络I/O
(NIO)的特性以及工作机制,给出了应用NIO设计高性能并发型服务器程序核心代码,以实现服务器与客户端无阻
塞的、流畅的数据读写。
关键词:网络通信;阻塞;非阻塞;NIO;Java中图分类号:TP312
文献标识码:A
文章编号:1672-7800(2009)05-0063-03
1传统阻塞型网络I/O的不足
但是,随着同时连接的客户端数量的增加,系统中将存在大量的用于同客户端进行交互的线程。每个线程都需要较多的系统资源(内存、栈、CPU等),在不同的线程之间切换上下文(Con-
Java平台传统的I/O系统都是基于Byte(字节)和Stream(数据流)的,相应的I/O操作都是阻塞型的,所以服务器程序也采用阻塞型I/O进行数据的读、写操作。其操作模式如图1所示(以TCP服务器为例
)。
text)是一个比较费时的操作,频繁的线程操作将会造成系统性
能急剧下降。如果用这样的模型建立一个服务器端,一个连接至少2个线程,如果业务负担很大、连接的socket很多的话,会带来相当大的开销、而且扩展性很差。因此,这种模式在客户端增加时,性能将下降得非常快。
2NIO特性
针对传统I/O系统工作模式的弊端,JavaNIO通信机制的构建采用了基于Buffers(缓冲区)、Channels(通道)和Selectors(选择器)的新模式。
图1
基于阻塞I/O的单线程TCP服务器
图1中,粗框所表示的操作即为阻塞操作,服务器对这些操作的调用将一直阻塞,直到资源可以得到。对于这种基于阻塞I/O开发的网络应用程序,一个常用的改进方法就是开设多线程,让线程去处理阻塞操作,其操作模式如图2所示(以TCP服务器为例
)。
JavaNIO的主要类为:
Buffer(缓冲器):Buffer是抽象类,它及其派生出的"子类",
用以处理各种类型数据的读写以及相关的运算。每一缓冲器内部包含一个字节数组作为数据存储,实现数据的管理和运算,并控制操作系统的读写过程。
Channel(通道):Channel是一个接口,功能类似于传统I/O
中的Stream,但通道具有双向性,既可读入,也可写出。
Selector(选择器):各类Buffer是数据的容器对象。各类Channel实现在各类Buffer与各类I/O服务间传输数据。而Selector,负责监视已注册的Sockets通道,提供各类Channel的
状态信息,并序列化服务器需要应答的请求,控制着各类
Channel有效地工作。
Buffers、Channels和Selectors是组成NIO的三个重要部
图2
基于阻塞I/O的多线程TCP服务器
分,是三类新的抽象模型。它们提供了非阻塞套接字、就绪选择、文件锁定和内存映射文件等新的I/O能力。还提供了正则
图2中使用多线程,使得服务器可以并发处理多个请求。
作者简介:段艳明(1978-),女,河池学院计算机与信息科学系讲师,研究方向为计算机网络、人工智能;肖辉辉(1977-),男,江西永新人,江西理工
大学硕士研究生,河池学院计算机与信息科学系讲师,研究方向为GML空间数据库理论与应用、数据库技术、GIS应用开发。