RECORDING MY FANTASY

Saturday, December 31, 2005

今年的南方周末的年度报告绝大部分都挺好的

感动的地方让我流泪;
人们说的真话让我心寒,不知道是该庆幸呢还是该担忧?

后来还看了南方人物周刊对崔永元的专访,佩服他!!!

想一想,还有谁呢?对了,陈丹青,徐本禹,还有登在南方周末岁末版上的其他人,当然说的是好人,坏人除外。

Sunday, December 25, 2005

陈凯歌说.......

陈凯歌去年说过, 拍《无极》就是为了证明,决定电影票房的不是电影本身好坏。

Wednesday, December 14, 2005

1.生活是不公平的,要去适应它;

2.这世界并不会在意你的自尊,这世界指望你在自我感觉良好之前先要有所成就;

3.高中刚毕业你不会成为一个公司的副总裁,直到你将此职位挣到手;

4.如果你认为你的老师严厉,等你当了老板再这样想;
5.如果你陷入困境,不要尖声抱怨错误,要从中吸取教训;

6.在你出生之前,你的父母并非像现在这样乏味。他们变成今天这个样子是因为这些年
来他们一直在为你付账单,给你洗衣服,听你大谈你是如何的酷;

7.你的学校也许已经不再分优等生和劣等生,但生活却仍在作出类似区分;

8.生活不分学期,你并没有暑假可以休息,也没有几个人乐于帮你发现自我;

9.电视并不是真实的生活,在现实生活中,人们实际上得离开咖啡屋去干自己的工作;

10.善待乏味的人,有可能到头来会为一个乏味的人工作。

Monday, December 12, 2005

expert's advices

  1. 毕业前学会写作
  2. 毕业前学会C语言
  3. 毕业前学习微观经济学(microeconomics
  4. 不要因为某些非计算机课程枯燥无趣就敬而远之
  5. 学习有大量编程实践的课程
  6. 不要担心工作都跑到印度去了
  7. 好好做夏季毕业实习

Friday, December 09, 2005

The Linux Mobile Phones Showcase

The Linux Mobile Phones Showcase
from www.linuxdevices.com,
Motorola is of cource the best one to produce linux mobile phones.

and many E28's linux phones come from Motorola..hehe

Yes, I think so.

Friday, December 02, 2005

这几次发的怎么都是乱码阿??

难道与用的微软拼音输入法的编码有关系?

---
Best Regards,
Xi Minjun(
郗闽军)
the Lab of Distributed and Mobile Computing
Beijing University
of Aeronautics&Astronautics

symbian?????????lib???

symbian?????????lib???

symbian60 sdk???????????????

conversion between char* and Descriptors

conversion between char* and Descriptors

char* pString === TPtrC8 buf(pString, User::StringLength(pString));
-----------------------
TInt len = ptrc.Length();

Mem::Copy(pString, ptrc.Ptr(), len);
pString[len] = 0;
----------------------------------
and Ptr() function is:
const TUint8* Ptr() const

Sunday, November 27, 2005

????

????

??
?????????
??????????????
?????????
?????????
?????????
?????????
???????
??????????
????????????
?????????
????

Tuesday, November 22, 2005

s60的字符串描述符翻译-from www.sf.org.cn

Symbian平台的主要的描述符的特点现归纳如下:
1      字符串和二进制数据采用相同的处理方法
2      数据可以被放置到任意的存储器中,无论是ROM还是RAM,也无论是在栈上还是在堆上。
3      每个描述符对象(descriptor object)都包含了指向数据的指针和该指针指向的数据的长度信息。一些描述符甚至包括了其最大可以容纳的数据长度。

 

下面的图例表示出了描述符类之间的派生层次关系,

http://www.newlc.com/IMG/png/descriptors.png

所有的描述符都是从TDesC这个虚基类中派生出来的。这些描述符总的来说分为三种:
1      缓冲区描述符:TBuf类和TBufC

2)         堆描述符:典型例子是:HBufC

3)         指针描述符:TPtr类和TPtrC 

指针描述符可以用来等价替换经典C/C++中的以下两种类型:
a)      TPtrC ――
const char *
b)      TbufC ――
char []
但是其他的类在经典C/C++中就没有相应的数据类型了。

TDes类和TDesC类是虚基类,所以你不能够直接将他们实例化。它们主要用于做为函数的形参,方便的操作字符串和二进制的数据。

在这种类型的函数中,你可能会用到:
1      const TDesC& 做为只读的字符串或二进制数据的传递
2      TDes & 做为你需要修改的字符串或数据在函数间的传递

 

所有的描述符都有单位数据的宽度的限制,例如:TDes8,TDes16,TDesC8,TDesC16,TBuf8, TBuf16,等等,其中的后缀8代表了这个描述符是用来操作8位的数据的,而16则代表可以操作16位的数据内容。通常情况下,你可以使用更加自然的文本数据的表示形式:TDesTDesC.

 

字符串常量的定义

                字符串常量通常可以利用_L()宏和_LIT()宏来定义

_L()
宏从常量字符串中可以得到TPtrC的指针,它在向一个函数传递字符串常量的时候尤其有用。例如:
NEikonEnvironment::MessageBox(_L("Error: init file not found!"));

_LIT()
用于生成在程序中可以重复使用的、全局的常量字符串,并且可以为该字符串方面的命名。例如:
_LIT(KMyFile,"c:\\System\\Apps\\MyApp\\MyFile.jpg");
上面这条宏的结果就是:KmyFile可以做为后面字符串的代替品,用在任何需要传入TDesC&参数的地方。

 

使用方法:
最常用的函数都定义在TDesC虚基类中。列举如下:
1      Ptr()――用于得到指向描述符中数据的指针
2      Length()――用于得到描述符中数据单位的长度(或者在存放字符串时表示字个数)
3      Size()――用于以字节为单位表示描述符中数据的长度
4      Compare()以及重载的==!=>=<=用于描述符对象之间的比较
5      重载的[]运算符,用于从一个描述符中取出指定的一个数据单位,类似数组的使用方法

 

 

 

---
Best Regards,
Xi Minjun(
郗闽军)
the Lab of Distributed and Mobile Computing
Beijing University
of Aeronautics&Astronautics

 

看代码就一定得在上面加上自己的注释吗?

?????

!!!!!!!

Sunday, November 20, 2005

转贴人生的34个好习惯,共勉

1. 不说“不可能”三个字。
2. 凡事第一反应:找方法,而不是找借口。
3. 遇到挫折对自己大声说:太棒了!  
4. 不说消极的话,不落入消极情绪,一旦出现立即正面处理。
5. 凡事先订立目标,并且尽量制作“梦想版”。
6. 凡事预先作计划,尽量将目标视觉化。
7. 工作时间。每一分,每一秒都做有利于生产的事情。
8. 随时用零碎的时间(如等人、排队等)做零碎的事情。
9. 守时。
10. 写下来,不要太依靠脑袋记忆。
11. 随时记录灵感。
12. 把重要的观念,方法写下来,并贴起来,以随时提示自己。
13. 走路比平时快30%,走路时脚尖稍用力推进,肢体语言健康有力,不懒散,萎靡。
14. 每天出门照镜子,给自己一个自信的微笑。
15. 每天自我反省一次。
16. 每天坚持一次运动。
17. 听心跳一分钟,指在做重要事情前,疲劳时,心情烦躁时,紧张时。
18. 开会坐在前排。
19. 微笑。
20. 用心倾听,不打断对方说话。
21. 说话时声音有力。感觉自己声音似乎能产生有感染力的磁场。
22. 说话之前,先考虑一下对方的感受。
23. 每天有意识,真诚地赞美别人三次以上。
24. 及时写感谢卡,哪怕是用便笺写。
25. 不用训斥,指责的口吻跟别人说话。
26. 控制住不要让自己做出为自己辩护的第一反应。
27. 每天做一件“分外事”。
28. 不管任何方面,每天必须至少做一次“进步一点点”。
29. 每天提前15分钟上班,推迟30分钟下班。
30. 每天在下班前用5分钟的时间做一天的整理工作。
31. 定期存钱。
32. 节俭。
33. 时常运用“头脑风暴”。
34. 恪守诚信,说到做到。

Friday, November 18, 2005

uml--菱形、箭头的意义

From www.umlchina.com/best/g20/g1265.htm

  1. 菱形表示两个类之间的关联关系是是聚合关系。聚合关系表示的是两个类是整体与部分的关系。其中菱形一端的类是整体,另一端是部分。比如:公司与部门两个类之间关系就可以用聚合关系描述。
    箭头表示可访问性,即箭头所指的一端能被另一端访问,逆向则不行。
  2. uml_learner兄说得还不够完整。空心的菱形表示聚合,实心的菱形表示组合。可以参考一下《UML参考手册》中的说明。
  3.  

 

---
Best Regards,
Xi Minjun(
郗闽军)
the Lab of Distributed and Mobile Computing
Beijing University
of Aeronautics&Astronautics

 

Wednesday, November 16, 2005

study network programming under windows....(winsock2)

虽然比起linux下面的socket programming来有一些别扭,但是还能忍受。

基本的函数

WSAStartup()
socket()
bind()
listen()
accept()
send()
recv()
--------------
connect()
-------------
sockaddr_in类型实例的创建也应该注意一下:
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(80);

Sunday, November 06, 2005

字符串匹配-超级常见的面试题 (from sjtu_bbs)

字符串匹配。。。超级常见的面试题。。。。看到就直接kmp才对。。。

Saturday, November 05, 2005

==两个故事==


上有政策,下有对策--中国人的传统?
两个故事均系转载!!
故事一
  不久前我回到西北那所读了六年多的大学,惊奇地发现校园里房前屋后长满了待收割的小麦!这所大学是从事电子科技的,种小麦干啥呀?朱总理曾讲过:“目前国家粮食充足,再来三年自然灾害也不怕。”现在国泰民安,似乎用不着“深挖洞,广积粮”。我素知学校提创勤俭节约、自力更生,但与其种小麦还不如种蔬菜呢。老同学告诉我,种小麦是为了应付“211”工程(为21世纪选拔100所重点大学)的检查团,因为“211”工程有较高的绿化指标。偏偏检查赶在冬天,那时的西北极难长草。我那所大学本来就人多地少,地上一长草马上就会被谈恋爱的学生给折磨死。一到冬天,整个校园就光秃秃一片。用小麦绿化校园可谓千古绝笔,检查团的那些权贵人士早已五谷不分,岂知所见的“草坪”乃是麦田。

检查工作要预防被检查者弄虚作假。

故事二
  我上高中时,班里举行一次入团评审。侯选人中有几位是好学生,有几位是坏学生。我心想“伸张正义”的机会到了,绝不能让坏蛋混进纯洁的团里。可天知道团支部书记是聪明绝顶还是蠢笨之极。他竟说:“班里还有一些同学没有入团,现在他们申请入团,有不同意的请举手。”我们都不知道该怎么办了。书记接着说:“既然没有人举手反对,就表示全部同意,请大家鼓掌欢迎。”这次入团评审不到一分钟就结束了,从此后我再也没想过争取入党。

检查工作要有科学的评审方式。

Thursday, November 03, 2005

Symbian编码规范

