Monthly Archives: July 2007

windows xp 内存分配

这几天写程序,一直发现当程序分配较多的内存时会报错:
Unhandled exception at 0xxx in xx.exe: Microsoft C++ exception: std::bad_alloc @ 0x1198fc84,

查了一下原来XP只支持2GB的程序空间,程序想多用内存就没门了,只能用64位的xp了。
http://www.81ren.net/thread-6272-1-1.html

支持VLM(超大内存)   
在介绍VLM之前,我们回顾一下Windows NT 4.0内存管理的进化过程。因为Windows NT 4.0是标准的32位操作系统,32位指针能够访问的最大空间范围是2的32次方,也就是4GB。但用户的应用程序并不能使用所有的4GB空间,其中4GB的上半部分属于系统空间,操作系统的所有进程都运行在系统空间中。下半部分属于用户空间,但用户空间的最上层驻留的是系统的动态链接库(DLL),这样用户真正能够使用的空间就少于2GB。不过是这种把系统空间和用户空间分开的技术极大地增强了系统的可靠性。   

但2GB的应用程序空间对于大型企业应用来说,是远远不够的,于是微软在Windows NT Server 4.0中将用户空间调整为3GB,但是在这3GB空间中,系统动态链接库的位置并没有改变,这就是说用户的3GB空间并不是连续的,它被系统的动态链接库所隔断。   

随着计算机软硬件的飞速发展,许多大型数据库的容量达到了几百个GB,对内存的需求也大大地增加。为了更好地参与企业应用,Windows 2000对DEC Alpha平台提供了VLM支持。因为Alpha平台的所有指针和寄存器都是64位的,因此Windows 2000能够访问高达32GB的内存空间,其中最上部的2GB空间是系统空间,最下部的2GB空间是用户空间,中间的28GB也是用户空间,所有这些空间只有使用64位指针才能访问到,这就对Windows 2000的32位指针进行了64位的符号扩展。须要注意的是,中间的28GB内存空间是不可交换的,也就是说必须是物理上配置28GB内存,而不能利用硬盘上的页交换文件来进行模拟,此外VLM的I/O只能支持异步和非缓存I/O。对VLM的访问是通过VLMAPI来实现的,这些API是原有的虚拟内存管理API的扩展,但使用的指针和参数都是64位的。

camera多线程程序

最近写的camera图像采集程序是一个多线程程序,一个主线程创建了两个image grab线程。两个grab线程分别控制两组fps和resolution不同的camera,由于capture的桢率太高,120fps和30fps,所以无法实时存下image。因此我开辟了大量的内存,将capture的image先存到内存了,然后再不断的创建save image线程来存image,当一定内存区域的data存下来得时候,该save线程就把内存给free掉。

花了很多的时间才想到这个策略,实际上也是很有效的。然后写程序的时候,碰到了更多的问题。对于两个grab线程,我用了WaitForMulitipleThreads()来结束,而save线程,因为要考虑到实时性(save线程是在grab image的for循环里创建的,先grab一定数量的image, 然后创建save线程,然后再循环去grab),所以没有用WaitForSingleThread()来结束,直接创建了线程就不管了。这时候出现了很多问题,

1。我是在grab for循环里创建save线程的,也就是在for 循环里pack传给save线程的参数(内存指针,一些camera 参数,存image的路径等等),每次循环只更新部分参数。这样结果造成,参数在传给save线程之前是正确的,但是当save线程执行时,这些参数在save线程外得到了更新(因为thread函数传入的是一个void指针),在save线程里访问这些参数时,有可能被改变了,也有可能正在被刷新,这样造成了指针无法访问,char*出现了乱码。
解决方法,如果知道要创建的save线程数量,就开辟相应足够的空间来把这些传入参数统统存下来,每个save线程有各自独立的输入参数空间,这样就可以了。

2。grab线程只是grab image,然后new memory,创建save 线程就退出了。如果save线程的参数空间是new来创建的,这时候当grab线程结束,把save线程的参数空间给delete的时候,有些save线程还没有结束(磁盘操作是很花时间的),这样save线程就会报错了,参数丢失了。
解决方法,当每个save线程执行时,先把输入参数copy到该save线程自己的线程空间堆栈了,这时候如果输入参数空间被delete了,自己函数空间了也有备份,就一点问题都没有了。

就这些东西花了一个星期才搞兴趣,自己还是太笨了。

有点开始做research的感觉了

现在有点开始做research的感觉了。从上研究生到现在已经4年了,根本没有过在做research的感觉,感觉做的都是别人告诉你应该做的东西,用一些别人告诉你应该用的算法,当然大部分还是自己看paper知道的应该用的算法,但是自己的主动性还是不强,全身心参与的不是很多。

但是现在感觉有些发生了变化。这一个学期以来,发现都是自己决定买做实验用到的设备,小到一个螺丝钉,双面胶,一把手锯,大到一个camera,一个server,完全由自己亲自去买。读paper也是,自己去找相关的paper,自己感兴趣的paper。但是,看了一些paper后(!-_-, 自己看的还是太少)还是不知道要做什么。每当有个小的想法时,就会发现别人已经做过了,而且做得东西比自己想的还要多,效果也非常好。顿时有很沮丧的感觉。

如果一个人的努力能读出phd的话,也就不需要老板了。老板毕竟是老板,终究还是阅历丰富学识渊博,毕竟也纵横“江湖”比我多“几载”。虽然上个学期他也没什么idea,但是现在经过和老板的讨论,终于发现了一个很有意义的课题。有时候觉得自己要做个个方面,搭环境、设计算法、写程序,这些对自己都很陌生的,而且完全由自己掌握,自己不免会很兴奋。给自己加油,争取做出些有意思的东西来。