选择显示字体大小

java i/o api之性能分析 (上)

  摘要:

  io api的可伸缩性对web应用有着极其重要的意义。java 1.4版以前的api中,阻塞i/o令许多人失望。从j2se 1.4版本开始,java终于有了可伸缩的i/o api。本文分析并计算了新旧i/o api在可伸缩性方面的差异。

  一、概述

  io api的可伸缩性对web应用有着极其重要的意义。java 1.4版以前的api中,阻塞i/o令许多人失望。从j2se 1.4版本开始,java终于有了可伸缩的i/o api。本文分析并计算了新旧io api在可伸缩性方面的差异。javasocket写入数据时必须调用关联的outputstream的write()方法。只有当所有的数据全部写入时,write()方法调用才会返回。倘若发送缓冲区已满且连接速度很低,这个调用可能需要一段时间才能完成。如果程序只使用单一的线程,其他连接就必须等待,即使那些连接已经做好了调用write()的准备也一样。为了解决这个问题,你必须把每一个socket和一个线程关联起来;采用这种方法之后,当一个线程由于i/o相关的任务被阻塞时,另一个线程仍旧能够运行。

  尽管线程的开销不如进程那么大,但是,考虑到底层的操作平台,线程和进程都属于消耗大量资源的程序结构。每一个线程都要占用一定数量的内存,而且除此之外,多个线程还意味着线程上下文的切换,而这种切换也需要昂贵的资源开销。因此,java需要一个新的api来分离socket线程之间过于紧密的联系。在新的java i/o api(java.nio.*)中,这个目标终于实现了。

  本文分析和比较了用新、旧两种i/o api编写的简单web服务器。由于作为web协议的http不再象原来那样只用于一些简单的目的,因此这里介绍的例子只包含关键的功能,或者说,它们既不考虑安全因素,也不严格遵从协议规范。

  二、用旧api编写的http服务器

  首先我们来看看用旧式api编写的http服务器。这个实现只使用了一个类。main()方法首先创建了一个绑定到8080端口的serversocket


  public static void main() throws ioexception {
  serversocket serversocket = new serversocket(8080);
  for (int i=0; i < integer.parseint(args[0]); i++) {
  new httpd(serversocket);
  }
  }

  接下来,main()方法创建了一系列的httpd对象,并用共享的serversocket初始化它们。在httpd的构造函数中,我们保证每一个实例都有一个有意义的名字,设置默认协议,然后通过调用其超类thread的start()方法启动服务器。此举导致对run()方法的一次异步调用,而run()方法包含一个无限循环。

  在run()方法的无限循环中,serversocket的阻塞性accpet()方法被调用。当客户程序连接服务器的8080端口,accept()方法将返回一个socket对象。每一个socket关联着一个inputstream和一个outputstream,两者都要在后继的handlerequest()方法调用中用到。这个方法将读取客户程序的请求,经过检查和处理,然后把合适的应答发送给客户程序。如果客户程序的请求合法,通过sendfile()方法返回客户程序请求的文件;否则,客户程序将收到相应的错误信息(调用senderror())方法。


  while (true) {
  ...
  socket = serversocket.accept();
  ...
  handlerequest();
  ...
  socket.close();
  }

  现在我们来分析一下这个实现。它能够出色地完成任务吗?答案基本上是肯定的。当然,请求分析过程还可以进一步优化,因为在性能方面stringtokenizer的声誉一直不佳。但这个程序至少已经关闭了tcp延迟(对于短暂的连接来说它很不合适),同时为外发的文件设置了缓冲。而且更重要的是,所有的线程操作都相互独立。新的连接请求由哪一个线程处理由本机的(因而也是速度较快的)accept()方法决定。除了serversocket对象之外,各个线程之间不共享可能需要同步的任何其他资源。这个方案速度较快,但令人遗憾的是,它不具有很好的可伸缩性,其原因就在于,很显然地,线程是一种有限的资源。

  三、非阻塞的http服务器

  下面我们来看看另一个使用非阻塞的新i/o api的方案。新的方案要比原来的方案稍微复杂一点,而且它需要各个线程的协作。它包含下面四个类:

  ·niohttpd
  ·acceptor
  ·connection
  ·connectionselector





 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons