小王子活动的空间很小,这个pid为612的进程只有十六位的地址空间。虽然操作系统总是大手大脚地分配虚拟地址,但对小王子来说,十六位已经足够,
我们也不需要去纠结为什么64位的系统上会有如此狭小的内存空间了。
在小王子的进程上,就像其他所有进程一样,有好函数与坏函数,可是,函数的内容是难以预料的,它们沉睡在.text区域,
直到其中一个突然被调用…于是它就建立栈帧,开始向着栈顶生长。如果是无副作用的或者普通的函数就让它自由地去生长。如果是一个坏函数,一旦辨认出来,就应该马上终止它。因为有些非常可怕的函数会无限递归,假如你终止得太迟,栈区向下生长,内存结构就会被破坏。
至于堆区,小王子的堆没有什么复杂的分配器,各种各样的函数经常在这里建立一些临时的数据结构,然后在返回时忘记清理,
于是它们就这样被留了下来。过去堆区一直只有一些简单的结构,或是线性排列,或是在数据后跟上一个字的地址。
然而不知哪个函数建立了一个与众不同的数据结构,她看着像链表却有三个指针,如同二叉树却有两个数据位。随着一点数据的加入,她的指针开始复杂地切换,然后打着哈欠说到:
“我刚刚被建立,颜色还是乱糟糟的…”
“你是多么美丽啊!”
“是吧,我是与这个进程同时建立的……”
小王子的家很小,从来不需要做什么大计算量的工作,故而从未仔细研究过数据结构,但当他看到这课红黑树的第一眼,就知道她的强大,她应当去处理更复杂的任务,来到这里一定是个偶然
“…我并不怕什么垃圾回收,可我讨厌有数据夹在我中间。你就不能给我一块连续的地址区域?”
“讨厌中间夹着别的数据…对二叉树来说,真不走运,这红黑树真不太走运。”
小王子清理了一片足够大的块,把她转移了过去。
于是这棵红黑树便扎根在了小王子的堆上。
创建她的函数已经不可考证,她便这么空闲着,看着小王子时而为她增删一些数据、做些简单的搜索,时而拨弄几下她的指针,看她自己恢复如初。一天天就这样过去,她保持着她的骄傲,而小王子,他看着这一片空间,萌生了出去看看的念头
…
小王子出发前,他把几个全局变量重新初始化了一遍——他有两个活跃的库,用来辅助管理进程,只要每次把指针移动到堆的起点,就不会访问到不该访问的内容,让操作系统把进程叫停。小王子还有一个已经废弃的库,他想,说不定哪天它就重新更新了。
小王子还把最后几个会无限递归的函数从.text段删去了。他有点忧伤。他以为他再也不会回来了。当他最后一次为红黑树添加数据、梳理层次时,他发觉自己要哭出来。
“再见了”,他对她说。
(……未完待续)