月度归档:2009年01月

在多线程环境下使用局部数组引起的假“内存泄漏”

呼~~~~一直担忧的问题被一个在班上不怎么聪明的我总算解决了……

    昨晚那位网友说了他朋友的一句话,“要彻底搞清楚C语言的原理,必须要深入到指令一层去理解。你写一行C代码,编译器会生成什么样的指令,要做到心中有数。”我当时还是觉得写好程序不一定要把语言的原理研究得那么深啊。看来我错了,正是因为我对我所用的工具的原理没有深刻把握,才会在很多线程的情况下使用大栈空间的,最终导致了好长时间都不能解决的内存占用问题。

    一直担忧的内存泄漏问题,今天晚上心血来潮就计划立即解决掉它,反正过年也是闲着。我本来直觉上认为内存泄漏现象是和我博客插件里使用了以前做得不怎么规范的CPrettyText数据库才发生的。但今晚的实验证明和它没有关系,它也不存在什么内存泄漏的地方。由此也证明我在编写服务器时用的memory内存泄漏检测工具失效的判断是不成立的。问题根源是在多线程的栈空间分配上。

    这是我多年多线程编程以来都没有了解到的问题。

    首先,为了加快服务器的响应速度,我的homeserver并不是采用一般的双线程监听,而是很多个(例如300)来同时工作的,这么多个线程抢着响应,保证了较快的速度。这些线程从开始工作一直到服务器被重启或者关闭时才结束,也就是说在服务器运行过程中不会去主动释放线程资源。

    然后,我在博客插件里使用了几个几百KB大的局部数组变量,由栈空间分配。有的是直接嵌套在函数內,有的是直接嵌套在if之类的结构体中。之所以使用栈空间的原因是不想使用堆空间去分配,在插件中不能用memory内存泄漏检测工具的分配函数。

    当多个线程被调用,同时进入了博客插件中去时,就分配了一定的栈空间,而这些空间又是不能及时回收的,除非结束服务器或者使用其他内存整理工具。所以就导致了虚拟内存一直增大的现象。

    我一开始也不知道是栈空间上的问题。只是今晚用注释法寻找漏洞时,发现就和它相关了。而且,我还尝试使用一个很大的局部变量,例如int t[KB(1000)];这样不断刷新页面,让多个线程进入到博客插件中,结果发现内存占用飞一般地增大!

    同时,我也得到这样一个推论。原来的homeserver的虚拟内存会随着多个线程进入而使栈空间增大从而导致内存占用增大,而这种增大不会一直持续下去。因为工作的线程数目是有限的,当所有的线程都被使用过时,它们的栈空间都达到了各自的极限,就再也不会增大了。

    不知道我的分析是否正确,请大家指点!

MyQQ3.0(2009-1-25)发布

MyQQ3.0下载

该版本协议学习与分析见:

2009ProtAnalyze.zip

MyQQ3.0插件的的WebQQ: webqq.xwsm.net

MyQQ is a cross-platform library for communication which uses a TencentQQ-like

protocol to communicate with friends on the Internet. It can work well now and

maintained by Huang Guan (gdxxhg@gmail.com).

If you are interested in MyQQ and have improved it, I suggest you that you send

your source code to me then everyone will know your work and thank you!

注意:本软件以及源代码仅供学习研究使用。所用协议皆属个人业余的黑匣分析结果。

Developer List:

小虾

千月(改进myqq.c界面)

Windows编译:

需要Mingw32(Devcpp的bin也可以)。

打开控制台,在当前目录下执行

make -C src clean all

Linux编译:

在终端里执行

make -C src -flinux.mak clean all

继续阅读

寒假六天计划