1.通常
第一个字母大写(除非特别指明不用)
所有单词连接在一起
除了宏和资源标识之外,避免使用下划线 _
e.g.:void TObject::PrepareForCommit(); class CGlobalText;
2.自动变量(局部变量)
第一个字母小写
需要时才声明自动变量
永远不要在同一行初始化多个变量
3.全局变量
不鼓励使用全局变量
大写字母开头
非常量的全局数据在DLL中是不支持的;最好使用线程本地存储(T.L.S.)
4.宏
所有字母大写
用下划线分隔单词
IMPORT_C,EXPORT_C,_TEST_INVARIANT
5.指针和引用类型
*或&放在类型旁边,而不是变量名旁边
6.类名
类名通常只能以C,R,T,M开头
结构用T开头
静态类没有前缀字母
驱动类用D开头
7.方法名
通用规则有效
Setters通常是SetThing()
Getters通常是Thing(),(如果该方法返回数据项的话)
“Get”用于获取引用
以L结尾的方法表示可能Leave
以C结尾的方法表示其中将数据项放入了cleanup stack中
以D结尾的方法表示其中的对象
8.成员变量
以i开头.e.g.:
class TObject
{
TType iType;
Tint iElemementOffset;
TPtrC iComponentValue;
}
9.方法变量(参数)
以a开头
在元音前也不使用an
最好使用方法重载,而不是缺省参数,这样可读性好,并且更加高效
10.常数
K开头
单词开头大写
11.枚举
应当被包含在相应的类中
不要全局命名空间
必须用一个有意义并且无歧义的名字
T开头
每个枚举成员E开头
特定类中的常量可以实现成枚举型,这种情况下,可以使用K

Symbian Notes (1)

Symbian Notes
基础概念
1. 线程------执行的单元。同一个进程的线程共享地址空间。调度器 (schceduler)负责对线程(而不是进程)进行调度
2.进程------内存保护的单元. 一个进程不能访问其他进程的内存空间。

3.抢先式多任务-线程根据优先级进行调度。
4.context switch
5.active object
Symbian OS用来处理异步方法调用的特殊对象
使得进行合作的多个线程能够更加有效的利用资源
6.Heap/Stack
线程使用的内存空间
堆必须显式的申请和释放
栈空间由OS负责管理
7.Leave
Symbian OS的错误处理机制
与trap harness一起使用
与标准C++中的catch/throw机制类似
8.Panic
致命错误
Panics要么由OS触发,要么由一个出现了严重错误的用户线程触发

Tuesday, November 01, 2005

TVBS《笑傲江湖》版

TVBS《笑傲江湖》版

新闻:国际 2005-11-01

新加坡联合早报(www.zaobao.com)

● 易锐民

  话说金庸先生有意改写武侠小说《笑傲江湖》,但有六个人反对,他们就是“
桃谷六仙”,所持的反对理由是,他们坚持要做“嘴巴第一”,不想被删改。

  最近“六仙”就为一件发生在台湾的事斗嘴。

  只听桃干仙说道:“你们瞧,TVBS与TVB就差那一个S字,它们是两父子,TVB是
香港公司,TVBS是这家香港公司的子公司,也就是100%‘香港制造’,是香港资本
。”

  桃实仙接着道:“香港已回归中国,所以,正确的说法应该是:中国资本。”


  桃枝仙道立即摇头大叫:“不对不对,香港有很多人姓陈,台湾的总统也姓陈
,不能因为总统姓陈,就说台湾人与香港人是直系亲属。”

  桃叶仙道:“不错,TVB的大老板姓邵,他早在香港回归前,已获得英国人册封
为‘Sir’(爵士),所以,他的公司应该属于英资。”

  “哈哈,哈哈,此言差矣!”桃根仙笑说:“你们都不读一点历史,邵爵士是
在新加坡起家的,他的公司是新加坡资本才对。”

  桃干仙很不服气,说道:“大哥,别的事我很佩服你,但在这个什么资的问题
上,我只坚持一条:无论是港资、中资、英资、还是新资,总之都是外资。”

  这时候,刚刚睡醒的桃花仙打了一个呵欠,问:“你们在吵什么?刚才我发了
一个恶梦,被五个恶人追问‘什么资’,我答了一声‘台资’,竟然被人追打。”


  五仙立即群情汹涌。桃根仙怒说:“谁敢欺负六弟,我们就是‘台资’的,要
打六弟,就先打赢我们。”

  总喜欢跟桃根仙唱对台戏的桃干仙,又按捺不住了,说:“唏,大哥,你的说
法又错了,你怎么说‘我们就是台资的’,桃谷六仙的爸是港资,妈是台资,我们
是港台资。”

  “港台资不就是台资的一种,反正里面有台资……”

  “那为什么不说港台资是港资,反正里面有港资……”

  “你们又错了,香港己回归中国,所以只有中台资,没有港台资。”

  “但邵逸夫本来是新加坡人,不是应该说是新资吗?”

  桃谷六仙一面各运真气,一面兀自争执不休,却不知这些日子之中,早已将两
岸四地华人体内的经脉,搅得乱七八糟。

(故事纯属虚构,如有雷同,实属巧合)

水木上面有好多经典的joke!!

以后无聊的时候就上水木。哈哈

Monday, October 31, 2005

深入浅出Visual C++动态链接库(Dll)编程

深入浅出Visual C++动态链接库(Dll)编程

介绍动态链接库如何使用的,应该值得一看。

NewsForge | Finding voice codecs for free software

NewsForge | Finding voice codecs for free software
In a recent article about VoIP softphones, I touched on the problem of proprietary, patent-encumbered codecs. To recap, the point was that a triumph of open protocols, like Session Initiation Protocol (SIP) and Inter-Asterisk EXchange (IAX), is hollow if the marketplace standardizes on closed, proprietary codecs for delivering the voice data itself. But how do you find the good free codecs? Here are some options.

If softphone vendors adopt only proprietary codecs, Linux distributors and software vendors will be forced to either pay royalties and license fees to the patent owners, or remove support for the popular standards, leaving their users in a VoIP ghetto -- much like the situation today with many distros and MP3.

But not-for-profit software projects would suffer, too, by being forced to choose between poor interoperability and running through a legal minefield. And that is assuming that the specifications were open enough to permit coding a compliant library; many commercial codecs are completely off-limits to unpaying eyes.

Clearly, an ounce of prevention is worth a pound of cure here. Most softphones can support multiple codecs. The trick is making sure free ones are promoted and adopted as widely as possible. Even closed source applications can and should support free codecs. It's good business sense -- particularly the can't-get-cheaper-than-free licensing.

If you are not sure which voice codecs are free and which are not, you are not alone. Clear information on the legal status of many codecs is hard to come by, and what is available is scattered in a hundred different places. Here's a rundown of what's out there.

Free as they get

First off are the codecs that I would call completely free: free of patents, free of all licensing restrictions, and free of royalties.

Speex is a voice-specific compression format developed by Xiph.org and released under a BSD-style license. It works at 8, 16, and 32kHz sample rates over a dozen bitrates ranging from 2.2Kbps to 44.2Kbps. Speex is an official part of the GNU Project, and the copyright to the code belongs to Xiph.org -- a 501(c)3 non-profit organization established to protect open multimedia standards and software.

Sun Microsystems released implementations of several codecs into the public domain, including G.711, one of the older ITU-approved standards, a low-delay, high-quality format at 8kHz, 64Kbps.

Sun also released a suite of Adaptive Differential Pulse Code Modulation (ADPCM) codecs into the public domain. They correspond to the International Telecommunication Union (ITU) G.721, G.723, G.726, and G.727 standards and function at 16, 24, 32, and 40Kbps.

Mostly free

A second group comprises codecs that are usable in free software projects, but with some form of restriction.

Jack Jansen released his own, faster ADPCM implementation built on an algorithm referred to alternately as Intel/DVI or IMA ADPCM. The algorithm initially debuted in an Intel hardware device, but was later adopted as a standard by the now-defunct Interactive Multimedia Association. The accompanying license requires a copyright notice but is otherwise free of restrictions. Jansen's implementation of ADPCM is available for download as a zip file.

Similarly, a Linear Predictive Coding (LPC) codec named OpenLPC requires a copyright notice for redistribution, although the company cited in the notice (Future Dynamics) appears to be out of business.

The US Department of Defense drafted two voice-compression proposals: a 2.4Kbps derivative of LPC called LPC-10, and a 4.8Kbps hybrid called Code-Excited Linear Prediction (CELP). They are officially known as Federal Standard 1015 and Federal Standard 1016, respectively, and are available from Tony Robinson's comp.speech archive.

The US government holds the copyright on this code, but has indicated in the past that it may remove it. Also, certain countries under sanction or embargo may be barred from obtaining the source. On the other hand, none of the technology is patented, so independently developed implementations are free of these legal concerns.

Ramalho G.711 Lossless (RGL) is a G.711 implementation offered by Vovida.org under the Vovida Software License (VSL). The VSL is an open source license, approved by the Open Source Initiative (OSI), but it does require a copyright notice. Vovida.org is a unit of Cisco Systems.

Barely free

Next are codecs which are patented, or otherwise closed, but are free to use under certain conditions.

GlobalIPSound offers its Internet Low Bitrate Codec (iLBC) codec free of charge. This is good, because many programs use it, but the license terms allow GIPS to change its mind at any time, so watch out.

VoiceAge of Montreal offers object code for three of its codecs free for non-commercial usage. They are (cynically, if you ask me) named Open G.729A, Open AMR, and Open AMR-WB. To use them you must accept the restrictions in the license agreement, so read very carefully; frankly, there is not much that you are allowed to do.

Maybe free

Finally, some codecs are available under confusing or disputed license arrangements. I include these in case you wish to research them further. In the meantime, use them at your own risk.

The Low-Delay Code Excitation Linear Prediction (LD-CELP) codec, also known as G.728, is a good example. It is an enhancement of the CELP codec and released publicly, but with no license attached. At least two versions of the code are floating around, one attributed to Alex Zatsmann of Analog Devices and one to Michael Concannon. Some sources cite Analogical Systems as the owner.

GSM6.10 is the audio codec used by GSM mobile phone networks. A well-maintained free implementation of this codec is available, but there are disputed patent claims by Philips Electronics.

Be aware of the potential consequences when using any codec with unclear licensing terms.

Final word

Most of the sites referenced above contain more information about voice compression in general, including where to find updated implementations. Many of the free codecs date back to the early or mid-'90s, but don't be fooled into thinking that makes them out-of-date.

Phil Frisbie has put a lot of work into his HawkVoice library -- a LGPLed collection of 15 or so of these free voice codecs, rewritten to use a uniform interface. He told me:

When GSM was created a workstation could not encode and decode a single voice stream in real-time, but now your PDA can encode and decode a dozen GSM streams at once! Open source developers should not worry that the latest IP-laden codecs are denied to them. There is STILL much life in already available open source codecs to provide any application with good speech compression.
Lucky for us the VoIP marketplace is nascent enough that no dominant codecs have emerged in competing systems. There is still time for free and open codecs to make a play for the current generation of softphones. As Richard Stallman said, "The practice of using the non-free codecs is one of the major obstacles that free software faces, and the only way to surmount it is for people to start pushing back."





Related Links
· Intel
· Linux
· Speex
· BSD-style license
· GNU Project
· Xiph.org
· G.711
· Adaptive Differential Pulse Code Modulation
· Jack Jansen
· adopted
· Interactive Multimedia Association
· zip file
· two voice-compression proposals
· comp.speech archive
· offered
· Vovida Software License
· Open Source Initiative
· Vovida.org
· unit of Cisco Systems
· GlobalIPSound
· free of charge
· license agreement
· released publicly
· Some sources
· free implementation
· HawkVoice
· said
· a recent article
· Best deals: Free Software
· More Free Software stories
· Best deals: Internet
· More Internet stories


Sunday, October 30, 2005

Damien Sandras >> Weblog

Damien Sandras � Weblog
gnomemeeting's blog.
gnomemeeting支持sip协议下的视频、音频传输。

Saturday, October 29, 2005

IETF主席网络大会上高度评价VOIP

