(61) 空间
话说二人斗的正酣,忽然bash报告,从主人那里发来命令"shutdown -h now",数秒钟后,一切归于沉寂…………
要我说,这俩人都什么劲啊。每个软件都有它存在的意义,都有它的长处和不足。就说这毕加索吧,虽然比f-spot功能强点,不过毕竟不是原生的程序,至少占用内存就比f-spot大不少。毕竟毕加索不是一个人在干活,他必须有个毕翻译才行,所以占用量一下子就上去了。这内存可是重要的系统资源,跟CPU一样重要,所以作为软件,还是应该本着艰苦奋斗勤俭节约的精神,充分利用内存,避免浪费。不过我们linux下的软件们基本是小巧的居多,这里的4G内存还真没被我们占满过。f-spot也就占用20来M的内存,毕加索比他多,也只有40多M。当然,并不是说两个软件就一定比一个软件占用的内存多,一个软件占用的内存空间分为很多部分,咱们慢慢说。
首先,这个软件本身得占用一定空间。就像你去公司上班,你自己得有个坐的地方吧。就算你不坐着,站的地方也得有一小块吧。总之,自身会占用一定的空间。软件本身是由一条一条的二进制代码组成的,咱以前不是说过Rubbish的故事么,gcc包工队把主人用C语言描绘的图纸编译成了一堆二进制的代码,这堆代码就是Rubbish。其他的软件也是一样,都是一堆代码,所以,软件程序自身占用的空间叫做代码段。这个代码段的大小在程序进入内存运行前就确定了,或者再往前想,在程序编译好之后就确定了。这个很明白吧,就像你在家睡觉的时候是一米七五,不可能到单位就变成一米六零了吧。
然后,软件会随身带一些静态的数据,一般是一些初始化了的全局变量,每次起床时这些数据都会被带到内存里来,而且每次的初始内容都一样。就像你每天上班都得带着手机啊,家里钥匙啊,老婆照片啊之类的。比如Rubish 1号每次都喊“Wa Sai~,”这个字符串就是个数据,这个数据像是Rubbish每天随身带着一张纸条,起床来到内存后看看上面的内容然后喊出来。(当然,写程序的时候也完全可以把这内容写进代码段,那就相当于Rubbish 1号记住了这个字符串,不用看纸条,直接喊出来。)这种随身带着,每次都会用的数据所占用的内存叫做数据段。
另外,软件可能还需要一片固定的空间来放东西。比如你的办公室,每次上班都毫无疑问的需要一张桌子,你一进办公室就得准备好这桌子,要不你怎么办公啊。(虽然这桌子不是每天现打造的……)程序也是,有些空间是一定会用到的,一般是一些未初始化的全局变量,不一定存什么数据内容,这种空间叫做BSS段(可不是BBS啊),这个也是在程序编译完成之后就确定下来的。每个程序启动,我都会根据他有多胖来确定他需要的代码段有多大,然后根据他有多少随身物品来确定数据断有多大,最后,根据他身上写的BSS信息来决定给他分多大的空白空间供他使用。
以上说的都是程序一起床就需要分配的空间,除以之外,程序在工作的时候还会根据情况向我动态申请内存空间。这就是那种必须记得释放的内存空间了,他的名字就叫堆。这种空间,程序在刚启动的时候是不知道需要用多少的,得视具体情况而定。比如gedit小弟,主人要些个小文件,gedit就申请一小块空间临时存放主人写的东西,等到主人越写越多,gedit就会逐渐向我申请更多的空间,把主人写的东西都堆在那块空间中。(要不怎么叫堆呢)
最后,还有一种动态申请的空间,叫做栈。这种空间是让程序随手放一些临时的变量的。比如临时有个什么事儿,或者有个什么数据,要存起来,就跟我申请栈空间,临时存放一下。栈就像一个小圆筒,程序需要用的时候我才给他,寄存在这筒里的东西都是很快就要用到的,这个空间不用程序去释放,程序退出之后我直接把筒里的东西倒光,把筒收回。因为是个小筒,所以,最先放到里面的东西会被之后放进去的东西压住,必须把后放进去的东西拿出来之后才能拿到先放进去的东西,这叫先进后出,是栈的特点。