Chinaunix首页 | 论坛 | 博客
  • 博客访问: 822421
  • 博文数量: 124
  • 博客积分: 1927
  • 博客等级: 上尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-31 14:06
文章分类

全部博文(124)

文章存档

2018年(5)

2017年(2)

2016年(6)

2015年(4)

2014年(24)

2013年(7)

2012年(11)

2011年(13)

2010年(52)

我的朋友

分类: LINUX

2014-06-10 17:09:26

原文地址:嵌入式web服务器预研报告3 作者:soqsoq

开发语言和开发工具

现在的嵌入式linuxCGI程序主要使用C语言。对于编写C语言的CGI程序,可以编写好程序之后,在linux操作系统下编译,用针对硬件平台的linux的交叉编译工具编译就可以,写的html网页界面在记事本写即可。我以前写的CGI程序就是在此环境下写的。这也是最普遍的开发方法。

对于用C语言编写CGI程序还可以使用CSP/eybuild提供的平台库及其开发套件,它可以将CGI程序嵌入式到网页中,可以提高开发效率。传统用CCGI的方法是直接使用printf() 等标准I/O函数输出HTML代码,这样不但使得C程序和HTML程序交织的混乱不堪,还使得页面输出的流程控制变得非常复杂。CSP与之不同,它充分吸取了ASP/JSP/PHP等以HTML/ XML为模板嵌入脚本语言优点,并充分融合C语言的语言特性。使得CSP的开发更快速、更高效,同时还大大提了最终代码的可读性和维护性。 CSP设计的最原始的初衷,就是要为嵌入式开发定制的一套类似 ASP/JSP/PHPC语言开发工具。针对设备WEB开发CSP提供了丰富的平台库和开发工具,它们为设备系统的WEB交叉开发和移植提供了有力的支持。通过交叉开发,可以在其它硬功件平台完全未准完毕的情况下进行高层软件的开发。这不仅能为产品开发有效地节约软硬件资源,还为WEB程序提供简单有效地调试工具。

但缺点是,CSP/eybuild不是一个开源的项目,如果你是个人使用或出于学习、研究目的你可以从eybuild的官方站点 免费下载,或发邮件到 eybuild@hotmail.com 免费索取。它的站点上可以下载针对x86arm920TCSP/eybuild开发平台,其它平台需要向网站上定购。如果你想在你的嵌入式设备的开发板上试用或出于学习和研究目的,你也可把您目标板及编译环境的详细资料发给eybuild@hotmail.com,请求为你的目标板单独制作一份交叉编译开发的CSP/eybuild平台。如果你想你的商用产品或项目中使用CSP/eybuild,你必须在CSP/eybuild的商用授权后才可使用。商用授权后您将可以得到很好的技术支持和技术培训。关于商用授权的详细流程,可邮件至eybuild@hotmail.com 垂询。

C语言编写CGI与其它语言编写CGI的比较:

C语言简洁紧凑,使用方便、灵活,对程序的语法结构要求不是很严,这就使得编程

人员在编程时具有很大的灵活性,可以设计出自己风格的程序。不像UNIX SHELLPerlTCLC语言是一种编译语言,源程序代码要被系统的续译器翻译成机器能直接执行的二进制代码,因此用C语言编写的CGI程序的运行速度要比用解释性语言编写的程序快。使用编泽语言的另一个好处是即使CGI执行程序陷入黑客之手,他们也无法像分析用解释性语言编写的CGI程序那样找到程序中的漏洞。由于C语言最初是针对系统设计的,这使得C语言的字符串处理能力比较差,如果CGI程序需要对字符串进行一些复杂的操作,用C诺言实现起来将比较麻烦,代码量也较多。现在网上用C语言编写的CGI程序仅次于PerlPerl编写程序简单方便)。

     CGIJSP的比较:

ServletJava技术对CGI编程的回答。Servlet程序在服务器端运行,动态地生成Web页面。与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。详细内容见备注。JSP是强于CGI,这也是现在CGI技术的使用没有JSP使用多的原因。但现在嵌入式web服务器端程序开发,还是CGI较多。由于使用JSP技术,在嵌入式web服务器开发中很少使用,在网上没有查到关于在嵌入式web服务器上应用的有关内容。

要实现阅读器的lmt,所需的CGI代码量估计不会很多,关键在于调试。

 

 结论

    根据上面的分析,考虑到使用范围宽广程度,在小型服务器、不要求太强功能,推荐选用boathttpd,其实它们足可以满足大多数情况下的需求,也是使用最广、可参考最多的嵌入式web服务器。如果要求强大的功能,支持javastript等,推荐选用goaheadappweb

 

 

备注

一个网友的个人意见:

boa 的功能比较齐全, 便对嵌入式应用很多功能就是冗余(virtual host), 内存使用量较大些.
thttpd
功能较少, 实现简单. 内存使用量较少. 同时比较方便扩展
.
shttpd
功能功能算是比较全的, 但在处理二进制数据时不够稳定, 时有异常. 有待观察
.
light-httpd, apache
属重量级服务器, 成熟稳定, 体积较大, 在复杂的嵌入式应用上可选用
.
goAhead
是个比较专用的 webserver, 大部分功能都在服务它自己提供的 goform 功能和

          ASP/javascript
功能. 最后的 2.1.8 版仍有不少bug. (见下
)
mini-httpd
thttpd 是同一家, 功能几乎完全一样
.

boa
缺陷
:
   (1)
未提供 CGI 解析头处理
.
        
可按这个地址方便修改
.
   (2)
POST 数据使用临时文件缓冲, 对无法创临时文件的小系统系统, 需要手工改下这部代码.
        
很多人报告在移植时不能POST 数据, 都是这个原因
.
   (3) ...

thttpd
缺陷
:
   (1)  CGI1.1
标准支持不完整(不般影响不大), 未提供对协议要求的其它HTTP头处理
,
         
:If-Modified-Since, Accept-Language等应用程序就收不到
.
   (2)
直接使用 socket CGI 应用的重定, 会导致提供大量 POST 数据时(如上传文件
),
        CGI
应用不读完全部 POST 数据就无法向浏览器应答
bug
   (3) ...

goAhead
缺陷
:
   (1)
专用, 如喜欢它提供的 goform asp 令论
.
   (2) CGI
对二进制输出有很多
bug.
   (3)
为实现单一任务处理, 在很平台采用延时轮询接收队列, 处理效率不高
.
   (4)
其它 bug 有不一罗列了, 移植时要一个个订下
.
个人观点, 仅供参考
.
Good Luck!

 

CGI, mod_perl, PHP, JSP性能比较

这是网上一篇关于CGImod_perl,PHP,JSP的性能比较的文章,从中可以看出它们的性能。

 

测试结果很大程度上依赖于机器的硬件/软件配置,并随配置变化而产生差异,因此: 
本测试结果 *仅供参考

测试用硬件:
 
CPU: Intel PII 300(66x4.5) 
RAM: 192M 
HD: IBM 20G(2M cache) 
测试用软件:
 
