星期二, 六月 26, 2007

Symbian系统

Symbian是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,可以支持GPRS、蓝芽、SyncML、以及3G技术。最重要的是它是一个标准化的开放式平台,任何人都可以为支持Symbian的设备开发软件。与微软产品不同的是,Symbian将移动设备的通用技术,也就是操作系统的内核,与图形用户界面技术分开,能很好的适应不同方式输入的平台,也可以使厂商可以为自己的产品制作更加友好的操作界面,符合个性化的潮流,这也是用户能见到不同样子的symbian系统的主要原因。现在为这个平台开发的java程序已经开始在互联网上盛行。用户可以通过安装这些软件,扩展手机功能。
在Symbian发展阶段,出现了三个分支:分别是Crystal、Pearl和Quarz。前两个主要针对通讯器市场,也是出现在手机上最多的,是今后智能手机操作系统的主力军。第一款基于Symabian系统的手机是2000年上市的某款爱立信手机。而真正较为成熟的同时引起人们注意的则是2001年上市的诺基亚9210,它采用了Crystal分支的系统。而2002年推出的诺基亚7650与3650则是Symbian Pearl分系的机型,其中7650是第一款基于2.5G网的智能手机产品,他们都属于Symbian的6.0版本。索尼爱立信推出的一款机型也使用了Symbian的Pearl分支,版本已经发展到7.0,是专为3G网络而开发的,可以说代表了当今最强大的手机操作系统。此外,Symbian从6.0版本就开始支持外接存储设备,如MMC,CF卡等,这让它强大的扩展能力得以充分发挥,使存放更多的软件以及各种大容量的多媒体文件成为了可能。
Symbian按版本来分,继2005年二月Symbian推出一款新的手机操作系统软件OSv9.0,到目前为止已先后有了6.0、6.1、7.0、7.0s、8.0、9.0几种版本。1999年3月Symbian推出了Symbian5.0操作系统,它的主要内核集合了网络,无线文字,电子邮件,名片薄以及个人信息助理,同时还具有支持标准网络页面的浏览器,配合java语言的支持,使得Symbian可以运行小型的应用程序。不过这个版本采用的机型甚少,基本上与EPOC没有太多的差别。
Symbian 6.0则在5.0的基础上增加了,GPRS、WAP1.2浏览器以及蓝牙技术的支持,用户可以运行第三方基于C++和J2ME开发的程序。而Symbian 6.1则是和Symbian 6.0相比主要增加了对USB的支持。Symbian 6.0的主要特点是: 支持语音通话和数据通信 ,支持Bluetooth和WAP ,配备安全性功能(SSL,HTTPS,WTLS) ,采用16bit Unicode,支持多语言显示 ,采用“PersonalJava 3.0”和“JavaPhone 1.0” 。
Symbian 7.0则支持多模式和3G手机(专区),可以让制造商们可以面向全世界推出可以运行于所有网络之上的Symbian OS手机,而且可以不对代码进行重大改动的情况下就可以重新使用许多目前已有的软件应用。7.0包含一些新的通讯、消息、联网和应用开发技术,并对一些与安全和认证相关的功能进行了改进。Symbian OS 7.0的其他功能包括:支持灵活的用户界面,例如Nokia的Series 60;支持几种音频/图像格式和许多面向游戏开发人员的API;全力的加密和认证管理,基于安全通讯协议(包括HTTPS、WTLS和SSL)及认证的应用安装;和Over-the-air(OTA)SyncML同步支持。
2004年2月,Symbian在授权LG等公司的时候,发布了Symbian8 .0版本。该版本改善了实时系统性能,提高了原有操作系统的兼容能力。此外,Symbian OS 8.0的软件工具改进了远程接入控制系统功能,运用调节装置消除手机用户使用增值服务时会受到的干扰。这个系统包含了绝对现代化的多媒体和Java设备,支持多种标准,其中包括JSR118, CLDC1.1 (JSR139),MobileMedia (JSR135),3D图像数据(JSR184), JTWI 1.0 c(JSR185)。最后,新版OS还支持SDIO。
2005年二月,英国著名手机软件制造商Symbian推出一款新的手机操作系统软件OSv9.0,它支持更高像素数码相机与三维游戏动画。该操作系统软件对运行环境要求较高,目前运行在由英国芯片开发商ARM提供的快速处理器芯片,并且需要相关设计与其它工具的支持来帮助手机生产商在开发其它版本时能够节约时间和降低成本。该软件可以处理200万像素的数字图片,甚至能够向无线耳机传送立体声音乐,更可喜的是,它不需要同步软件就能够从PC上导出MP3文件。
Series60是智能手机中应用最广泛的系统版本。Series60系统还分为6.0 OS、7.0 OS和8.0 OS三个版本。区别Series60的最直观因素在于屏幕的分辨率,Series60支持的分辨率为176*208像素,但以后S60还会支持240*320像素、352*416像素等。S60是拥有最多第三方软件或游戏的界面。
识别Series80界面最简单的办法就是看手机是否支持全键盘,例如诺基亚高端系列的9210、9300甚至9500,都采用全键盘的。识别Series90的最简便方法是:会采用触摸屏幕,分辨率也高达640*320像素。Series90应该是手机游戏、娱乐的最强平台,但因为采用Series90界面的手机型号太少,第三方软件的支持很少,所以S60依旧是玩家首选。
S40或S60是指诺基亚手机的上层平台。S60都是智能手机,所用底层操作系统是Symbian。诺基亚128*128屏幕都是S40 1.0。而128*160是S40 2.0。
另外S40中,3100支持java MIDP 1.0,所以最大支持64KB的java;6230支持java MIDP 2.0,所以最大支持128KB的java40和60,包括90,还有以前的30,都是针对与nokia不同的操作系统而言40,是nokia自行研制的手机操作系统,面对于中低端客户,支持kjava的开发,其处理器效率不高,内存偏低,屏幕大小128*128。
S60,是基于Symbian 操作系统,也就是以前的epoc,其处理器为arm9,处理效率很高,内存颇大,屏幕大小为208*176同时支持kjava和C++的开发90,属于手持式设备,也是Symbian 操作系统但是功能强劲,等同于一个PDA了。
其实技术来上说,S40跟S60是区别在系统平台上,就好像WIN98跟WIN2000,但手机不像PC,屏幕大小的确是个关口,以致于平台不容易做到向下兼容,但有的游戏也同样做出不同版本来的。
当然啦,S40比S60不单单是屏幕上的差距,更大的是性能上的差距,一般来说,S60开发出来的游戏质量都比S40高好多,但可惜,S60比S40的机子又贵上了很多啊。