和之前两次放假一样,学校总是喜欢到将要放假的那一天宣布坏消息。这次本来公开宣布,在家庭报告书也写好,高三全体学生将要放12天假的消息,却又给实验班的学生制定了额外补课计划,从而将12天假期缩短为6天。使得本来可以到冰天雪地的加拿大去冲个热水凉的计划都报废了(瞎想的)。

    既然六天,就六天也没所谓了。我们在学校看着别人过年好了,大伙儿都没表示多大反对的态度,因为到高三了,做这种事情的人少了。一是从高一开始叛逆到今收不到任何效果,所以也不抱希望;二是少玩几天多上几天课也对自己没有多大不好。

    我回到家里,按照放假前定下的计划,第一二天拿下QQ2009协议,发布MyQQ2009。第三四天过节,第五六天才在自由放松的同时做试卷的。不知道我这样给自己高考复习的时间安排得是否得当。我发觉自己每次考试都几乎会犯同样一个错误,就是……考砸一科。我说的考砸了不是考不到平常的分数,而是比平常的分数要低将近一半。同学们都说我会潜水,但我知道是自己状态不好。所以,我想方设法把文化课的成绩稳定下来。寒假补课期间的外宿申请也是我的计划之一。

    以前觉得两个月的假期也一转眼过去,现在六天的假期转眼已过了一天。谋事在人,成事在天,希望寒假的计划会按期进行。

我的人生目标?!

昨天下午,一位暨南大学的副校长莅临一中进行一个“大学与人生”的专题讲座。一开始,我有点鄙视他,理由很简单,一中的副校长给我的印象差极了。未等他的讲座开始几分钟,我发现我错了,我竟被他精彩的言词诱惑住了,完全进入他营造的活跃氛围之中。他的讲座可以和王国权,陈安之的相媲美了。当他问道我们高三学生有哪位有明确的人生目标时,我毫不犹豫地把手举得很高。

    我很早就有了一个明确的人生目标,但是随着时间的推移,也在不断地完善。我的人生目标,也可以算是我的梦想。我梦想以后自己不仅是一名发明家,又是一名企业家。我的创造计划分两步进行,第一步是研制一种帮助人们工作的远程机器人,这种机器人能被广泛地使用,并且像计算机一样进入将来的寻常百姓家。人们在上班的时候可以通过使用远程机器人来看家或者照看小孩。身在另一半地球,仍然可以通过卫星使用远程机器人来和地球另一半的人交往。第二步是研制一种具有初步人工智能的机器人,虽然没有人那样的感情与智慧,但是能帮人干活,例如帮你拿东西,帮你脱衣服、洗衣服,帮你购物、开店,甚至帮你打官司,做保镖等。

    总的来说,我的人生目标本质就是给人类服务,给人们的生活带来便利和精彩。虽然这个目标还很遥远,但是我时刻准备着。我写过操作系统,写过网络程序,研究了神经网络算法,也算是给以后的道路做铺垫!给我加油吧,大家!

破机,煞费心机,还是不行啊!