IETF主席网络大会上高度评价VOIP
10月28日,网络世界大会2005暨第四届以太网世界大会(www.networkworld2005.com.cn)在京举行。首次来华的国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)主席Brian E. Carpenter出席会议并高度评价了VOIP在下一代互联网发展中的重要性。

  IETF是一个公开性质的大型民间国际团体,致力于互联网相关技术标准的研发和制定将近20年,汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员。

  Brian曾经是IBM公司内一位专注互联网标准和技术的资深工程师,在今年3月举行的第62次IETF大会上他接任IETF主席一职,此前他曾任互联网架构委员会( Internet Architecture Board)主席以及互联网工程指导委员会(Internet Engineering Steering Group)主席。

  在今天主题为“IETF-Internet标准的发展趋势”的演讲中,Brian表示,无论传统的电信运营商是否喜欢,未来,VOIP都将会产生巨大影响,“这是不可逆转的”。而鉴于互联网总是在不断发展和进步, VOIP之后,还会有更多新的东西被年青的人们发明出来。

  此外,由于许多人已经感受到了IPV4在地址上的局限性,Brian相信,未来人民对IPV6的需求将会巨大。

  而对于目前炒的火热的NGN(下一代网络),Brian显得有些不以为然,他说自己并不认为NGN能代表未来网络, “它仅仅是未来网络中一个比较重要的组成部分。”

  Brian强调,在互联网未来的发展中,下一个标准是什么其实并不重要,重要的是不断完善和发展互联网基本结构,不断提升网络接入能力。

Friday, October 28, 2005

据说比尔-盖茨在中国哭了一通

据说比尔-盖茨在中国哭了一通

作者:为你飘零

有人消息说比尔 盖茨在中国哭了.为什么哭了,说法不一.

有人说,他是看到中国的一则报道后哭的.这则报道说,2003年"非典"期间,中华慈善总会总共才收到了770万元捐款,其中只有一个富人以个人名义捐了200万元人民币.一个13亿人口的泱泱大国,百万美元以上的富人超过了23万名,在亚洲仅次于日本.当国家面临那么严峻的灾难时,收到的捐款只不过700多万元人民币,而且23万多名百万美元以上的富翁中仅有一人捐了款,只有23万份之一.难怪比尔 盖茨要哭.不仅仅是他要哭,凡是一个有责任感的中国人都会敢感到悲哀,都会感到心痛.不是早有经济学家说"富人有功"吗,为什么到该立功的时候,把头缩进了乌龟壳里去了呢?

也有人说,他不是为这事哭的.他是为了有人批评美国钢铁大亨卡耐基说的一句话而哭的.卡耐基说的这句话是"富人在道义上有义务把他们的一部分财产分给穷人".据说有位中国富人却说"自己创造的财富是自己的,没有义务送还社会".比尔 盖茨是卡耐基这句话的忠诚实践者,他在4年里给慈善事业的捐赠达235亿美元,相当于他现有净资产的60%.他怎么也想不通啊,竟然有人也敢说"没有义务把它返还社会".在美国也经常有人批评比尔 盖茨,说他捐款1亿美元给印度人做抗爱滋病研究,是为了获得免税权;他给学校捐献电脑和电话,说他是做广告,反正他自己也觉得是不该赚这么多钱了.

不管比尔 盖茨是为什么而哭的,我还是觉得他哭的有些道理.有那么些人总说国人有"仇富心理",我不知道这"仇富心理"具体指的是什么.按道理说,大家都喜欢富裕,不然为什么一提实现全面小康社会,有那么多人拥护.看来"仇富心理"不是指这个富,"为富有仁"是大家欢迎的,自然不会对"为富有仁"者产生仇恨心理.那是指什么呢?


不知道你看了这件事后有何感想,长沙街头明星们烤一个肉串,有人花一万元抢着买;50克不起眼的茶叶有人花2万元买下.然而那些躺在医院里无钱治病的老人,那些无钱上学的准大学生,他们也许只要几千元就足够挽回一条生命,或者能够凑足上大学的费用,可是又有谁来"买"他们的帐.相比之下,富人们的"斗富"比起他们的"怜贫"要重要得多了.


钱是富人们自己的,他们想怎么花有怎么花,谁也不会去干涉他们的.他们愿意给谁就给谁,谁也不会强迫他们.但想想今天,800多万一辆的宾利豪华轿车在中国市面上竟然供不应求,这就有些令人怀疑了.比起那些发达国家要穷的多的中国,竟然成了豪华轿车最大的销售市场,连美国'日本人都觉得自愧不如.人们不得不产生疑问,中国的富豪是否富得太容易? 太快了?


富人们的钱是怎么赚来的,这是人家的商业秘密,我们无须去打听.但马克思说的剩余价值是劳动创造的,资本是只能转移价值而不能创造价值的,不知道老祖宗的这些话现在还管用么?没有大多数人的辛勤劳动,少数人是富不起来的.多数人也希望少数人富裕起来能够带动更多的人富裕.中国不是富起来的人多了,而是太少了.但是富起来的人就该纵欲?就该挥霍?就该置国人利益于不顾?

比尔 盖茨哭了---次事是否属实,我看也没有必要去考证了.中国人的事,外国人是不会着急的.对于富人的奢侈的议论,似乎也因为人微言轻而不足道.但我们这个社会还是应该有一个尺度.墨子曰:"富贵者奢侈,孤寡者冻馁,虽欲无乱,不可得也".但愿这种担心是多余的.

PDFlib - 用于制作pdf的库,

浅谈PDFlib中文输出
这篇文章是用来介绍怎么利用里面的中文字体的,因为作为国内用户是非常关心这个的,呵呵。

里面给出了例子,显示了怎么调用里面的字体,以及怎么用pdflib的库来编写程序。

---------
自己也可以做一个pdf的编写阅读的程序啊!!--YY

VoIP: Why Skype is no different

VoIP: Why Skype is no different

IPR--write a patent proposal with pdf format, deadline: nov 20

1. Indicate whether the idea is yours or not
2. An abstract
3. A description with:
a) Proorart
b) background
c) problem targeted
d) waringings if any
4. claims. i.e. what are new for waht you are doing.

Wednesday, October 26, 2005

在 Borland C++BuilderX for Windows 中进行 GTK+ 编程

By Xinzhen (LoneStar) xinzhen@auvtech.com

http://auvtech.com/~xinzhen/bcbxgtk/index.htm
BCBX
在经历了一系列失败的“跨平台”努力后,独立工具软件商 Borland 的最后希望寄托在了 C++BuilderX,这个工业级的重型 C++ 开发环境上。C++BuilderX 与先前的 BC 或 BCB 有着显著的不同。不仅仅在于其使用 Java 写的 IDE,更本质的特征在于其旗舰级的定位,使它终于获得了人们期待已久的、与“C++”这个词相称的特征:高度标准相容的语法,开放,兼容,独立于平台。





GTK+
GTK+ 是一个用于构建用户界面的跨平台工具箱。与其说是用户界面,更精确的描述应是一个“框架”,集成了开发一个图形界面程序所需的所有底层架构,如信号传递机制,异步 I/O,字符集与编码处理等。目前的稳定版是 2.2.4。随着功能不断提升,它的应用也日趋广泛。相对于别的商业级应用程序框架,这个库使用了极其宽松且对商业友好的 LGPL 许可证,使它获得了越来越多的重视。

GTK+ for Windows
然而,虽然 GTK 架构中有一层又一层的封装层,来最大限度地实现平台无关性,但其来自于 Unix 世界的本质使得其要运行于 Windows,仍然需要用户搭建复杂的环境来编译和设定。幸好,半“官方”的 Windows 移植发布版已经出现,位于 http://www.dropline.net/gtk/index.php。从这个网站上可以下载到编译好了的 GTK+ for Windows Runtime Environment 与 Development Environment(对应于 Linux 上 gtk2 及 gtk2-devel 包),以及如何在 VC 中使用此库的简单介绍,甚至还有如何制作安装程序的简介。

从此站上下载到的发行版内置了一个主题引擎 Wimp。当这个主题引擎运行于 Windows XP 时,会调用 Native 的 XP 主题 API,获取如颜色方案、字体和贴图等信息,从而获得一个与 XP 完全一致的 Look and feel。当然,如果不是 XP,就只能用模仿的方式绘制控件,但至少颜色还是一致的。

BCBX with GTK+
当 BCBX 1.0于去年底发布时,一来由于时间仓促,二来作为工业级产品,“图形界面”所占比重较小,总之其中并未携带任何用于协助图形用户界面 (GUI) 开发的元素。

BCBX 的开放性体现在,支持 3 个平台,5种不同编译器。Intel 及 Microsoft 的编译器都列为支持。最让人意外的是,GNU 的 GCC 也在列表中,并且将随安装程序一并自动装入你的系统,无需任何额外的下载、安装步骤,即可使用:


其版本显示为“GNU C++ version 3.2 (mingw special 20020817-1) (mingw32)”

这一特征不禁让我们产生联翩浮想。这意味着无数的,GNU 或 非 GNU的,open 的 sources 将有简单的方法可以在 Windows 上使用了。GTK+ 当然就是其中之一。

配置 GTK+ for Windows 环境
我们现在就安装上述的 GTK+ Windows 发行版。这个发行版有着漂亮的安装程序,从哪方面看都是标准的 Windows 应用程序。真正的“跨平台”,就要做到融入所在的平台中去,与其他应用有相同的外观和行为特征,成为 Native 的应用。那种自成一体,与环境格格不入的程序,不能叫跨平台,而是自己就是平台,且只能运行于自己的平台上而已。

首先从这里下载 Runtime Environment。目前版本 2.2.4.1。



装上后,*.DLL 形式的动态库装入了 C:\Program Files\Common Files\GTK\2.0\lib中。为了让系统能找到它,我们需要为它设定 $PATH 环境变量。在 Windows 2000 上的设定方法是这样的。按组合键 Win+Pause,如果你没有 104 键 Windows 键盘(稀有动物)就只好在“我的电脑”(其实是你的,不是我的)上点右键,选属性。选 Advance 标签,点击 Environment Variables... 按钮。在对话框中寻找 Path 变量,没有的话新建一个。编辑其内容加入上述路径。



好,现在我们下载并安装 Development Environment。本例中我将它装到了 D:\GTK2DEV,后面的设定将以此为准。你可以自行酌情更改。






装好后,测试一下是否正常。去到目录 D:\GTK2Dev\share\gtk-2.0\demo 中,运行 gtk-demo.exe。如果看见界面,那么安装成功。

配置 BCBX 环境
GTK+ for Windows 站点上有很详细的如何在 Windows 上编译和运行的指令。但他们太复杂了,我通过在 BCBX 中新建一个项目,来 step by step 地简要描述一下。

STEP1:
我们在 BCBX 中新建一个项目,类型选择 New Console。



别急,我没搞错。尽管我们要开发的东西确实是 GUI的,我们选的也不是 New GUI Application,否则你就要为找不到 argc 和 argv 烦恼了。我将项目命名为 gtkhello。

STEP2:
现在,为了能编译这个项目,首先,我们教编译器去哪寻找 GTK+ 的头文件。在左上角项目名上点右键,选择“Build Options Explorer...”。在出现的对话框上部选择“MinGW GNU C++ Compiler”,在下部 Paths and Defines 标签中,include path 框里添加如下字符串:

d:\GTK2DEV\INCLUDE\GTK-2.0; d:\GTK2DEV\LIB\GTK-2.0\INCLUDE; D:\GTK2Dev\include\glib-2.0;
d:\GTK2DEV\LIB\GLIB-2.0\INCLUDE; D:\GTK2Dev\include\pango-1.0; d:\GTK2DEV\INCLUDE\ATK-1.0;
d:\gtk2dev\include









STEP3:
教我们的链接器如何链接对 GTK+ 程序的调用。在同一个对话框中,上部选择“GNU C++ Linker”,底下标签页中就会出现 library search path 框。在其中输入

D:\GTK2Dev\lib
在这个目录中存放着与每个 DLL 对应的 LIB 静态接口库。然后,我们转入 Options 页,在 Linker Options->Search for library LIBNAME 后面,输入如下字符串:

glib-2.0;gtk-win32-2.0;gdk-win32-2.0;gobject-2.0;gdk_pixbuf-2.0;gthread-2.0;gmodule-2.0;pango-1.0
这些就是所有接口库的名字。至此,所有设定完成。我们打开 2 年前登在 IBM developerWorks 网站上的 《GNOMEnclature: 为 GNOME 2 作好准备,第 1 部分 》一文,将“清单2”程序贴进我们刚刚生成的 untitled.cpp 中,从工具栏上点击 Make。编译过程应该很快就完成了。

