内存管理:算法及其c/c++实现
作者:by Bill Blunden
Wordware Publishing 2003
本书给出了几个垃圾回收和内存管理算法的具体实现方法。
关于作者:
Bill Blunden拥有Cornell大学物理学学士学位、Case Western Reserve 大学运筹学 (operations research ) 硕士学位。他有在企业中间件、分布式软件、安全协议超过十年的研发经验。他也是《c/c++设计与实现虚拟机》的作者。
作者信息:
至从1983年Bill Blunden首次接触DOS调试工具时,他就开始对系统软件着迷起来。他一门心思的想弄清楚机器内部的运行情况,他编写8259中断控制器的程序,并且成为Triple-fault俱乐部的荣誉会员。获得数学物理学学士和运筹学硕士学位后,Bill如脱缰之马一样,在工作上不断进取。在位于美丽的克立夫兰城的一家保险公司,Bill在保险精算师上施展了自己的才能,就是在那里,Bill与桀骜不逊的IBM大型机进行了肉搏战。虽然战斗得满身鲜血,但从未被打败过,Bill用出神入化的软件功夫来平息了一些聒噪之声。Bill用Java开发CASE工具,在COBOL中间件上摸爬滚打,受到控制数据的老手的质疑,这使Bill成为中西部主要的ERP高手。可以随心所欲地使用含有4颗CPU、2GB内存的机器,很难有什么原因迫使Bill放弃他的这方天地。然而,Bill外甥的出生迫使他走上了向西边硅谷朝圣的道路。Currently on the peninsula, Bill survives rolling power blackouts and earthquakes, and is slowly recovering from his initial bout with COBOL.
绪论
“不要注意帷幕后的那个家伙!”(Pay no attention to the man behind the curtain)
-The Wizard of Oz
有许多讲解计算机科学理论的课本讨论了内存管理。这些课本一般用不超过一章的篇幅讲解内存管理的相关内容,很少提供具体的机器层面的细节,设计到实际源代码的就更加是凤毛麟角了。当作者在书中旋风式的完成他的讲解时,读者对于幕后发生的一切还是知之甚少。如果书中讨论得本来就及其模糊不清,那么,出现上述情况也就不足为奇了。想象通过别人阅读乐谱来让你欣赏贝多芬的音乐、或者通过朗读手册上的文字来让你品味蒙娜丽莎美感这是一种什么样的感受!
本书与上述的书是不同的,区别很大。
在这本书里,我将拉开帷幕,让你看到幕后操作开关和滑轮的人儿。你可能为你看到的内容兴奋不已,或者为你以前准备看而没有看本书而感到愧疚,但是,就像Enrico Fermi所说的:知识总是比无知好的多。
本书对内存子系统进行了深度剖析,并且体统了大量源代码例子。在我没有权利使用源代码的地方(例如:Windows的源代码),我会提供建议来获得有案可查的线索,这些线索可以培养洞察力。很多书展示给读者的仅仅是内存管理的冰山一角,本书给读者强大的相关知识,目的是让读者能自己动手实践。
我在内存管理方面的经验可以追溯到80年代晚期,那是Borland公司俏皮的Turbo C1.0编译器刚刚发布,这是我首次接触C语言。清楚的记得当时为了弄明白C语言标准库函数malloc()和free()的工作原理,我使用一个反编译器去转换工程库的代码。在学校的时候,为了解码十六进制的代码,我不知道有多少个夜晚是在我的80╳25的单色显示器前度过的,这种工作十分困难,并且没有很大的回报(但是我的好奇心使我深陷其中,不能自拔)。幸运的是,我已经为你做了大部分艰苦的工作,你现在能容易地回避我曾经遭遇的所有困难和单调乏味的工作。
如果你的孩童时代像我一样喜欢把玩具拆开来探究它们的工作原理,那么这本书就是为你准备的,所以,把你的计算机摆好在放水胶布上,拆开你的编译器,把擦油抹布放在身边,让我们开始吧!我们将拆分内存管理子系统,然后在把他们组装在一起,让像灰尘一样蒙住我们眼睛的困难到它该去的地方去吧!
历史情况
在20世纪30年代晚期,一群学者聚集在Bletchley公园,努力解开纳粹著名的神奇密码。这群解码中有著名的思想家,如Tommy Flowers和Alan Turing。解密的结果导致了1943年第一台电子计算机被构造,这台计算机的名字是Colossus,它使用热敏真空管(现在的真空管)存储数据。随后,真空管计算机接踵而来。例如,美国军方为了计算弹道射程表创建了计算机ENIAC(Electronic Numeric Integrator and Computer)。
当1949年磁心存储器被发明时,令人震撼的下一波发展到来了。每一个内存位由小环形电磁组成。使用电线去磁化环形两极中的一极就可以使位的值由1变为0。第一台使用磁心存储器的计算机是IBM公司于1955年生产的IBM¹705。在那些日子,8KB内存是一笔极大的财富。
一旦使用晶体管制造存储位成为标准,一切都变了。当1948年Bell实验室决定让他们的新设备于公众于世时,晶体管就为世人所知了。1954年,Bell实验室构造了第一台基于晶体管的计算机TRADIC(TRAnsistorized Dlgital Computer),TRADIC比真空管计算机更小更高效。例如,ENIAC占地1000平方英尺,运行时引起费城电力超载,然而,TRADIC尺寸才大约3立方英尺,只需要100瓦特电力就可以运行。
在1958年,第一个集成电路被发明,发明者是一个名字为Jack Kilby的小伙子。别人在度暑假时,他在德州仪器的地下室里发明了集成电路。在以后十年多一点的时间里,也就是1969年,Intel公司出品了第一个1Kbit的内存条,之后,一切飞速发展,到现在,也就是1999年,我使用的计算机平台的内存是2GB的SDRAM内存,操作系统是Windows NT4.0工作站(service pack3)。
从以上的讨论你应该可以看出一个通常的趋势:使用更小、更快、更便宜的内存可以解决对计算机性能的要求。然而,物理规律限定了我们能生产的电子部件会有多大尺寸和多大的速度。最终,自然特性会阻碍我们的发展的道路。海森堡的测不准原理限定了我们生产无限小的部件的可能。海森堡的测不准原理表述如下:
如果你害怕数学公式,那么我用海森堡自己的话来表述这个公式的意思:“位置测量的越精确,在此时测出的动量就越不精确,反之亦反。”
换句话说就是,如果你知道微粒的确切位置,那么你就不能限定它,因为它的动量极其巨大。想象你去抓一个土豆,当你越是用劲挤压它时,它就越是容易从你的手中飞走。
爱因斯坦的一般相对论告诉我们不能生产无限快的部件。唯一的例外就是黑洞,它在这个宇宙的速度极限是每秒3x108米。最终,这两个物理极限将限制住我们的手脚。
当上述情况发生时,硬件行业或者不得不生产更大的芯片(为了在固定区域内容纳更多晶体管),或者使用更高效的算法,以便能充分利用现有的空间。我认为使用更好的算法将是更加容易划算的方案,这对于内存管理是绝对真实的,内存操作是如此的频繁和重要以至于设计更好的内存管理子系统成为将来研究的中心,所以,花费时间阅读本书将使你受益匪浅。