OS: Slackware 7(
自行编译的2.2.14核心

Web: Apache 1.3.12(
标准模块按缺省配置,所有模块静态编译

PHP 4.0 RC1(
加入了MySQL支持

mod_perl 1.23(
缺省配置,未加
EVERYTHING=1) 
ApacheJServ 1.1(
缺省配置

JDK: JDK 1.2.2 
JSDK: JSDK 2 
JSP: GNUJSP 1.0.0 
JSP: GNUJSP 1.0.0 

本测试是用Apache自带的Apache Bench(ab)进行的,命令为:
 
/www/bin/ab -c 20 -n 1000 CGI/
脚本
URL 
此命令表示使用 20 个并发连接,进行 1000 次请求。所有测试均在本机进行,各种测试均反复进行5次,去掉最大最小值后取平均值。 我分别测试了C写的CGIPerl写的CGI、用mod_perl执行的Perl CGIPHPJSP
 
各种CGI/脚本均输出内容相似的简单页面,内容如下:
 
html 
body 
h1The xxxx Hello Program/h1 

Hello xxxx World! 
/body 
/html 

测试结果(只取了最具代表性的 Requests per second 即每秒处理请求数这一项


CGI/
脚本类型     每秒处理请求数
 
C CGI            128 
Perl CGI          69 
mod_perl         223 
PHP             237 
JSP              21 

测试结论:    

除了JSP之外,其它几种CGI/脚本的表现大致是正常的。Perl程序解释执行,作为 
CGI
运行时又需要另外fork进程,所以最慢;mod_perlPHP都直接在httpd内部运行脚本,省掉了fork的消耗,所以快了很多;C程序虽然本应最快,但作为CGI 运行时也是因为fork而使性能大打折扣。至于JSP...我想这个结果并不具有代表性。毕竟测试用机只有192M内存,用top看看,一个JAVA就占了11M。况且测试用机本身是一台Web server,测试时还有好几十个httpd在跑不过不管怎么说,在配置较低的服务器上,跑PHPmod_perl在性能上要好过JSP是肯定的。
 
附测试用程序:
 

C
程序
 hello.c 
#include stdio.h 
int main(void) 

char s[] = "C CGI"; 
printf ("Content-Type: text/html "); 

printf ("html " 
"body " 
"h1The C CGI Hello Program/h1 " 
"p " 
"Hello %s World! " 
"/body " 
"/html ", s); 
return 0; 

 gcc -o hello hello.c 编译,把 hello 放到 cgi-bin目录下。
 

Perl
程序
 hello.pl 
#!/usr/bin/perl 
#!/usr/bin/perl 
$s = "Perl CGI"; 
print "Content-Type: text/html "; 
print <html 
body 
h1The Perl CGI Hello Program/h1 

Hello $s World! 
/body 
/html 
DONE 

hello.pl放到cgi-bin目录下,兼作Perl CGImod_perl 脚本测试用。
 

PHP
文件
 hello.php 
html 
body 
h1The PHP Hello Program/h1 


Hello ; World! 
/body 
/body 
/html 

JSP
文件 hello.jsp 

html 
body 
h1The JSP Hello Program/h1 

<% String s = "JSP"; %>; 

Hello <%= s %>; World! 
/body 
/html

Java ServletJSP的技术概述以及比较

Java Servlet及其特点

ServletJava技术对CGI编程的回答。Servlet程序在服务器端运行,动态地生成Web页面。与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是, Servlet程序员收入要比Perl程序员高:-):

高效:

在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。

在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择,比如缓冲以前的计算结果,保持数据库连接的活动,等等。

方便:

Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。

功能强大:

Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。

可移植性好:

ServletJava编写,Servlet API具有完善的标准。因此,为I-Planet Enterprise Server写的Servlet无需任何实质上的改动即可移植到ApacheMicrosoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet

节省投资:

不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。

JSP及其特点

JavaServer PagesJSP)是一种实现普通静态HTML和动态HTML混合编码的技术,有关JSP基础概念的说明请参见《JSP技术简介 》。

许多由CGI程序生成的页面大部分仍旧是静态HTML,动态内容只在页面中有限的几个部分出现。但是包括Servlet在内的大多数CGI技术及其变种,总是通过程序生成整个页面。JSP使得我们可以分别创建这两个部分。例如,下面就是一个简单的JSP页面:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"

HTML

HEAD><TITLE>欢迎访问网上商店</TITLE></HEAD

BODY

H1>欢迎</H1

SMALL>欢迎,

!-- 首次访问的用户名字为"New User" --

% out.println(Utils.getUserNameFromCookie(request)); %

要设置帐号信息,请点击

A HREF="Account-Settings.HTML"这里/A></SMALL

P

页面的其余内容。.

/BODY></HTML

下面是JSP和其他类似或相关技术的一个简单比较:

JSPActive Server PagesASP)相比

MicrosoftASP是一种和JSP类似的技术。JSPASP相比具有两方面的优点。首先,动态部分用Java编写,而不是VB Script或其他Microsoft语言,不仅功能更强大而且更易于使用。第二,JSP应用可以移植到其他操作系统和非MicrosoftWeb服务器上。

JSP和纯Servlet相比

JSP并没有增加任何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便,不必再用 println语句来输出每一行HTML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计专家进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。

JSP和服务器端包含(Server-Side IncludeSSI)相比

SSI是一种受到广泛支持的在静态HTML中引入外部代码的技术。JSP在这方面的支持更为完善,因为它可以用Servlet而不是独立的程序来生成动态内容。另外,SSI实际上只用于简单的包含,而不是面向那些能够处理表单数据、访问数据库的真正的程序。

JSPJavaScript相比

JavaScript能够在客户端动态地生成HTML。虽然JavaScript很有用,但它只能处理以客户端环境为基础的动态信息。除了Cookie之外,HTTP状态和表单提交数据对JavaScript来说都是不可用的。另外,由于是在客户端运行,JavaScript不能访问服务器端资源,比如数据库、目录信息等等。

 

Java很占内存吗?

使用Java平台进行嵌入式设备开发时,其对内在的使用量,会不会比使用原始语言如C/C++更大些呢?这取决于软件的复杂性。Java由于虚拟机和内库的原因,有可能会导致内存开销的增大。下面比较一下Java平台内存的占用情况(基于Sun的实现)

  CLDCConnected Limited Device Configuration,运算功能有限、电力有限的嵌入式装置,如PDA 、手机等):可工作于100KRAMJITJust In Time,即时编译技术)需要最大些。典型的部署要求500K-16MRAM

  CDCConnected Device Configuration,运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置,如冷气机、电冰箱等):VM约为250KJIT小于300KVM+JIT+基础类库约占2-2.5M典型的部署要求:4M-32M

  当然,内存的占用量还取决于应用的大小及内在的使用情况。可以看出,其实Java平台不会占用太大的内存。但是,这只是问题的一半。另一半是,Java代码最后部署时是以类文件来部署的,它主要是包括字节码和元数据。通过对CVM数据的分析,可以看出,字节码占据着大概30%的数据量。而采用JIT编译的代码相对于字节码而言,可以发现,内存的占有量增加了,并有一个7-8倍的ARM指令集。由于,可以估计:

  Java类转成字节码的速度≈1/30%≈3.3x

  原始语言转成字节码的速度≈7x

  这意味着,Java代码的内存使用量约为原始语言代码的一半。当然这只是非常粗略的估算,但却是合理的估算。

  使用JavaJIT后,只有那些使用频率高的代码才会被编译。而在系统中只是偶然被执行的代码则采用解释来编译。同时,JIT尽量使被编译的代码其内存占有量保持在一较小的范围内。CVMCDC所使用虚拟机),默认值为512K。而在一些较优秀的程序中,可以发现,其值为100K-300K

  这也就是说,使用Java编写的程序,只有使用频率比较高的代码才导致内存占用的增加。相反,使用C/C++编写的程序,整个代码都需要进行编译。因此,不能说使用Java语言编写的程序占用的内存就会比使用C/C++编写的程序大。这决定于软件相对于平台代码的复杂度及大小。如果软件规模比较大,Java平台所消耗的内存远小于Java类文件简洁性节约的内存,这种情况下,使用Java平台将有利于节约内存。如果软件的规模比较小,则Java平台消耗的内存就比较明显了,可以考虑使用C/C++来开发,以节约内存。

阅读(1100) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~