STOP! Bitfields 与 对齐 align
CPU访问内存时,总是以其整数字长为单位读写。比如 x86 CPU 总是从4字节的整数倍数地址上,读取4字节数据,它不能随心所欲地从任何位置开始读取任意长度数据。为了效率考虑,默认情况下编译器总是让整数存放于其长度的整数倍数地址上。在一个结构中,为了做到这一点,有时不得不浪费几个字节。

举个例子,我们定义一个结构:

struct { char c; int i;};
从字面上看,这个结构的长度是5个字节,但默认情况下编译器总是分配8个字节,是为了让 i 出现在偏移量 4 地址上。

位域 bitfields 是 C 语言结构中的一个成员,可以指定该成员所占内存的位数 bit。然而,在位域的对齐方式上,GCC和MSVC这2个编译器产生了巨大的分歧。现在,我们将上面这个结构改成下面这样子:

struct { char c;
int b: 1; int i;};
我们在 c 和 i 中插入了一个只占 1 位内存的整数。在 GCC 中,我们测试该结构的长度,发现仍然是 8 个字节,就是说 b 利用了 c 和 i 间的空隙,而没有多占空间。然而在 VC 中我们会发现,结构长达 12 字节。也就是说 b 像其他所有整数一样,在4倍数地址上对齐了。

如果仅仅这样还好办,不幸的是,如果你在b后面再插入一个位域 b2,长度还是12。而如果插入一个 short 型的位域,长度将变成16!

其原因在于 VC 使用了一种古怪的对齐方式,且没有完整的文档描述。基本上,VC 将结构中相邻的相同数据结构位域组成位域组,然后每个位域组都默认要求按其数据类型对齐。另外还有许多不同的例外情况。这样的情况与任何一个普通 GCC 支持的 对齐模式都不同。对齐方式不同意味着什么呢?考虑一下,Windows 是用 VC 编译的,也就是说所有 Windows API 都使用 VC 对齐方式。而如果你用 MinGW GCC编译 Windows 程序,你对所有使用了位域的 Windows API 的调用都将出错!而我们的 GTK+ for Windows 显然也是使用了这种对齐方式。

万幸的是,Windows 版 GCC 在编译时补上了一个新的命令行开关,-mms-bitfields,使其使用 VC 兼容的对齐方式。 Borland 所携带的这个 MinGW GCC也有。而这个开关别的平台上的 gcc 则都没有。加上这个编译开关后生成的代码将与 VC 的代码有相同的行为特征。只是 Borland 自己好像还没有意识到包里的 gcc 有着这么重要的一个开关,我找遍 Build Options Explorer 也没有找到有这个选项的勾可打。好在此时 BCBX 的开放性再次救了我们和它自己一命。在 Options 标签页的最下面,有一个 Other options and parameters 选项。填在里面的参数将被原封不动地拷贝到命令行上。所以我们在里面写上:

-mms-bitfields
OK,现在,激动人心的时刻就要到来了。按下 Run 按钮,我们的第一个 GTK 程序将运行了:


这是 Pango 标记的效果,与原文中的图比较一下。


这是 GTK 多页记事簿

至此,我们的 GTK+ for Windows 开发环境已经搭建成功了,剩下的就只需创意加上努力地 coding 了。

UTF-8, 到处都是 UTF-8
在结束本文前,我们最后看一个例子。《GTK+2.0编程范例》(清华大学出版社出版)一书的作者,宋国伟先生在应用GTK+编程一文中的一个 Helloworld 程序。在这个程序中,有这样一句语句:

g_signal_connect(G_OBJECT(button),"clicked",
G_CALLBACK(on_button_clicked),(gpointer)"你好!\n自由的世界。");
程序本身并没有错,然而,在通常情况下,编译运行以后,并不能看见这句话,相反倒是在控制台上看见如

** (gtkhello.exe:1236): WARNING **: Invalid UTF8 string passed to pango_layout_set_text()
这样的字样。GTK 是一个国际化的工具箱,其内部所有地方都以 Unicode 存储字符串,亦可同屏显示任何语言。它要求所有输入的字符串都为 UTF-8 编码。然而“通常情况下”,我们编辑的中文文件都将以一个 locale encoding,比如 GB2312 编码,来保存。所以只要源文件能保存为 UTF-8,就解决了。BCBX 有这个能力。在cbx项目文件上点右键,选择属性。切换到 General 标签,将 Encoding 设为 UTF8。只有再新建的所有文件都将使用这里选中的编码来保存。


我们新建一个.c文件将内容复制过去。注意文件下方有 UTF8 字样。

然后再编译运行。






Happy Hacking!
文章就写到这里。本文是用 StarOffice 6 写的。说实话,非常的不好用。我常常被迫停下来与其搏斗,摆平后才能继续。最后创建的 html 质量很差,还有问题,得手工修改。

祝大家新年快乐

2004-1-4 4:14 AM

--------------
贴不上图,要看图的话就到他的原来的页面上去看吧

神六航天员所听歌曲名单被披露

http://www.sina.com.cn 2005年10月17日00:19 华夏时报
 “五星红旗迎风飘扬……”16日,记者从远在新疆的喀什测控站得知,神舟六号飞船13日上午11时进入喀什测控弧段后,地面上的测控人员清晰地听见,飞船里响起了《歌唱祖国》的歌声。

  航天员系统负责人吴川生告诉记者,费俊龙和聂海胜两名航天员,这次每人携带了一个精巧的“电子手册”。这个电子手册中,有很多脍炙人口的名曲。电子手册只有两张扑克牌大小,灰黑色,可以用一支专用的小笔点击触摸屏,航天员不仅可以用它查阅飞行程序,还能记录“太空日记”、录制“太空留言”、播放MTV、MP3和小电影,甚至能玩电子游戏。

  都有哪些歌?吴川生如数家珍:“《乌苏里船歌》、《赛马》、《茉莉花》、《吐鲁番的葡萄熟了》、《青藏高原》和《情深意长》、《八月桂花遍地开》、《彩云追月》、《我爱五指山,我爱万泉河》……我们还特意选入了4首反映全国人民心声的歌曲《东方红》、《太阳最红毛主席最亲》、《春天的故事》、《走进新时代》和《又见西柏坡》,还有港澳台同胞喜爱的《我的中国心》、《七子之歌》和《阿里山的姑娘》。”

  除了歌曲,电子手册上还录入了配乐古诗词朗诵,还精选了一些相声和小品。(新浪)

Tuesday, October 25, 2005

了解 SIP-当今最热门的通信协议已经发展成熟- fanqiang.com

www.sipcenter.com (2005-05-09 10:57:17)
介绍

新一代的服务

历史回顾

SIP 的优点:类似 Web 的可扩展开放通信

SIP 会话构成

介绍

通信提供商及其合作伙伴和用户越来越渴求新一代基于 IP 的服务。现在有了 SIP(会话启动协议),一解燃眉之急。SIP 是不到十年前在计算机科学实验室诞生的一个想法。它是第一个适合各种媒体内容而实现多用户会话的协议,现在已成了 Internet 工程任务组 (IETF) 的规范。

今天,越来越多的运营商、CLEC(竞争本地运营商)和 ITSP(IP 电话服务商)都在提供基于 SIP 的服务,如市话和长途电话技术、在线信息和即时消息、IP Centrex/Hosted PBX、语音短信、push-to-talk(按键通话)、多媒体会议等等。独立软件供应商 (ISV) 正在开发新的开发工具,用来为运营商网络构建基于 SIP 的应用程序以及 SIP 软件。网络设备供应商 (NEV) 正在开发支持 SIP 信令和服务的硬件。现在,有众多 IP 电话、用户代理、网络代理服务器、VOIP 网关、媒体服务器和应用服务器都在使用 SIP。

SIP 从类似的权威协议--如 Web 超文本传输协议 (HTTP) 格式化协议以及简单邮件传输协议 (SMTP) 电子邮件协议--演变而来并且发展成为一个功能强大的新标准。但是,尽管 SIP 使用自己独特的用户代理和服务器,它并非自成一体地封闭工作。SIP 支持提供融合的多媒体服务,与众多负责身份验证、位置信息、语音质量等的现有协议协同工作。

本白皮书对 SIP 及其作用进行了概括性的介绍。它还介绍了 SIP 从实验室开发到面向市场的过程。本白皮书说明 SIP 提供哪些服务以及正在实施哪些促进发展的方案。它还详细介绍了 SIP 与各种协议不同的重要特点并说明如何建立 SIP 会话。

新一代的服务

SIP 较为灵活,可扩展,而且是开放的。它激发了 Internet 以及固定和移动 IP 网络推出新一代服务的威力。SIP 能够在多台 PC 和电话上完成网络消息,模拟 Internet 建立会话。

与存在已久的国际电信联盟 (ITU) SS7 标准(用于呼叫建立)和 ITU H.323 视频协议组合标准不同,SIP 独立工作于底层网络传输协议和媒体。它规定一个或多个参与方的终端设备如何能够建立、修改和中断连接,而不论是语音、视频、数据或基于 Web 的内容。

SIP 大大优于现有的一些协议,如将 PSTN 音频信号转换为 IP 数据包的媒体网关控制协议 (MGCP)。因为 MGCP 是封闭的纯语音标准,所以通过信令功能对其进行增强比较复杂,有时会导致消息被破坏或丢弃,从而妨碍提供商增加新的服务。而使用 SIP,编程人员可以在不影响连接的情况下在消息中增加少量新信息。

例如,SIP 服务提供商可以建立包含语音、视频和聊天内容的全新媒体。如果使用 MGCP、H.323 或 SS7 标准,则提供商必须等待可以支持这种新媒体的协议新版本。而如果使用 SIP,尽管网关和设备可能无法识别该媒体,但在两个大陆上设有分支机构的公司可以实现媒体传输。

而且,因为 SIP 的消息构建方式类似于 HTTP,开发人员能够更加方便便捷地使用通用的编程语言(如 Java)来创建应用程序。对于等待了数年希望使用 SS7 和高级智能网络 (AIN) 部署呼叫等待、主叫号码识别以及其他服务的运营商,现在如果使用 SIP,只需数月时间即可实现高级通信服务的部署。

这种可扩展性已经在越来越多基于 SIP 的服务中取得重大成功。Vonage 是针对用户和小企业用户的服务提供商。它使用 SIP 向用户提供 20,000 多条数字市话、长话及语音邮件线路。Deltathree 为服务提供商提供 Internet 电话技术产品、服务和基础设施。它提供了基于 SIP 的 PC 至电话解决方案,使 PC 用户能够呼叫全球任何一部电话。Denwa Communications 在全球范围内批发语音服务。它使用 SIP 提供 PC 至 PC 及电话至 PC 的主叫号码识别、语音邮件,以及电话会议、统一通信、客户管理、自配置和基于 Web 的个性化服务。

某些权威人士预计,SIP 与 IP 的关系将发展成为类似 SMTP 和 HTTP 与 Internet 的关系,但也有人说它可能标志着 AIN 的终结。迄今为止,3G 界已经选择 SIP 作为下一代移动网络的会话控制机制。Microsoft 已经选择 SIP 作为其实时通信策略并在 Microsoft XP、Pocket PC 和 MSN Messenger 中进行了部署。Microsoft 同时宣布 CE.net 的下一个版本将使用基于 SIP 的 VoIP 应用接口层,并承诺向用户 PC 提供基于 SIP 的语音和视频呼叫。

另外,MCI 正在使用 SIP 向 IP 通信用户部署高级电话技术服务。用户将能够通知主叫方自己是否有空以及首选的通信方式,如电子邮件、电话或即时消息。利用在线信息,用户还能够即时建立聊天会话和召开音频会议。使用 SIP 将不断地实现各种功能。

历史回顾