星期日, 六月 03, 2007

Apache运行时库中的进程锁 -- apr_proc_mutex 命名所的扩展

Apache运行时库中的进程锁 得到一个明确的事实,那就是apr实现的进程锁其实时无名锁,只能在fork出的父子进程中互锁。


然而,通过直接进行系统调用实现命名锁的有2个比较显著的问题,1,代码移植性不够好,posix或sysv,fcntl或flock等实现在不同的系统上接口会有所不同。2,代码封装与风格问题,到现在,越来越不惜欢没有经过分装的直接操作了!

所以,将apr_proc_mutex做了几个扩展操作函数,为apr提供了命名的进程锁。

APR_LOCK_PROC_PTHREAD机制的锁没有实现完毕,会出现SIGBUS错误,其他的模式在fedora core 6上测试都是没问题的啦!
扩展的procx_mutex可以去我的网站下载了,必须需要apr库,仅仅添加了一个头文件。

#include "apr_pools.h"
#include "apr_general.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_file_io.h"

#include "apr.h"
#include "apr_shm.h"
#include "apr_file_io.h"
#include "apr_proc_mutex.h"
#include "apr_errno.h"
#include "apr_general.h"
#include "apr_getopt.h"
#include "errno.h"
#include "assert.h"
#include "stdlib.h"


#define MAX_ITER 200
#define CHILDREN 6
#define MAX_COUNTER (MAX_ITER * CHILDREN)

void errlog(apr_status_t s, const char*log)
{
char errbuff[PATH_MAX];

if(log)
printf(log);
if(s!=APR_SUCCESS)
{
printf(apr_strerror(s,errbuff ,PATH_MAX));
abort();
}
}

int main(int argc, char* argv[])
{
apr_pool_t *pool;
apr_status_t rv;
const char* lockname = "/tmp/lock";
apr_lockmech_e mech = APR_LOCK_DEFAULT;
/*
APR_LOCK_FCNTL, fcntl()
APR_LOCK_FLOCK, flock()
APR_LOCK_SYSVSEM, System V Semaphores
APR_LOCK_PROC_PTHREAD, POSIX pthread process-based locking //Test failed
APR_LOCK_POSIXSEM, POSIX semaphore process-based locking
APR_LOCK_DEFAULT Use the default process lock
*/

if (mech==APR_LOCK_POSIXSEM)
lockname = "/posixlock";

static apr_proc_mutex_t *proc_lock;

apr_initialize();
apr_proc_mutex_unix_setup_lock_ex();

rv = apr_pool_create(&pool, NULL);
errlog(rv,"apr_pool_create\n");


#if USE_FORK
if(fork()!=0) {
#endif
if(argc==2 && strcmp(argv[1],"init")==0)
{
rv = apr_proc_mutex_create_ex(&proc_lock, lockname, mech, pool);
errlog(rv,"apr_proc_mutex_create_ex\n");

printf("Init OK\ndefulat=%s\nmutex=%s\nlocalfile=%s\n",apr_proc_mutex_defname(),apr_proc_mutex_name(proc_lock),apr_proc_mutex_ex_lockfile(proc_lock));

do{
errlog(0, "P Enter to lock\n");
getchar();
rv = apr_proc_mutex_lock(proc_lock);
errlog(rv, "P apr_proc_mutex_lock\n");
printf("P Enter to unlock\n");
getchar();

rv = apr_proc_mutex_unlock(proc_lock);
errlog(rv, "P apr_proc_mutex_unlock\n");
}while(1);
exit(0);
}
#if USE_FORK
}else {
#endif
printf("Child Mode\n");
// if (apr_proc_mutex_create_ex(&proc_lock, lockname, mech, pool))
rv=apr_proc_mutex_child_init_ex(&proc_lock, lockname, mech, pool);
errlog(rv,"C failed apr_proc_mutex_child_init\n");

printf("Init OK\ndefulat=%s\nmutex=%s\nlocalfile=%s\n",apr_proc_mutex_defname(),apr_proc_mutex_name(proc_lock),apr_proc_mutex_ex_lockfile(proc_lock));

do{
printf("C Enter to lock\n");
getchar();
rv = apr_proc_mutex_lock(proc_lock);
errlog(rv, "C apr_proc_mutex_lock\n");
printf("C Enter to unlock\n");
getchar();
rv = apr_proc_mutex_unlock(proc_lock);
errlog(rv, "apr_proc_mutex_unlock\n");
}while(1);

#if USE_FORK
}
#endif

exit(0);
return 0;
}