父亲在几年前,大概是05年吧,就买来了一台二手的IBM T22,主板写着是2002年的产品,左下角还有Windows2000的商标。此后2年,这台笔记本一直伴随在父亲身边,辅助他摄影的业余工作。我平时在家里也和他共享使用。

    我上高中后,环境与初中完全不同,学校没有那么有代沟的网管,我平时也不知道到哪里去上网。严重的是,在这种恶劣的条件下,我将近一年没有研究算法了,提高组的信息学奥赛也没希望参加。上高二之后,父亲同意了把他的笔记本让给我使用,他在家里用旧的台式机。这样,我才又开始了写程序的业余活动。

    话说这台笔记本虽然很破了,处理器是Pentium III 900MHz,内存是256MB,硬盘40G,但是挺适合我写C程序的,用Java,C#就妄想了,因为至少要512M内存才能跑起个VS.net来。我安装了DeepinXP,速度就是快,工作起来可谓与P4一样爽。没有安装任何的杀毒软件,但也不是像传说中的裸跑,我是用自己开发的文件保护系统啦!奇迹的是,我那么经常上网,居然至今还没有感染过病毒,倒是在硬盘里保存有几个从别人机子抓来的病毒。现在我用的操作系统还是2007年暑假安装的那个。另外,操作系统我采用Grub引导,除了XP还安装了Xubuntu和SGOS(自己的操作系统)。

    一直用的好好的,可是呀!有一天,机子突然蓝屏了,重启了,然后一会儿又蓝屏了,又重启了……过了几天,连机也开不了,只有电源灯还在亮。我以为是内存问题,拔了一条128M还是一样的情况。又以为是散热问题,把机壳拆了,还是一个样。有时重新插上内存又可以启动。但还是会突然蓝屏或者自动重启,甚至直接死机。肯定是硬件的问题,什么操作系统都一样的结果——死机或重启!

    有一次,不管我怎么弄都开不了机,一时愤怒就把工具都搬了来,把所有能拆的东西我都拆了下了。IBM的工程师还真是强呢,我研究了2个小时才把主板弄了出来……待我把所有东西都清刷一遍后,才发现自己已经记不起拆出来的一大堆零碎的东西怎么装回去了。Chill!! 犹豫了好久,还是尝试自己组装一下了,我相信自己的能力,这点东西都搞不好,就不该进学校的实验班了,呵呵!经过半小时研究和尝试,终于又砌成了和原来一模一样的形状,不过倒是多出了3块铁片不知道固定在哪里。但迫不及待一试,我插上电源后,一按电源按钮……灯亮了,屏幕也亮了,那个熟悉的IBM Logo又出现在眼前……

    本以为问题弄好了,却还是会在紧急关头不听话,真让人受不了。前几天又给内存压了几块胶布来固定,稳定运行了两天。到今天问题又复现了。估计不是内存问题了……我可真对这破机绝望了!

    破机,煞费心机,还是不行啊!

    不过,除了经常重启这个毛病,对于我平日操作来说,已经是非常适合不过的了!而我之所以还叫它破机,是因为我多少优美代码被它一个突如其来的死机扼杀了啊,该死的机子!

    

和尚诗歌两首

高中的生活,虽然很乏味,但乏味之中又夹带着不可缺少的青春乐趣。下面的两首诗词是我给坐我前面的同学作的。因为有一次他把头发剪得很短,大家都称他和尚了,虽然一开始他很不满,但他最终还是乐呵呵地接受了这个外号,因为他有这那海纳百川的胸襟啊!

第一首:

和尚踩场

少林寺庙老和尚,

人人称他为方丈。

既吃清斋又吃肉,

鱼翅螃蟹还不香。

日子一天一天长,

寺庙钟声不见响。

溜进一中篮球场,

比比功夫谁最强。

米五二见老和尚, (米五二是我们校副校长)

竟敢一中来踩场。

一招铁头撞出墙,

时人闻之心一凉。

和尚号称宿舍长,

斌哥面前敢大量。 (斌哥是我们幢宿舍的管理员,长相超凶)

一个拳头身痒痒,

死老和尚嫌命长。

第二首:

木鱼当红薯

和尚今天亲下厨,

没斋没米煮木鱼。

木鱼下锅没油煮,

摆个火堆烧红薯。

一道高精度计算题

网友Mutalisk给的一道题目,
计算 (1+2^0)*(1+2^1)*(1+2^2)…(1+2^32)

今晚赶回家了,花了几十分钟写好了代码,计算结果和Mutalisk的一样。运行时间为10毫秒,当然,是在我PIII 900Mhz的机子上,基本上一闪就出结果。
我的结果是160位,
41900194778866063098
69616409977680717118
75372548418310142014
25167533420258842344
35351687855236795051
88646940175563375578
68147135401121187966
16074978167792968750

源代码下载
 

继续阅读

Good good study, day day up!

Time flies! Now I am already a high school student of Grade Three, ready to be a college student. What I am doing every day are consistently papers, homework and a pack of exercise books. Thus, I have no time to do any programming or even to improve my website. Yet I will not give up my interest in computer. Exactly, the progress of my studies benefits a lot, especially in my programming.

    As a proverb, where there is a will, there is a way. In other words, if you make up your mind to do something, you will certainly accomplish your end. That stands to reason. Having this faith, I always try my best to do everything. As a result, I become good at computer programming, mathematics, physics as well as English

    These days, I am still looking for a method that is suitable for me to improve my Chinese, the subject that I didn’t learn well before because I had thought it boring for a long time. With the help of my respectable Chinese teacher, my score of this subject is increasing. It’s she who made me understand the importance of languages. Now I feel better to cope with the characters.