SIP 出现于二十世纪九十年代中期,源于哥伦比亚大学计算机系副教授 Henning Schulzrinne 及其研究小组的研究。Schulzrinne 教授除与人共同提出通过 Internet 传输实时数据的实时传输协议 (RTP) 外,还与人合作编写了实时流传输协议 (RTSP) 标准提案,用于控制音频视频内容在 Web 上的流传输。

Schulzrinne 本来打算编写多方多媒体会话控制 (MMUSIC) 标准。1996 年,他向 IETF 提交了一个草案,其中包含了 SIP 的重要内容。1999 年,Shulzrinne 在提交的新标准中删除了有关媒体内容方面的无关内容。随后,IETF 发布了第一个 SIP 规范,即 RFC 2543。虽然一些供应商表示了担忧,认为 H.323 和 MGCP 协议可能会大大危及他们在 SIP 服务方面的投资,IETF 继续进行这项工作,于 2001 年发布了 SIP 规范 RFC 3261。

RFC 3261 的发布标志着 SIP 的基础已经确立。从那时起,已发布了几个 RFC 增补版本,充实了安全性和身份验证等领域的内容。例如,RFC 3262 对临时响应的可靠性作了规定。RFC 3263 确立了 SIP 代理服务器的定位规则。RFC 3264 提供了提议/应答模型,RFC 3265 确定了具体的事件通知。

早在 2001 年,供应商就已开始推出基于 SIP 的服务。今天,人们对该协议的热情不断高涨。Sun Microsystems 的 Java Community Process 等组织正在使用通用的 Java 编程语言定义应用编程接口 (API),以便开发商能够为服务提供商和企业构建 SIP 组件和应用程序。最重要的是,越来越多的竞争者正在借助前途光明的新服务进入 SIP 市场。SIP 正在成为自 HTTP 和 SMTP 以来最为重要的协议之一。

SIP 的优点:类似 Web 的可扩展开放通信

使用 SIP,服务提供商可以随意选择标准组件,快速驾驭新技术。不论媒体内容和参与方数量,用户都可以查找和联系对方。SIP 对会话进行协商,以便所有参与方都能够就会话功能达成一致以及进行修改。它甚至可以添加、删除或转移用户。

不过,SIP
不是万能的。它既不是会话描述协议,也不提供会议控制功能。为了描述消息内容的负载情况和特点,SIP 使用 Internet 的会话描述协议 (SDP) 来描述终端设备的特点。SIP 自身也不提供服务质量 (QoS),它与负责语音质量的资源保留设置协议 (RSVP) 互操作。它还与若干个其他协议进行协作,包括负责定位的轻型目录访问协议 (LDAP)、负责身份验证的远程身份验证拨入用户服务 (RADIUS) 以及负责实时传输的 RTP 等多个协议。

SIP 规定了以下基本的通信要求:

1. 用户定位服务
2. 会话建立
3. 会话参与方管理
4. 特点的有限确定


SIP 的一个重要特点是它不定义要建立的会话的类型,而只定义应该如何管理会话。有了这种灵活性,也就意味着 SIP 可以用于众多应用和服务中,包括交互式游戏、音乐和视频点播以及语音、视频和 Web 会议。

下面是 SIP 在新的信令协议中出类拔萃的一些其他特点

SIP 消息是基于文本的,因而易于读取和调试。新服务的编程更加简单,对于设计人员而言更加直观。

SIP 如同电子邮件客户机一样重用 MIME 类型描述,因此与会话相关的应用程序可以自动启动。

SIP 重用几个现有的比较成熟的 Internet 服务和协议,如 DNS、RTP、RSVP 等。不必再引入新服务对 SIP 基础设施提供支持,因为该基础设施很多部分已经到位或现成可用。

对 SIP 的扩充易于定义,可由服务提供商在新的应用中添加,不会损坏网络。网络中基于 SIP 的旧设备不会妨碍基于 SIP 的新服务。例如,如果旧 SIP 实施不支持新的 SIP 应用所用的方法/标头,则会将其忽略。

SIP 独立于传输层。因此,底层传输可以是采用 ATM 的 IP。SIP 使用用户数据报协议 (UDP) 以及传输控制协议 (TCP),将独立于底层基础设施的用户灵活地连接起来。

SIP 支持多设备功能调整和协商。如果服务或会话启动了视频和语音,则仍然可以将语音传输到不支持视频的设备,也可以使用其他设备功能,如单向视频流传输功能。

SIP 会话构成

SIP 会话使用多达四个主要组件:SIP 用户代理、SIP 注册服务器、SIP 代理服务器和 SIP 重定向服务器。这些系统通过传输包括了 SDP 协议(用于定义消息的内容和特点)的消息来完成 SIP 会话。下面概括性地介绍各个 SIP 组件及其在此过程中的作用。

SIP 用户代理 (UA) 是终端用户设备,如用于创建和管理 SIP 会话的移动电话、多媒体手持设备、PC、PDA 等。用户代理客户机发出消息。用户代理服务器对消息进行响应。

SIP 注册服务器是包含域中所有用户代理的位置的数据库。在 SIP 通信中,这些服务器会检索参与方的 IP 地址和其他相关信息,并将其发送到 SIP 代理服务器。

SIP 代理服务器接受 SIP UA 的会话请求并查询 SIP 注册服务器,获取收件方 UA 的地址信息。然后,它将会话邀请信息直接转发给收件方 UA(如果它位于同一域中)或代理服务器(如果 UA 位于另一域中)。

SIP 重定向服务器允许 SIP 代理服务器将 SIP 会话邀请信息定向到外部域。SIP 重定向服务器可以与 SIP 注册服务器和 SIP 代理服务器同在一个硬件上。

以下几个情景说明 SIP 组件之间如何进行协调以在同一域和不同域中的 UA 之间建立 SIP 会话:

在同一域中建立 SIP 会话

下图说明了在预订同一个 ISP 从而使用同一域的两个用户之间建立 SIP 会话的过程。用户 A 使用 SIP 电话。用户 B 有一台 PC,运行支持语音和视频的软客户程序。加电后,两个用户都在 ISP 网络中的 SIP 代理服务器上注册了他们的空闲情况和 IP 地址。用户 A 发起此呼叫,告诉 SIP 代理服务器要联系用户 B。然后,SIP 代理服务器向 SIP 注册服务器发出请求,要求提供用户 B 的 IP 地址,并收到用户 B 的 IP 地址。SIP 代理服务器转发用户 A 与用户 B 进行通信的邀请信息(使用 SDP),包括用户 A 要使用的媒体。用户 B 通知 SIP 代理服务器可以接受用户 A 的邀请,且已做好接收消息的准备。SIP 代理服务器将此消息传达给用户 A,从而建立 SIP 会话。然后,用户创建一个点到点 RTP 连接,实现用户间的交互通信。





在不同的域中建立 SIP 会话

本情景与第一种情景的不同之处如下。用户 A 邀请正在使用多媒体手持设备的用户 B 进行 SIP 会话时,域 A 中的 SIP 代理服务器辨别出用户 B 不在同一域中。然后,SIP 代理服务器在 SIP 重定向服务器上查询用户 B 的 IP 地址。SIP 重定向服务器既可在域 A 中,也可在域 B 中,也可既在域 A 中又在域 B 中。SIP 重定向服务器将用户 B 的联系信息反馈给 SIP 代理服务器,该服务器再将 SIP 会话邀请信息转发给域 B 中的 SIP 代理服务器。域 B 中的 SIP 代理服务器将用户 A 的邀请信息发送给用户 B。用户 B 再沿邀请信息经由的同一路径转发接受邀请的信息。





无缝、灵活、可扩展:展望 SIP 未来

SIP 能够连接使用任何 IP 网络(有线 LAN 和 WAN、公共 Internet 骨干网、移动 2.5G、3G 和 Wi-Fi)和任何 IP 设备(电话、PC、PDA、移动手持设备)的用户,从而出现了众多利润丰厚的新商机,改进了企业和用户的通信方式。基于 SIP 的应用(如 VOIP、多媒体会议、push-to-talk(按键通话)、定位服务、在线信息和 IM)即使单独使用,也会为服务提供商、ISV、网络设备供应商和开发商提供许多新的商机。不过,SIP 的根本价值在于它能够将这些功能组合起来,形成各种更大规模的无缝通信服务。

使用 SIP,服务提供商及其合作伙伴可以定制和提供基于 SIP 的组合服务,使用户可以在单个通信会话中使用会议、Web 控制、在线信息、IM 等服务。实际上,服务提供商可以创建一个满足多个最终用户需求的灵活应用程序组合,而不是安装和支持依赖于终端设备有限特定功能或类型的单一分散的应用程序。

通过在单一、开放的标准 SIP 应用架构下合并基于 IP 的通信服务,服务提供商可以大大降低为用户设计和部署基于 IP 的新的创新性托管服务的成本。它是 SIP 可扩展性促进本行业和市场发展的强大动力,是我们所有人的希望所在。
原文链接:http://www.sipcenter.com/sip.nsf/html/Chinese+SIP+Overview

第一次小组开会!

自己没准备什么东西,就把自己看的一些VoIP的东西简单的讲了一下,上周太忙了,这周加油了!!!

Sunday, October 23, 2005

自然哲学课老师的话....

"以前牛顿的《自然哲学的数学原理》在解放前有中译本,但是大家的评论都不好,后来在80年代初,当时就有人提议想找一些物理学家重新翻译此书,因为这本书太经典了,没有人敢翻(翻的不好大家都会鄙视你的)。"

然后老师说了一句话:“要是放在现在,什么书不敢出,一个老师找几个研究生,2/3个月就能出一本书!!!!!”

汗。。。。。。
现在的学术气氛啊。现在中国的教育啊

Thursday, October 06, 2005

实用!破解XP最新验证程序三种方案

http://publish.it168.com/2005/0801/20050801049101.shtml
第一种方法:通过IE7 (beta) 跳过验证法

1、下载 XP版IE7 并解压缩至任何文件夹。

2、用十六进制编辑器,比如UltraEdit32 ,打开update\iecustom.dll。

3、搜索16位文本至0x1034h行(也就是十进制的4148),修改该行的0F 95成为 0F 94。

4、保存文件。使用IE7 (beta)去验证页面。

原文地址:http://www.extended64.com/blogs/rafael/archive/2005/07/28/1051.aspx

qq的天气情况是什么玩意啊, 一点都不准!!!

现在北京正阴天,下着小雨呢!!!!
可我的qq上竟然还是大太阳!!!!!!

Friday, September 23, 2005

Tuesday, May 24, 2005

受不了<<嵌入式系统的实时概念>>中译本啦!!!!

《嵌入式系统的实时概念》,英文名 《Real-Time Concepts for Embedded Systems》,作者Qing Li,译者王安生,

英文原版的没有看过,不敢置评;不过,我确实见识它的中译本了,翻译之粗糙,比现在我们本科生翻译计算机专业英语短文的质量有过之而无不及。
作者大概不太懂汉语吧?竟然能翻译出这样的句子:“隐藏在大量家用电器中的嵌入式系统充满了整个家庭。消费者尽情享受这些嵌入式技术提供的先进特性和效益”(特务吗?干吗还要隐藏! 什么词非要翻译成“充满”! “效益”是怎么被尽情享受的?!!)。

deadline在计算机科学中应该被翻译成"时间期限,底限"之类的意思,为什么要翻译成“死线”?好奇怪的翻译,

现在只是看第一章,就发现那么多错误。真不知道作者是怎么翻译的,译者是“王安生-2003年11月26日于北京邮电大学软件学院”。


无语ing

基于Linux的实时系统

越来越多的开发者在基于Linux系统构造嵌入式实时应用,他们迫切地需要一份基于Linux系统构造嵌入式实时系统的指南性的文章。考虑到这种需求,本文在介绍了几种基本的实时进程调度算法的基础上,研究了普通的Linux操作系统的进程调度,并十分全面地调查了各种实时Linux系统为了支持实时特性对普通Linux系统所做的改进。文章分析了将Linux操作系统应用于实时领域中时所出现的一些问题,并总结了各种实时Linux是如何解决这些问题的,最后对于如何将这些已有的研究成果应用与实际的研究和开发工作中作了很好的建议。

