javai-o操作及优化建议-java开发java经验技巧

javai-o操作及优化建议-java开发java经验技巧

ID:30778730

大小:195.50 KB

页数:17页

时间:2019-01-03

javai-o操作及优化建议-java开发java经验技巧_第1页
javai-o操作及优化建议-java开发java经验技巧_第2页
javai-o操作及优化建议-java开发java经验技巧_第3页
javai-o操作及优化建议-java开发java经验技巧_第4页
javai-o操作及优化建议-java开发java经验技巧_第5页
资源描述:

《javai-o操作及优化建议-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、JavaI/O操作及优化建议-编程开发技术JavaI/O操作及优化建议原文出处:IBM一周明耀JavaI/O1/0,即Input/0utput(输入/输出)的简称。就I/O而言,概念上有5种模型:blockingI/O,nonblockingI/O,I/Omultiplexing(selectandpoll),signaldrivenI/O(STGTO),asynchronousT/0(thePOSTXaio_functions)o不同的操作系统对上述模型支持不同,UNIX支持10多路复用。—不同系统叫法不同,fr

2、ccbsd里面叫kqucuc,Linux叫epollo而Windows2000的吋候就诞生了10CP用以支持asynchronous1/0。Java是一种跨平台语言,为了支持异步I/O,诞生了NIO,Javal.4引入的NI01.0是基于I/O复用的,它在各个平台上会选择不同的复用方式。Linux用的epoll,BSD上用kqueue,Windows上是重叠I/O。JavaI/O的相关方法如卜'所述:•同步并阻塞(I/O方法):服务器实现模式为一个连接启动一个线程,每个线程亲自处理I/O并且一直等待I/O直到完成,

3、即客户端有连接请求时服务器端就需要启动一个线程进行处理。但是如果这个连接不做任何事情就会造成不必要的线程开销,当然可以通过线程池机制改善这个缺点。I/O的局限是它是而向流的、阻塞式的、串行的一个过程。对每一个客户端的Socket连接I/O都需要-个线程來处理,而且在此期间,这个线程一肓被占用,直到Socket关闭。在这期间,TCP的连接、数据的读取、数据的返回都是被阻塞的。也就是说这期间大量浪费了CPU的时间片和线程占用的内存资源。此外,每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(

4、采用阻塞的方式通信)。这种方式具有很快的响应速度,并且控制起來也很简单。在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况;•同步非阻塞(NIO方法):服务器实现模式为一个请求启动一个线程,每个线程亲口处理I/O,但是另外的线程轮询检査是否I/O准备完毕,不必等待I/O完成,即客门端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO则是面向缓冲区,非阻塞式的,基于选择器的,川一个线程來轮询

5、监控多个数据传输通道,哪个通道准备好了(即冇一组可以处理的数据)就处理哪个通道。服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时,则调用该Socket连接的相应读操作;如果发现某个Socket端口上有数据可写时,则调用该Socket连接的相应写操作;如果某个端口的Socket连接已经屮断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到大幅度捉高;•异步非阻塞(AIO方法,JDK7发布):服务器实现模式为一个冇效请求启动一个线程,客户端的I/

6、O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理,每个线程不必亲自处理I/O,而是委派操作系统來处理,并且也不需要等待I/O完成,如杲完成了操作系统会另行通知的。该模式采用了Linux的epoll模型。在连接数不多的情况下,传统I/O模式编写较为容易,使用上也较为简单。但是随着连接数的不断增多,传统I/O处理每个连接都需要消耗一个线程,而程序的效率,当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少的。所以传统阻塞式I/O的瓶颈在于不能处理过多的连接。非阻塞式I/O

7、岀现的目的就是为了解决这个瓶颈。非阻塞10处理连接的线程数和连接数没有联系,例如系统处理10000个连接,非阻塞I/O不需要启动10000个线程,你可以用1000个,也可以用2000个线程来处理。因为非阻塞10处理连接是异步的,当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求“事件”,并把这个“事件”分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还,这样一个线程就可以异步的处理多个事件。而阻塞式I/O的线程的大部分时间都被浪费在等待请求上了。JavaNI0Java,nio

8、包是Java在1.4版木之后新增加的包,专门用来提高I/O操作的效率。表1所示是I/O与NI0之间的对比内容。表1.I/OVSNTOI/ONIO面向流面向缓冲阻塞IO非阻塞IO无选择器N10是基于块(Block)的,它以块为基本单位处理数据。在NI0中,最为重要的两个组件是缓冲Buffer和通道Channelo缓冲是一块连续的内存块,是NI0读写数据的中转地

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。