奔向64位:内存管理(小内存环境)
软件世界
小内存,大存储
有些设备虽然内存的容量并不大(可能只有数百KB或是1MB~2MB),但是带有一个相对足额的二级存储器(Secondary Storage),这样的设备是小内存设备中比较常见的。像PDA、手机或是便携式媒体播放器等,都是这种设备的例子。
我们必须掌握Data Files和Resource Files设计模式,以充分利用二级存储器的临时中介功能,从而保证内存里永远只是用户能够感觉到的数据,比如游戏的得分、人物的贴图、正在查询的股票资料等等。
Data Files把文件拆分成若干个部分,顺次读入,依据用户的关注点而定。Data Files需要把源文件按固定规则拆分,所以这时就需要源文件的结构本身具有良好的结构定义,可以适配主存大小的1/3,可以流水作业。UNIX是被证明在内存分配方面非常成功的操作系统,在那里,我们一般采用的是文本文件。但在现代的内容处理方面,我们更倾向于使用XML。64位的Windows中,System.XML.dll库提供了许多细粒度的的对象可供调用。一个非常重要的对象是System.Xml.XmlTextReader,使用它可以抽取XML文件的结构元素,System.Xml.Xsl.XslTransform对象则用以高效地完成XML到HTML的XSLT变换,在设计浏览器和文本编辑器的时候,规则内容分解的知识是尤其重要的。Resource Files则采用了二进制格式存储所需要的数据,这里当然要用到压缩存储,是游戏和多媒体应用常用的模式。
时间!时间!
基于二级存储器作为缓冲的小内存编程技法,在实时性的场合,统统是不管用的。我们永远要记住一个事实:二级存储器的访问速度比内存慢太多!因此在实时性条件下,我们必须保证:所有的进程只用内存执行代码,最小程度地访问二级存储器进行数据读写。实时性设备的例子如导弹轨道监视系统和心脏起搏器,任何差错和延迟都是不能容忍的。
这种程序的设计,必须排定进程的级别,并在有限的主存中划分进程的独享空间,保证程序一旦加载即可以完全预期其行为:所有不超过空间的内存请求100%地被满足,所有超过空间的内存请求100%地被拒绝。在64位Windows程序设计中,这样的内存分配机制并不是系统级实现的,全部要靠程序员自己的编程功底做到。
对于大内存的请求,系统会调用换页机制,如果这并不是你的预期,你就一定要做到使用自己的一套办法来实现。C++语言中,提供了“placement new”语法,并允许实现自己的SmartPointer和引用计数(Reference Counting),所以多看一下大师级的作品,并动手在平常多练习,是很有必要的。