第一部分: 实时调度算法介绍
对于什么是实时系统,POSIX 1003.b作了这样的定义:指系统能够在限定的响应时间内提供所需水平的服务。而一个由Donald Gillies提出的更加为大家接受的定义是:一个实时系统是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。
实时系统根据其对于实时性要求的不同,可以分为软实时和硬实时两种类型。硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足。比如航天中的宇宙飞船的控制等就是现实中这样的系统。其他的所有有实时特性的系统都可以称之为软实时系统。如果明确地来说,软实时系统就是那些从统计的角度来说,一个任务(在下面的论述中,我们将对任务和进程不作区分)能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误,像实时多媒体系统就是一种软实时系统。
一个计算机系统为了提供对于实时性的支持,它的操作系统必须对于CPU和其他资源进行有效的调度和管理。在多任务实时系统中,资源的调度和管理更加复杂。本文下面将先从分类的角度对各种实时任务调度算法进行讨论,然后研究普通的Linux操作系统的进程调度以及各种实时Linux系统为了支持实时特性对普通Linux系统所做的改进。最后分析了将Linux操作系统应用于实时领域中时所出现的一些问题,并总结了各种实时Linux是如何解决这些问题的。
1. 实时CPU调度算法分类
各种实时操作系统的实时调度算法可以分为如下三种类别[Wang99][Gopalan01]:基于优先级的调度算法(Priority-driven scheduling-PD)、基于CPU使用比例的共享式的调度算法(Share-driven scheduling-SD)、以及基于时间的进程调度算法(Time-driven scheduling-TD),下面对这三种调度算法逐一进行介绍。
1.1. 基于优先级的调度算法
基于优先级的调度算法给每个进程分配一个优先级,在每次进程调度时,调度器总是调度那个具有最高优先级的任务来执行。根据不同的优先级分配方法,基于优先级的调度算法可以分为如下两种类型[Krishna01][Wang99]:
静态优先级调度算法:这种调度算法给那些系统中得到运行的所有进程都静态地分配一个优先级。静态优先级的分配可以根据应用的属性来进行,比如任务的周期,用户优先级,或者其它的预先确定的策略。RM(Rate-Monotonic)调度算法是一种典型的静态优先级调度算法,它根据任务的执行周期的长短来决定调度优先级,那些具有小的执行周期的任务具有较高的优先级。
动态优先级调度算法:这种调度算法根据任务的资源需求来动态地分配任务的优先级,其目的就是在资源分配和调度时有更大的灵活性。非实时系统中就有很多这种调度算法,比如短作业优先的调度算法。在实时调度算法中,EDF算法是使用最多的一种动态优先级调度算法,该算法给就绪队列中的各个任务根据它们的截止期限(Deadline)来分配优先级,具有最近的截止期限的任务具有最高的优先级。
1.2. 基于比例共享调度算法
虽然基于优先级的调度算法简单而有效,但这种调度算法提供的是一种硬实时的调度,在很多情况下并不适合使用这种调度算法:比如象实时多媒体会议系统这样的软实时应用。对于这种软实时应用,使用一种比例共享式的资源调度算法(SD算法)更为适合。
比例共享调度算法指基于CPU使用比例的共享式的调度算法,其基本思想就是按照一定的权重(比例)对一组需要调度的任务进行调度,让它们的执行时间与它们的权重完全成正比。
我们可以通过两种方法来实现比例共享调度算法[Nieh01]:第一种方法是调节各个就绪进程出现在调度队列队首的频率,并调度队首的进程执行;第二种做法就是逐次调度就绪队列中的各个进程投入运行,但根据分配的权重调节分配个每个进程的运行时间片。
比例共享调度算法可以分为以下几个类别:轮转法、公平共享、公平队列、彩票调度法(Lottery)等。
比例共享调度算法的一个问题就是它没有定义任何优先级的概念;所有的任务都根据它们申请的比例共享CPU资源,当系统处于过载状态时,所有的任务的执行都会按比例地变慢。所以为了保证系统中实时进程能够获得一定的CPU处理时间,一般采用一种动态调节进程权重的方法。
1.3. 基于时间的进程调度算法
对于那些具有稳定、已知输入的简单系统,可以使用时间驱动(Time-driven:TD)的调度算法,它能够为数据处理提供很好的预测性。这种调度算法本质上是一种设计时就确定下来的离线的静态调度方法。在系统的设计阶段,在明确系统中所有的处理情况下,对于各个任务的开始、切换、以及结束时间等就事先做出明确的安排和设计。这种调度算法适合于那些很小的嵌入式系统、自控系统、传感器等应用环境。
这种调度算法的优点是任务的执行有很好的可预测性,但最大的缺点是缺乏灵活性,并且会出现有任务需要被执行而CPU却保持空闲的情况。
2. 通用Linux系统中的CPU调度
通用Linux系统支持实时和非实时两种进程,实时进程相对于普通进程具有绝对的优先级。对应地,实时进程采用SCHED_FIFO或者SCHED_RR调度策略,普通的进程采用SCHED_OTHER调度策略。
在调度算法的实现上,Linux中的每个任务有四个与调度相关的参数,它们是rt_priority、policy、priority(nice)、counter。调度程序根据这四个参数进行进程调度。
在SCHED_OTHER调度策略中,调度器总是选择那个priority+counter值最大的进程来调度执行。从逻辑上分析,SCHED_OTHER调度策略存在着调度周期(epoch),在每一个调度周期中,一个进程的priority和counter值的大小影响了当前时刻应该调度哪一个进程来执行,其中priority是一个固定不变的值,在进程创建时就已经确定,它代表了该进程的优先级,也代表这该进程在每一个调度周期中能够得到的时间片的多少;counter是一个动态变化的值,它反映了一个进程在当前的调度周期中还剩下的时间片。在每一个调度周期的开始,priority的值被赋给counter,然后每次该进程被调度执行时,counter值都减少。当counter值为零时,该进程用完自己在本调度周期中的时间片,不再参与本调度周期的进程调度。当所有进程的时间片都用完时,一个调度周期结束,然后周而复始。另外可以看出Linux系统中的调度周期不是静态的,它是一个动态变化的量,比如处于可运行状态的进程的多少和它们priority值都可以影响一个epoch的长短。值得注意的一点是,在2.4以上的内核中,priority被nice所取代,但二者作用类似。
可见SCHED_OTHER调度策略本质上是一种比例共享的调度策略,它的这种设计方法能够保证进程调度时的公平性--一个低优先级的进程在每一个epoch中也会得到自己应得的那些CPU执行时间,另外它也提供了不同进程的优先级区分,具有高priority值的进程能够获得更多的执行时间。
对于实时进程来说,它们使用的是基于实时优先级rt_priority的优先级调度策略,但根据不同的调度策略,同一实时优先级的进程之间的调度方法有所不同:
SCHED_FIFO:不同的进程根据静态优先级进行排队,然后在同一优先级的队列中,谁先准备好运行就先调度谁,并且正在运行的进程不会被终止直到以下情况发生:1.被有更高优先级的进程所强占CPU;2.自己因为资源请求而阻塞;3.自己主动放弃CPU(调用sched_yield);
SCHED_RR:这种调度策略跟上面的SCHED_FIFO一模一样,除了它给每个进程分配一个时间片,时间片到了正在执行的进程就放弃执行;时间片的长度可以通过sched_rr_get_interval调用得到;
由于Linux系统本身是一个面向桌面的系统,所以将它应用于实时应用中时存在如下的一些问题:
Linux系统中的调度单位为10ms,所以它不能够提供精确的定时;
当一个进程调用系统调用进入内核态运行时,它是不可被抢占的;
Linux内核实现中使用了大量的封中断操作会造成中断的丢失;
由于使用虚拟内存技术,当发生页出错时,需要从硬盘中读取交换数据,但硬盘读写由于存储位置的随机性会导致随机的读写时间,这在某些情况下会影响一些实时任务的截止期限;
虽然Linux进程调度也支持实时优先级,但缺乏有效的实时任务的调度机制和调度算法;它的网络子系统的协议处理和其它设备的中断处理都没有与它对应的进程的调度关联起来,并且它们自身也没有明确的调度机制;
3. 各种实时Linux系统
3.1. RT-Linux和RTAI
RT-Linux是新墨西哥科技大学(New Mexico Institute of Technology)的研究成果[RTLinuxWeb][Barabanov97]。它的基本思想是,为了在Linux系统中提供对于硬实时的支持,它实现了一个微内核的小的实时操作系统(我们也称之为RT-Linux的实时子系统),而将普通Linux系统作为一个该操作系统中的一个低优先级的任务来运行。另外普通Linux系统中的任务可以通过FIFO和实时任务进行通信。RT-Linux的框架如图 1所示:
图 1 RT-Linux结构
RT-Linux的关键技术是通过软件来模拟硬件的中断控制器。当Linux系统要封锁CPU的中断时时,RT-Linux中的实时子系统会截取到这个请求,把它记录下来,而实际上并不真正封锁硬件中断,这样就避免了由于封中断所造成的系统在一段时间没有响应的情况,从而提高了实时性。当有硬件中断到来时,RT-Linux截取该中断,并判断是否有实时子系统中的中断例程来处理还是传递给普通的Linux内核进行处理。另外,普通Linux系统中的最小定时精度由系统中的实时时钟的频率决定,一般Linux系统将该时钟设置为每秒来100个时钟中断,所以Linux系统中一般的定时精度为 10ms,即时钟周期是10ms,而RT-Linux通过将系统的实时时钟设置为单次触发状态,可以提供十几个微秒级的调度粒度。
RT-Linux实时子系统中的任务调度可以采用RM、EDF等优先级驱动的算法,也可以采用其他调度算法。
RT-Linux对于那些在重负荷下工作的专有系统来说,确实是一个不错的选择,但他仅仅提供了对于CPU资源的调度;并且实时系统和普通Linux系统关系不是十分密切,这样的话,开发人员不能充分利用Linux系统中已经实现的功能,如协议栈等。所以RT-Linux适合与工业控制等实时任务功能简单,并且有硬实时要求的环境中,但如果要应用与多媒体处理中还需要做大量的工作。
意大利的RTAI( Real-Time Application Interface )源于RT-Linux,它在设计思想上和RT-Linux完全相同。它当初设计目的是为了解决RT-Linux难于在不同Linux版本之间难于移植的问题,为此,RTAI在 Linux 上定义了一个实时硬件抽象层,实时任务通过这个抽象层提供的接口和Linux系统进行交互,这样在给Linux内核中增加实时支持时可以尽可能少地修改Linux的内核源代码。
3.2. Kurt-Linux
Kurt-Linux由Kansas大学开发,它可以提供微秒级的实时精度[KurtWeb] [Srinivasan]。不同于RT-Linux单独实现一个实时内核的做法,Kurt -Linux是在通用Linux系统的基础上实现的,它也是第一个可以使用普通Linux系统调用的基于Linux的实时系统。
Kurt-Linux将系统分为三种状态:正常态、实时态和混合态,在正常态时它采用普通的Linux的调度策略,在实时态只运行实时任务,在混合态实时和非实时任务都可以执行;实时态可以用于对于实时性要求比较严格的情况。
为了提高Linux系统的实时特性,必须提高系统所支持的时钟精度。但如果仅仅简单地提高时钟频率,会引起调度负载的增加,从而严重降低系统的性能。为了解决这个矛盾, Kurt-Linux采用UTIME所使用的提高Linux系统中的时钟精度的方法[UTIMEWeb]:它将时钟芯片设置为单次触发状态(One shot mode),即每次给时钟芯片设置一个超时时间,然后到该超时事件发生时在时钟中断处理程序中再次根据需要给时钟芯片设置一个超时时间。它的基本思想是一个精确的定时意味着我们需要时钟中断在我们需要的一个比较精确的时间发生,但并非一定需要系统时钟频率达到此精度。它利用CPU的时钟计数器TSC(Time Stamp Counter)来提供精度可达CPU主频的时间精度。
对于实时任务的调度,Kurt-Linux采用基于时间(TD)的静态的实时CPU调度算法。实时任务在设计阶段就需要明确地说明它们实时事件要发生的时间。这种调度算法对于那些循环执行的任务能够取得较好的调度效果。
Kurt-Linux相对于RT-Linux的一个优点就是可以使用Linux系统自身的系统调用,它本来被设计用于提供对硬实时的支持,但由于它在实现上只是简单的将Linux调度器用一个简单的时间驱动的调度器所取代,所以它的实时进程的调度很容易受到其它非实时任务的影响,从而在有的情况下会发生实时任务的截止期限不能满足的情况,所以也被称作严格实时系统(Firm Real-time)。目前基于Kurt-Linux的应用有:ARTS(ATM Reference Traffic System)、多媒体播放软件等。另外Kurt-Linux所采用的这种方法需要频繁地对时钟芯片进行编程设置。
3.3. RED-Linux
RED-Linux是加州大学Irvine分校开发的实时Linux系统[REDWeb][ Wang99],它将对实时调度的支持和Linux很好地实现在同一个操作系统内核中。它同时支持三种类型的调度算法,即:Time-Driven、Priority-Dirven、Share-Driven。
为了提高系统的调度粒度,RED-Linux从RT-Linux那儿借鉴了软件模拟中断管理器的机制,并且提高了时钟中断频率。当有硬件中断到来时,RED-Linux的中断模拟程序仅仅是简单地将到来的中断放到一个队列中进行排队,并不执行真正的中断处理程序。
另外为了解决Linux进程在内核态不能被抢占的问题, RED-Linux在Linux内核的很多函数中插入了抢占点原语,使得进程在内核态时,也可以在一定程度上被抢占。通过这种方法提高了内核的实时特性。
RED-Linux的设计目标就是提供一个可以支持各种调度算法的通用的调度框架,该系统给每个任务增加了如下几项属性,并将它们作为进程调度的依据:
Priority:作业的优先级;
Start-Time:作业的开始时间;
Finish-Time:作业的结束时间;
Budget:作业在运行期间所要使用的资源的多少;
通过调整这些属性的取值及调度程序按照什么样的优先顺序来使用这些属性值,几乎可以实现所有的调度算法。这样的话,可以将三种不同的调度算法无缝、统一地结合到了一起。
RED-Linux调度程序的框架结构如图 2所示:
图 2 RED-Linux调度框架
RED-Linux的调度程序由两部分组成,其中Schedule Allocator初始化到来的job中的属性值;Schedule Dispatcher根据job的属性值选择一个job进行执行;
3.4. Linux/RK
Linux/RK由卡内基梅隆大学实时和多媒体系统实验室所开发[RKWeb][ Oikawa98]。它是该实验室资源内核(Resource Kernel)[Rajkumar98]思想在Linux系统中的具体实现。他们最先在RT-MACH中实现了资源内核的思想,后来又用资源内核的思想对Linux进行了修改。资源内核的概念是网络中资源预留思想在操作系统领域的扩展,应用程序先向操作系统请求预留资源,而操作系统内核在给应用进行资源预留,并能给应用提供有及时的、保证的资源访问。
资源内核中有两个基本的概念:资源预留和资源集。一个资源预留代表一份计算资源,这个资源可以是CPU、内存、磁盘、网络带宽等。在内核中,一个资源预留有对应的描述它的数据结构,而一个资源集指一组资源预留的集合。一般情况下我们将某一个应用程序所请求的所有资源预留组合在一起组成一个资源集,这样方便管理和分配。
Linux/RK增强了普通Linux内核的功能,从而使Linux内核可以提供对于系统中各种计算资源的准入控制、资源预留和统计管理。Linux/RK由两部分组成:普通的Linux内核以及可移植的资源内核;这两个部分之间通过回调钩子函数(Callback hooks)进行交互。类似于RT-Linux,为了防止Linux内核中的封中操作以及提高调度精度,Linux/RK也截取系统中的中断,并提高了系统时钟频率,只有在需要的时侯才将中断送给Linux内核。另外它使用Proc文件系统来显示资源预留和使用的情况;
3.5. Qlinux
Qlinux是由AT&T、德州大学分布式多媒体计算实验室和马萨诸塞大学高级系统软件实验室联合开发出来的一种软实时(soft real-time)核心[QLinuxWeb]。它能够为实时多媒体应用提供QoS支持。
QLinux实现了近年来操作系统领域内一些最新的研究成果,包括:
- H-SFQ资源调度算法(Hierarchical Start-time Fair Queuing)[Goyal96];
- 网络包的延迟处理技术(Lazy Receiver Processing:LRP)[Druschel96];
- Cello磁盘调度算法[Shenoy98];
图 3 QLinux系统结构
H-SFQ资源调度算法由由德州大学的Pawan Goyal等人提出,它采用了一种分级调度的思想,先将资源在不同的应用类别之间进行按比例分配,并在应用类别之间提供对于资源使用的隔离,同时在每一个应用类别中还可以使用不同的资源调度算法。这样做的目的是为了在多媒体系统中提供QoS支持。
LRP技术是一种新颖的设计OS网络子系统的思想,它由Rice大学计算机系的Peter Druschel等人提出,其目的是为了解决普通Unix和类Unix系统中网络包接收的问题。
传统的Unix系统没有对到来的网络包的协议处理的显式调度,它们一般采用中断驱动的机制。当网卡有中断时,CPU就立刻进行一系列由网卡中断程序启动的包接收和协议处理操作,将最终的数据送给等待接收的进程,并唤醒该进程。但这种处理方式会影响应用程序资源调度的性能,并在系统处于过载状态时可能会引起一些应用层任务的饥饿,降低网络吞吐率,甚至会让系统没有响应。为了解决这些问题,LRP的核心思想就是每一个Socket有一个IP包的队列,只有当上层应用程序请求数据时才进行协议处理,同时对协议处理操作以请求数据的应用的优先级进行显式的调度。通过这种途径增强了资源调度的公平性,能够提供一定程度的流量隔离,同时能够提高系统过载状态时的吞吐量。
Cello磁盘调度算法由德州大学Prashant J. Shenoy等人提出。它能够支持多种应用类别,比如:交互式尽力而为应用、大吞吐量尽力而为应用、以及软实时应用等类别,并公平地给各个类别的应用分配磁盘访问带宽。
在结构上Cello磁盘调度采用的是一种两级式的调度方式,它由多个与应用类别相关的调度器以及一个与应用类别无关的调度器组成(如图 4所示)。
图 4 Cello磁盘调度
Cello调度算法中应用类别无关的调度器管理时间上粗粒度的磁盘的调度,而应用相关的调度器控制着小粒度上磁盘调度。如上图中有n个应用类别,Cello使用一个应用无关的调度器C和n个类别相关的调度器 ,系统中有n+1个调度队列。类别无关的调度器C决定你了何时以及多少磁盘请求被从等待队列(pending queue)移到调度队列(scheduled queue);类别相关的调度器Si对等待队列中的请求进行排序,并根据调度队列的状态来决定磁盘请求被插入到调度队列的什么位置。
3.6. Linux-SRT
Linux-SRT是剑桥大学David Ingram的博士论文项目[SRTWeb][Ingram00],基本上是一个实验性的东西,自从Ingram在2000年从剑桥毕业以后,该项目就再没有人维护。跟QLinux一样,Linux-SRT属于软实时的Linux。
在Linux-SRT中可以给一个任务分配一定百分比的CPU时间,它通过RM算法实现了一种基于速率的调度机制来保证给所有多媒体应用的QoS需求;另外由于CPU并非唯一影响多媒体应用的资源,对于那些做图形显示的应用,X服务器中的资源调度也十分关键,所以Linux-SRT对XFree86最了扩展,让X服务器可以对来自不同X客户的图形显示请求进行优先级排序;另外为了方便用户管理各个进程的CPU分配情况,Linux-SRT提供了一个图形界面的程序。下面对于Linux-SRT对于普通Linux所作的修改做一具体说明。
Linux-SRT也提高了系统的定时精度。但它并没有采用惯用的将时钟芯片置于单次触发模式的做法,而是简单地修改了Linux内核中HZ的定义,将Linux的时钟频率由每秒100次提高到了1024。
另外Linux-SRT在原有的Linux系统中的SCHED_OTHER、SCHED_FIFO、SCHED_RR这三个调度策略的基础上,给Linux增加了一些新的调度策略:SCHED_PAUSE、SCHED_IDLE、SCHED_QOS、SCHED_VAR;策略为SCHED_PAUSE的进程在调度时被调度程序忽略,不参与调度执行;使用SCHED_QOS调度策略的进程能够得到有保证的CPU执行时间;使用SCHED_IDLE策略的进程优先级最低,它被分配给那些只在系统空闲时才能够被调度执行的进程,比如一些批处理程序;SCHED_VAR是一个可变优先级的策略,它被用于解决由于临界资源访问时所产生的优先级倒置问题,即一个高优先级的任务等待低优先级任务占用的某种临界资源,但低优先级任务又得不到CPU处理时间所造成的死锁问题;这时通过该调度策略将低优先级任务的优先级置为等待资源的高优先级任务的优先级(优先级继承)来解决死锁问题。
对于使用SCHED_QOS调度策略的实时任务,采用RM静态优先级调度算法进行调度;另外在进行调度时,它还采用了一种双调度策略的方案,即当一个实时任务在当前的调度周期中用完自己所有的时间片之后,在下次调度周期到来之前,并非简单地不调度执行它,而是使用它进程属性中的Fallback policy所定义的调度策略来调度它,让它以该策略参与本轮的剩余时间的调度。
Linux-SRT按照POSIX推荐的方式扩展了传统的几个用户设置进程调度属性的系统调度,让用户或者编程人员可以在后向兼容的情况下使用这些新添加的调度特性。另外为了使用的方便,它还提出了reserve的概念,一个reserve在/proc文件系统中有一个结点,它包含有关资源分配的情况;reserve独立与进程,一个进程可以通过新增加的reserve相关的系统调用申请加入(使用)或退出一个reserve。
3.7. Hard-hat Linux
Hardhat Linux是MontaVista公司所发布的一款主要面向各种嵌入式应用的Linux发布[HardHatWeb][Morgan01]。Hard-hat Linux最大的贡献在于:为了解决Linux在内核态不可被抢占的问题,它开发了一种抢占式(Preemptible)的内核,有人认为它的这种方法充其量也就是一种能够被抢占(Preemptable)的内核。
其基本思想就是让调度程序获得更多的执行机会,从而减少了从一个事件发生到调度程序被执行的时间间隔。可抢占内核的补丁包修改了spinlock的宏定义以及中断返回处理代码,当当前进程可以被"安全"地抢占并且有一个等待处理的重新调度请求,系统就会调用调度程序进行进程调度。
那么什么情况下可以认为一个进程可以被"安全"地抢占?最早的Linux内核代码认为,一旦进入内核态执行,不管是由于陷入(trap)还是中断处理,当前执行进程都不会被切换,直到内核认为可以安全地进行重新调度为止。这种思想可以使得内核代码对一些数据结构进行操作时比较简单,即不需要使用互斥原语(比如旋转锁spinlock)进行数据的修改保护就可以安全地存取数据。但随着内核源代码的发展,不使用保护机制的内核数据访问代码越来越少,所以在抢占式内核中,认为如果内核不是在一个中断处理程序中,并且不再spinlock保护的代码中,就认为可以"安全"地进行进程切换。
抢占式内核对普通Linux内核作了如下的一些修改:
抢占式内核给task struct数据结构增加了一个数据项:preempt_count。该数据项由宏preempt_disable()、preempt_enable()、以及preempt_enable_no_resched()所使用。preempt_disable对preempt_count计数进行递增,preempt_enable对preempt_count进行递减。preempt_enable宏查看当前进程的preempt_count和need_resched域的内容,如果 preempt_count为0并且need_resched为1,则调用preempt_schedule()函数。该函数将给当前进程的preempt_count项增加一个很大的值(比如让preempt_counter=preempt_counter + 0x4000000),然后调用进程调度函数schedule(),在schedule函数返回后从该进程preempt_count中再减去该值。可抢占内核也修改了schedule函数,它检测进程的preempt_counter是否很大(这是为了屏蔽一些普通调度流程中对于抢占式调度来说是冗余的那些操作),然后执行抢占式调度。
抢占式内核补丁也修改了spinlock的代码。在spin_lock()和spin_try_lock中增加了对于preempt_disable的调用,在spin_unlock()中增加了对于preempt_enable的调用。
另外抢占式内核补丁还修改了中断返回的代码,在其中增加了对于preempt_enable的调用。
所以我们根据上面的三个修改可以看出,内核的抢占式调度发生在如下情况:在释放spinlock时,或者当中断返回时,如果当前执行进程的need_resched被标记,则进行抢占式调度。
3.8. SILK
SILK代表SCOUT In Linux Kernel,它是普林斯顿大学支持PATH调度的垂直结构操作系统SCOUT在Linux中的一个实现[SILKWeb][Bavier01]。它将SCOUT操作系统作为Linux的一个模块来实现。
SILK系统的主要目的就是为一些网络QoS提供支持,它支持对于网络包处理的显式的调度,并且这个调度是以PATH为单位进行的。PATH概念的新颖之处在于,不像传统的基于任务的调度方式,它从另外一个角度进行系统的资源调度,即以网络的数据流及其处理为单位进行调度。详细来说,一个PATH由一串当数据流流经系统时进行数据处理或者数据转换的代码模块组成,并且对应的数据流所消耗的资源也归该PATH。研究表明,PATH这种体系结构特别适用于有QoS要求的分布式多媒体系统以及软件路由设备中。下图对于什么是PATH作了一个图示,它说明了一个TCP PATH:
图 5 一个TCP PATH
在实现上,SILK系统将Linux系统中的网络子系统替换成了自己的协议栈。Linux应用程序通过Socket来创建和使用PATHs,几乎不用对应用程序本身作任何修改。
图 6说明了SILK系统的结构。在图的左半部分,SILK模块和网络设备驱动、SOCKET接口层、以及包过滤接口netfilter通过标准的方式交换数据。SILK还修改了Linux任务的调度参数,以便影响Linux进程调度程序的调度决策。图的右半部分示意了SILK中的两个PATH。SILK模块有自己的CPU调度器,它和Linux系统中的CPU调度器进行合作和协调。这个合作由图中的Linux thread代表,通过执行这个线程,SILK将控制转给Linux调度程序。
图 6 SILK系统结构示意图
SILK在操作系统中提供了一个新的SOCKET协议族以便上层应用程序调用下层的SCOUT PATH。为了在Linux进行网络包处理之前截获IP包,SILK通过Linux 2.4内核的netfilter接口插入了一个netfilter hook,所有到来的IP包会被重定向到该hook上,如果SILK找到一个对应于该网络包的PATH,就让Linux内核丢弃该包,而由SILK对包进行处理。
关于CPU调度,SILK有着自己的CPU调度程序和线程包,它们和Linux系统的调度程序并存,在有SILK的Linux系统中,我们一般把由SILK调度的归属于某个PATH的处理叫做SILK线程(thread),而普通的由Linux调度程序调度的东西都叫做任务(task);SILK在一个Linux内核任务的基础上实现它的线程调度,这个内核任务当SILK进行初始化的时候创建,并且将该内核任务的优先级设为优先级最高的实时任务,所以SILK的内核任务几乎是只要它就绪就可以投入运行,并且只有当该内核任务主动初让CPU时Linux系统中的其他普通任务才能够得以运行。SILK将CPU出让给普通的Linux任务是通过调度SILK thread中的一个叫做Linux thread的线程来实现的,该Linux thread本质上就是在SILK的调度空间中代表Linux的普通调度程序。SILK在调用Linux thread之后,代表SILK的内核任务就被Linux的进程调度程序设置为非就绪状态,直到它运行一个其他的进程之后,高优先级得SILK内核任务就又得到 CPU。所以这种实现机制可以让SILK在调度Linux thread时,Linux调度程序可以有机会调度一个其他的进程执行。
4. 实时Linux实现方案的总结
总结上述的各种实时Linux的实现,它们针对不同的设计目标,从不同的侧重点解决了通用Linux操作系统对实时性支持的问题。
针对Linux系统定时粒度过大的问题,一般的解决办法都是将实时时钟编程为单次触发的状态,然后利用CPU的时钟计数寄存器提供高达CPU时钟频率的定时精度。像RT-Linux和Kurt-Linux采用的就是这种方法。
对于Linux进程在进入内核态时不能被抢占的问题,目前的解决办法有RED-Linux在内核函数中插入抢占点的方法,另外Hardhat也通过修改spinlock的宏定义以及中断返回处理代码,实现了一种可抢占的内核;
对于Linux驱动程序中的封中断的方法,RT-Linux所使用的软件模拟中断控制器的方法可以有效地解决这个问题;
对于Linux系统中缺乏实时调度机制和调度算法的问题,目前有很多新颖的操作系统调度框架和调度算法都有Linux实现,比如RED-Linux所定义的一个通用的实时调度框架;QLinux所采用的分层式的CPU调度框架,及新颖的调度算法如H-SFQ,以及Cello磁盘调度算法等;SILK所使用的将对一个包的网络处理抽象成PATH,然后在PATH之间进行调度。
对于内核中协议处理以及中断处理的调度,解决办法基本上是一种延迟处理的技术,即到来的协议包在网卡中断处理中仅仅将它拷贝到一个队列中,只有当上层的应用程序请求数据包时才进行协议处理,并将对协议的处理时间记到对应的进程中。另外SILK对于那些网络路由结点,由于路由等的处理并没有对应的上层应用程序,所以SILK在内核的网络处理之间进行明确的调度。
所以,总的来说,从发展方向上来说,实时Linux的发展有如下四个思路:
提供对于硬实时的支持,具体办法有:提高时钟精度,解决封中断和内核态不能被抢占的问题,代表系统RT-Linux、Kurt-Linux,其实大部分实时Linux都使用了类似与RT-Linux的提高时钟精度和软件中断管理器的思想;总的来说,让内核支持硬实时和使用传统的Linux的丰富的系统调用之间存在着矛盾,以至于像RT-Linux就是单独实现了一个独立的小的硬实时操作系统;但由于软件模拟终端控制器、提高时钟精度、以及可抢占内核等思想的引入,这个矛盾慢慢地得到化解。
提供对于实时多媒体应用的支持,举措:引入新颖的调度算法(网络包调度,进程调度,磁盘调度),代表系统:QLinux、Linux-SRT;
引入新颖的调度框架以及资源管理思想以更好地支持网络系统中的QoS要求,比如SILK中的垂直结构的操作系统调度的思想,QLinux中的分级调度的思想,以及RED-Linux所提出来的一个通用的调度框架和Linux/RK中所使用的资源预留的思想;
方便的任务QoS管理接口函数和管理程序的实现,比如Linux/RK提出的操作系统中各种资源的资源预留的概念;Linux-SRT中为了用户方便地使用新增加的实时调度支持而增加了API,以及提出的reserve的概念等;
在实际的系统中,具体使用那种实时Linux技术,需要根据具体的系统需求而定。如果目标系统是像机床控制或者导弹飞行姿态控制这样的硬实时系统,那基于RT-Linux是一个不错的方案;如果一个系统对于实时性的要求不是那么严格,但又不是软实时系统,那么可以借鉴Kurt-Linux的想想以及一些为了提高Linux响应速度而提出的可抢占内核的想法;如果目标系统是一个像实时多媒体系统这样的软实时应用,或者一个希望能够在高负载状态下提供更好的吞吐率的服务器系统,那么QLinux和RED-Linux的思想提供了很好的参考;如果是将Linux应用于像路由器这样的网络结点中,可以借鉴SILK的实现思想。
参考文献
[Wang99]
Yu-Chung Wang and Kwei-Jay Lin, Implementing a General Real-Time Scheduling Framework in the RED-Linux Real-Time Kernel, IEEE Real-Time Systems Symposium, 1999
[Gopalan01]
Kartik Gopalan, Real-Time Support in General Purpose Operating Systems, Tech Report, 2001
[Krishna01]
C.M.Krishna, Kang G.Shin, Real-time Systems, Tsinghua Press, 2001
[Nieh01]
Jason Nieh, Chris Vaill, Hua Zhong, Virtual-Time Round-Robin: An O(1) Proportional Share Scheduler, Proceedings of the 2001 USENIX Annual Technical Conference, 2001
[RTLinuxWeb]
http://www.rtlinux.org/ or http://fsmlabs.com/
[Barabanov97]
Michael Barabanov, A Linux-based Real-Time Operating System, A Master Thesis, New Mexico Institute of Mining and Technology, Socorro, New Mexico, 1997
[KurtWeb]
http://www.ittc.ku.edu/kurt/
[Srinivasan]
Balaji Srinivasan, A Firm Real-Time System Implementation using Commercial Off-The-Shelf Hardware and Free Software, Master Thesis, Department of Electrical Engineering and Computer Science, University of Kansas, Feb, 1998
[REDWeb]
http://linux.ece.uci.edu/RED-Linux/
[RKWeb]
http://www-2.cs.cmu.edu/~rajkumar/linux-rk.html
[Rajkumar98]
Raj Rajkumar, Kanaka Juvva, Anastasio Molano and Shui Oikawa, Resource Kernels: A Resource-Centric Approach to Real-Time Systems, In Proceedings of the SPIE/ACM Conference on Multimedia Computing and Networking January 1998
[Oikawa98]
Shui Oikawa and Raj Rajkumar, Linux/RK: A Portable Resource Kernel in Linux, In IEEE Real-Time Systems Symposium Work-In-Progress, Madrid, December 1998
[QLinuxWeb]
http://lass.cs.umass.edu/software/qlinux/
[Goyal96]
P. Goyal and X. Guo and H.M. Vin, A Hierarchical CPU Scheduler for Multimedia Operating Systems, Proceedings of 2nd Symposium on Operating System Design and Implementation (OSDI'96), Seattle, WA, pages 107-122, October 1996.
[Druschel96]
Peter Druschel, Gaurav Banga, Lazy Receiver Processing(LRP): A Network Subsystem Architecture for Server Systems, Proceedings of the 2nd Symposium on Operating System Design and Implementation (OSDI'96), Seattle, WA, Pages 261-275, October 1996
[Shenoy98]
P Shenoy and H M. Vin, Cello: A Disk Scheduling Framework for Next Generation Operating Systems, Proceedings of ACM SIGMETRICS Conference, Madison, WI, pages 44-55, June 1998.
[SRTWeb]
http://www.srcf.ucam.org/~dmi1000/linux-srt/
[Ingram00]
David Ingram, Integrated Quality of Service Management, Ph.D. Thesis, Jesus College, University of Cambridge, 2000
[HardHatWeb]
http://www.montavista.com/
[Morgan01]
Kevin Morgan, Preemptible Linux: A Reality Check, MontaVista White Paper, 2001
[SILKWeb]
http://www.cs.princeton.edu/nsg/scout/
[Bavier01]
Andy Bavier, Thiemo Voigt, Mike Wawrzoniak, Larry Peterson, SILK: Scout Paths in the Linux Kernel, Technical Report, Nov 2001
[UTIMEWeb]
http://www.ittc.ku.edu/utime/

Thursday, May 19, 2005

word排版真麻烦啊!

从网上搜到一本名叫《word排版艺术》的书, 要是能找到电子书就好啦。

^_^

快毕业的人了,还什么都不会

到6月底就毕业了,开始写论文了。
不过觉得自己的语言太贫乏了,文章老是觉得写不出多少东西来。看来还得练习自己的写作能力啊!!!