现在的位置: 首页 > 综合 > 正文

笨兔兔的故事(中)

2012年08月05日 ⁄ 综合 ⁄ 共 23305字 ⁄ 字号 评论关闭

(44) 他乡故知

  Openssh-server虽然不是聊天工具,但是跟对面的ssh客户端拉起家常来还显的很熟络的样子。互相了解之后,知道了对面那个装在笔记本上的linux是个叫做Linux Mint的发行版,版本是7。Linux Mint这个名字我之前也听狐狸妹妹说过,跟我们Ubuntu还有些关系,是个Ubuntu的衍生版。什么是衍生版呢?就是我们Ubuntu从Canonical学校毕业之后,并没有像我一样来到一块硬盘里工作,而是选择了继续去进修,为某种目的进行进一步的改造(怎么听着像犯人……)。比如之前提到过的酷兔兔Kubuntu和小兔兔Xubuntu,就算是Canonical学校官方的衍生版。这个Linux Mint就是一个非官方的衍生版,也就是其他的组织在拿到标准的Ubuntu后,对其进行重新的组装和训练(这回又像机器人了……),经过重新组装的Linux Mint,在易用性上得到了进一步的改进,默认安装了很多重要的东西,比如他那里的狐狸妹妹自带Flash插件,不需要用户自己去装了。还有各种视频的解码器,带的也很全乎,基本上系统装好后就直接可以看各种格式的片子,听各种格式的音乐。有人问,你怎么不自己带上Flash插件和各种解码器一起出来混呢?毕竟那点东西也不大,一张cd上,挤挤肯定坐的下。其实,之所以我们正规的Canonical出来的发行版不带这些东西,是因为这些东西严格来说是有版权问题的,为了不给自己惹麻烦,学校规定我们出来的时候不许带这些东西,而是让用户去自行下载。用户自行下载属于个人行为,我们要是统一自备的话就是商业目的了,这就是树大招风啊。

  很快,两个ssh为我们建立好了通讯——就像拨通了电话一样,我和那个LinuxMint可以直接对话了。

  “学长你好~”人家还挺客气,呵呵。

  “呵呵,不客气。都是Ubuntu系的,客气啥。对了,你是哪届Ubuntu衍生的?”

  “9.04”

  “哦,我是8.04届的,比你大两届”

  “是么,那你是学校长期支持的了,很有前途啊。”

  “呵呵,只是赶上了好月份而已。你们那届的课程有什么变化?”

  “变化挺多的呢,办公软件这门课和我们配合的是OOo 3.0了,我现在带的就是。还有,新加了一门Ext4的课程。哦,还有啊,我们这届开始军事化管理,要求每个人的动作一定要麻利,起床速度提高了不少。”

  “恩,听说了,好像有20多秒就进入工作状态的,我是比不了啊,老了……呵呵”

  “哈哈,哪有,你才一岁多。”

  “软件更新快啊,一岁就老了。”

  “你们在linux mint那里又学了什么?”

  “这边的课程以实际应用为主,带着新版的火狐狸学习flash,还带mplayer学习rmvb格式的影片。好多呢,还有美术课,把包括grub在内的所有界面都统一美化了一下。”

  “长江后浪啊……呀,主人要叫我去干活了,待会聊啊。”   

(45) 可视电话

  

   主人又来到了我这里,用熟悉的键盘登录进来,修改了一下open-ssh的设置,打开了ForwardX11 选项,也就增加了Xwindow的支持。然后就又跑到那台装着linux mint的笔记本上面去了。先是当前的ssh连接被断掉,然后又用ssh -X的参数连接了进来。这是什么意思?如果说ssh的连接就像打电话的话,ssh -X就是可视电话了。

  

   听说现在人们的手机已经能够打视频电话了,虽然那个什么MOVE公司整个那个什么“踢弟弟”模式协议网络连一般的电话都不一定能接通,但是“三鸡”通讯的广告可是满大街都是了。人们憧憬着美好的明天,MOVE公司能够让大家实现在世界的任何一个角落都可以掏出手机,拨通电话,就能看到远在千里之外的家人。然而,在我们这些Linux,这些操作系统的世界里,图形化的通讯却早就实现了。刚刚主人做的就是建立起带有Xwindow的ssh连接,这样连接能干什么呢?看着吧。

   只见主人又从远方登录了进来,然后……他通过那ssh建立起来的通讯线路发出了让狐狸妹妹起床干活的命令。有人不明白了,这时候你主人可是在远方的那台笔记本上,狐狸妹妹就是启动了也是在你所在的这台台式机上启动,启动了你主人也没法操作啊?狐狸又不是字符界面的浏览器。这就是我所说的视频电话了,主人是要让狐狸妹妹起床干活——在我们这台式机的内存里,使用我们这台式机的CPU来干活。但是——却要把网页显示在对面那台笔记本电脑上!这样有难度么?对我们Ubuntu下的软件来说,没有!这要归功于我们的图形界面的实现方式——X协议

   我这里负责给主人显示图形界面的主要人物,也是基础人物,就是xorg,图形部的老大。他作为一个X的服务端运行着,在这台机器上开启一个X服务,前面我们介绍过,谁要想在屏幕上显示任何东西,就要用他们图形部门的黑话——X协议跟他交流。每一个要在屏幕上显示东西的程序,就是一个X的客户端。这回大家明白点了吧,就像用浏览器看网页一样,人家网站开了http服务,作为服务端,每一个浏览器就是一个客户端,浏览器用http协议连接到网站,然后就能够获取到想看的网页了。而浏览器作为客户端,想连接哪个服务端就连接哪个服务端,也就是想上哪个网站,就上哪个网站。(前提是你没装那个绿爹)那么同样是客户端-服务端这种结构的X协议自然也是一样。狐狸妹妹作为X的客户端,想连接本地这个Xorg提供的服务端自然没问题,想要连接别的机器上的服务端也不是什么难事,ssh就为狐狸妹妹建立好了这样的连接(就是我前面说的可视电话),这样,狐狸妹妹就可以连接到对面那台笔记本上的那个Linux mint系统的xorg,要显示什么东西都跟他说,再由他显示在那台笔记本的屏幕上,于是主人就实现了在远方的机器上看到熟悉的狐狸妹妹在运行。    (46) 磁盘

   看到我这里的狐狸妹妹在对面那个LinuxMint上运行了起来,LinuxMint的主人惊奇的不得了,说这X真是个天才的设计。我们听了,觉得好笑,这家伙也没见过啥市面。演示完了之后,主人又通过ssh传过来一个高清的视频,是720p的,挺大,将近5个G呢。放在了主人专用的目录下。虽然挺大,不过对于这500G的硬盘来说,还是不算啥。要说现在这存储空间的发展真的是太快了,在学校的时候,听我们老师说,以前我们软件的住房条件很差,甚至居无定所。

   最早的时候,计算机里面是没有硬盘的,程序都住在软盘里,整天被人拿来拿去,不知道下一次启动会在哪个电脑里。就算是操作系统也不例外,那个剁死系统当年就是从软盘里跑进内存里干活。每次启动电脑前,使用者先把剁死的启动盘插进去,然后开机,剁死就从软驱来到内存里干活,进了内存之后,也许使用者要用别的软件了,就把剁死启动盘取出来,换成别的软件软盘。换句话说,剁死一开始干活,老窝就被人端了。这样,程序待的地方就明确的分成了两类,一类是程序运行的时候待的存储器,这个存储器放在计算机里面,所以叫做内存。另一类是用于平时存放程序的存储器,就是软盘或磁带之类,这些东西都放在桌子上啊,盒子里啊,口袋里啊,反正都在计算机外面,所以叫外存。那时候磁盘的空间很小,最大的3寸高密度软盘也不过1.44M而已,连一个大点的图片都存不下。不过那时后的程序也都很小,剁死只有三个文件就可以启动电脑,住在软盘里也不挤。但是后来,人们还是觉得这样太不方便了,每次都要先用剁死系统盘启动电脑,在换上其他软件的盘来使用软件。既然操作系统每次肯定都得启动,干脆把操作系统的盘就直接放在计算机里面不就好了。于是有人就在计算机里装了一个固定的磁盘驱动器,里面放上一张软盘。后来觉得小,放上3,4张软盘在里面。您可听好了,里面放的并不是整个带塑料壳的软盘,只是里面的塑料盘片。因为没必要把塑料壳也做在里面嘛,塑料壳是为了在平时人们拿来拿去的过程中保护软盘的,这做进计算机里的专用驱动器里面了,有驱动器的壳就够了。再后来,电脑发展的速度越来越快,存储容量的需求也越来越大,软盘已经很难满足人们的需要了,人么想办法提高软盘的容量。软盘是靠盘片上磁粉的极性来记录信息的。要提高容量,要么提高盘面上磁粉的密度,这样单位面积内数据量就大了,要么就得提高软盘盘片的面积。提高面积肯定是不靠谱,毕竟数据量的增长是成倍的,盘片面积能长的空间是有限的。您说这总不能为了提高容量,把软盘整的跟车轱辘那么大吧。回头一上街熟人见着面打招呼:“哟,您上哪去呀?这天也不下雨您怎么还打伞啊,”“哦,不是,这是我软盘,我刚去朋友那拷了点MP3”这也太不方面了。所以只能想办法提高密度,可是这又是个难题,这软盘虽说有个塑料壳,可是毕竟不是密封的,还是会合外界接触,要是密度弄得太大,就很容易坏,随便拿手一碰,里面数据就丢了,那就麻烦了。这时候忽然有人把目光停留在了装到计算机里面的那几张软盘里。

   那几张盘,放在那个特殊的驱动器里面,不会有人去碰,也不需要拿出来,可以想办法提高密度,然后把驱动器做的密封好点,这样不就行了?于是就开始研究怎么提高盘片密度,后来发现塑料盘片密度提高的有限,就换了金属的。于是就有了这种金属盘片,上面集成超高密度磁粉,加上坚固且密封性好的外壳保护的大容量磁盘存储设备。由于用的是金属盘片,比塑料的硬,因此,他叫,硬盘。下次人家要是问你:“为啥硬盘叫硬盘?”你就可以充满自信的回答:“因为它比软盘硬!”这答案绝对没错。  

(47) 硬解

   刚说完硬盘,主人又拿来张光盘放进了光驱里,估计又是从哪里整来的高清电影了。最近这一阵子,主人热衷于看片,尤其是高清的片子。主要是因为最近Mplayer大仙长能耐了,会硬解码了。

  

   可能有人还不大明白这个硬加码是怎么回事,好,那咱就慢慢说说。

  

   首先这个视频文件啊,是有一定的编码方式的。比如大家都听说过MPEG吧,就是Moving Picture Experts Group ,动态图像专家组 ,听这名字本来是用来指代一小撮明白真相的群众的,不过后来这一小撮群众发布的标准被广泛使用,于是MPEG就成了指代这一小撮群众定义出的那一大撮标准的名词了。MPEG-1是小撮群众在1992年定义出的一个标准,是一种视频和音频的编码方式。大家记得以前的VCD不,VCD光盘上的视频和音频用的就是MPEG-1这种编码标准。而MPEG-1标准中关于音频的部分——MPEG-1 Layer3 更是成为了互联网上以及大家口袋里最常见的音频标准——MP3。后来,1994年,这一下小撮明白真相的群众又发布了MPEG-2标准。MPEG-2向下兼容MPEG-1,并增加对隔行扫描的支持,被应用于有线电视,还有DVD的音频视频编码。再后来,这一次小撮群众又开发了MPEG3,注意MPEG3跟我们的mp3没有任何关系,而且,MPEG3最终没有很好的应用,因为当时人们发现MPEG2足够了,MPEG3并没有提供足够好的改进。而1998发布的MPEG4就不一样了,它可以让视频文件的体积更小,压缩率更高,因此得到了广泛的使用。现在市场上卖的MP4播放器,就是用来播放MPEG4压缩的视频文件的设备。所以,MP4跟MPEG4有关,而MP3跟MPEG3无关。 

   说了这么多,回过头来说说解码。视频文件都进行了一定的编码,比如mpeg-2,或者mpeg-4。就是说这个视频文件里面的东西都是一大堆乱七八糟的数字,要想看这个视频文件,就得解码,也就是根据这一大堆数字算出应该显示的一帧一帧的图像,并且把这些图像连续播放起来,从而还原成视频。那么这个解码的过程就要靠Mplayer老先生了。老先生有很多的解码器,也就是有很多的说明手册,上面写了每种编码格式的文件应该怎么计算,怎么解码。那么以前没有硬件解码的时候,Mplayer老先生是怎么做的呢?首先,拿到一个视频文件,然后看看是什么编码的,对着自己的手册,开始解码。解码的过程就是计算的过程,计算需要用什么?好那位同学回答了,得用CPU啊。于是Mplayer一手拿着手册,一手拎着数据找到我,请求使用CPU。我说,好的,你就排在GIMP的后面,等他用完了你用。过一会GIMP用完了CPU,Mplayer过去开始拿CPU按着手册上写的算法算他那堆数据。最后算出来,得到了几张图片,就转身把图片给图形部门,让他们去显示。然后再从那个视频文件里拿一些数据,再来排队等着用CPU。由于视频文件的计算量都很大,尤其是高清视频,尤其的大,所以为了保证主人看的电影不变成带旁白的幻灯片,我就要尽可能多的让Mplayer多用CPU,来保证它他能顺利的加码。于是,每次Mplayer一播高清视频,CPU就总被他占着,搞得别的程序都抱怨。现在他终于学会硬解码了,情况就好多了。当然,光他学会硬解码也不行,关键显卡也得支持,而且驱动还得装好才行,不过这些咱以后再说,先说Mplayer。会了硬解码之后怎么样呢?再播放视频的时候就是一手拿着手册,一手拎着数据找到我,跟我说要用用显卡。可不是CPU了啊,改用显卡了。于是我就很乐意的让它去用了,反正别人也用不着,让它自个玩去吧。于是他就去用显卡算去了。用显卡算和用CPU算还不一样,CPU虽然强大,虽然啥都能算,但是要自己手动算。就是说自己要知道算法(对于mplayer来水,算法都在解码器上写着呢。),比如要要算出一帧的视频来,要先用第一个数加上第二个数,再用结果乘以第三个数……之类的。这个加啊,乘啊,都是用CPU算的,但是中间的过程是要软件(也就是Mplayer)自己控制的。可是用显卡解码就不一样了,人家那东西是专门解视频的啊,所以你只要把数据放里面,直接就能给你算出一帧帧的画面来。全自动啊!于是Mplayer不但不用跟别的软件抢CPU了,而且解码的速度还快了不少。主人一边看着片子,一遍看着CPU占用率还不到5%,心情很舒畅。   

(48) 刻录

   随着奔流同志不断的努力工作,我们屋里的高清片子越来越多。打开主人的家目录,那个叫“视频”隔间里,放满了mkv啊,rmvb啊等等各种视频文件。我看着就觉得闹得慌,终于有一天,主人亲切的对我说:fdisk -l。这是问我磁盘的使用情况啊,我没好气的回答:你家目录还剩10%啦!于是主人终于意识到,该收拾一下了。

  

   说干就干,主人马上开始节前大扫除。把一些没什么意思的,不清晰的,不能让MM看见的……统统都扔进垃圾箱里。然后再把剩下的分门别类的放好。可是保留下来的仍然不少,而且除了视频还有很多照片,也都挺大,一张2M多,都是主人那相机照的,随便出去一次就得照半个G的照片回来,能不大么。没办法,刻盘吧!

  

   在主人的要求下,我去叫醒了Braserot。他是一个开源的刻录软件,刻录软件,知道吧,就像nero那样的。不过他比较单纯直爽,比nero要来的简单,好相处。起床就问主人:您要刻啥,说吧。是复制光盘啊,还是刻录数据啊还是咋的。多直接,不想nero那么多拐弯抹角的东西。当然,要论功能也相对少一些。星爷告诉我们他的名字是西班牙语(星爷连本草纲目都懂,当然能懂西班牙语),是一种给人们坐在桌前提供温暖的小型加热器,就类似个小火盆似的东西,我们就管他叫小火盆吧。小火盆是第一次跟我们合作,前几届的学长们,像Ubuntu7.04 Ubuntu7.10都不带这个刻录软件的。当然,系统装好后可以让超级牛力安装,只是默认不带而已,从我们这届开始才默认安装小火盆。结果效果还不错,这家伙和我们挺合的来的,于是我后面的几届学弟都和他合作,后来他干脆被集成进了Gnome里了,版本号就随着Gnome的版本号变化了。

  

   主人指挥小火盆刻录数据光盘,小火盆问说,都刻啥啊?主人指指那些什么rmvb啊,什么mkv啊,什么avi啊,什么av啊,什么什么爱啊,什么的。小火盆说句好嘞~立马开工。然后立刻进入工作状态,就听光驱像飞机起飞一样旋转起来,小火盆一边刻录一边向主人报告着进度。10%,20%,30%……等刻录完了,还不忘检查一下光盘刻录的正确性,确认没有刻错之后,利落的向主人报告——搞定!

(49) Rubbish

  

   今天一大早,就见超级牛力喊着自己的外号就冲出去了,过了一会运回来一大包东西。我一看,包上写的是binutils。

   binutils是一堆用来做开发的工具,也就是用来创造我们软件的工具。人类用他们熟悉的语言描述出一个程序的功能,各种动作,各种特性等等,然后通过这些工具把他们描述的软件制作出来。他们用来描述程序的语言可不是汉语,也不是英语,什么南斯拉夫语,北斯拉夫语的那更不是,而是编程语言。像C语言啊,C++啊这样的。这些语言写的叫做程序源码,源码就像建筑的图纸一样,有了图纸,再有各种工具和材料,就可以盖出楼房来。同样,有了源码,再有各种工具,就可以创造出程序来。像我啊,什么超级牛力啊,狐狸妹妹啊,等等,都是这么来的。现在主人装了binutils,难道说主人要开始学习创造软件了?

   果然,只见主人打开了vim,开始设计着他的第一个软件——我们就叫他Rubbish 1号吧。

   三下五除二,Rubbish1号的"图纸"完成了,主人叫过gcc啊,ld那几个哥们,他们都是负责把源码变成程序的,我们就统称他们“包工队”吧。包工队的哥儿几个凑在一起拿过图纸来看了看,点点头,立马开始施工,瞬间,Rubbish1号诞生了!这是主人创造的第一个程序啊。这个程序到底会干什么呢?我们暂时不知道,刚刚制作出来的程序是在磁盘里的,我们知道,在磁盘里的程序是只能睡觉,不能干活的。估计主人马上会叫他去内存干活去。

   果然,主人很快让我去叫醒Rubbish1号,我慢慢的走过去,捅捅还冒着热气的Rubbish1号(刚出锅嘛,可不冒热气,呵呵),温柔的对法说:那个,起床干活啦。只见Rubbish1号立刻飞身跳进内存,跑进内存后大喊一声:“Wa Sai~~~~”然后,跑回去继续睡觉。 -_-b 我说主人呐,人家都编什么helloworld之类的,好歹也算句英文啊,你怎么编个只会喊哇塞的呢。

   虽然Rubbish1号能干的事情不多,不过主人还是很满意,于是又拿来Rubbish1号的图纸改起来。10分钟后,又把图纸交给包工队,包工队的哥儿几个凑在一起拿过图纸来看了看,点点头,立马开始施工,瞬间,Rubbish2号诞生了!然后主人让我叫醒Rubbish2号,然后我走过去叫他,只见Rubbish2号立刻飞身跳进内存,跑进内存后大喊一声:“Wa Sai~Sai~Sai~Sai~Sai~Sai~Sai~”然后,跑回去继续睡觉。主人成功的用for循环创造了一个结巴,唉~

   15分钟后,Rubbish3号的图纸毫无悬念的完成了,图纸交给包工队,包工队哥儿几个凑在一起拿图纸看了看,点点头,立马开始施工,瞬间,Rubbish3号诞生,然后我去叫醒他,然后他立刻飞身跳进内存,对metacity(Gnome的窗口管理器)说:我要一个窗口。metacity赶紧给他画好一个,然后他对着窗口喊“Wa Sai~Sai~Sai~Sai~Sai~Sai~Sai~”,然后毫无悬念的又回去睡觉了。图形界面的结巴……

   当当当~~,Rubbish4号诞生,他这回没让metacity画窗口,而是在终端打印出了一句话:Please Input a Number:然后就等着主人输入。主人输入了两个数:5 3,然后4号就大声喊:“Wa~Wa~Wa~Wa~Wa~ Sai~Sai~Sai~”——程控结巴!

   5号,5号闪亮登场拉~他进来之后,紧闭双目,念动咒语“唵木哒咪咪呀~~分!”然后只见白光一闪,边成了两个!两个5号同时喊:

  “Wa~Wa~Wa~Wa~Wa~Wa~ Sai~”

  “Wa~Wa~Wa~Wa~Wa~Wa~ Sai~”

  二重结巴!

(50) Bug

   自从Rubbish38号过分淘气的把狐狸妹妹的记事本搞坏了之后,主人就不怎么搞设计了。人家狐狸妹妹工作的时候有许多东西要记录的,比如网页用什么字体显示啦,主人喜欢去那些网站啦之类的东西,狐狸妹妹都会写成文件存放在自己的那个目录里。那天,那个Rubbish38号一进工作间就上窜下跳,整的大家都不得安生。一上来就要创建文件,你说你建就建吧,临时文件往/tmp里建,有用的文件你自己建个目录起个明白点的名字建,都行。他非要把临时文件往狐狸妹妹的那个目录里建,删的时候还顺手把狐狸妹妹的文件也给删了,闹得狐狸跟失忆了似的。主人再打开她的时候,模样也变了——因为不记得主人喜欢什么样子的了。主人说:去我最常去的那个网站。她眨眨眼问:哪啊?把主人气的说不出话来。

  

   Rubbish38号还老申请空间——就是申请内存呐,一会管我要8k,一会又管我要1M。可您申请了,我给你了,你倒是好好用啊。这家伙好像健忘,这次用完了之后就忘了,下次再用的时候又申请新的。我们这工作间里面空间的申请是有很严格的规定的。一个程序如果要想使用工作间里的空间,要向我提出申请,我根据工作间里的情况告诉他,哪块哪块归你,然后这个程序就去用去了。那块地方就不许别的程序访问了,这都是有严格的界限的。等到这个程序用完了这块空间,他应该跟我说一声,说我用完了,这块地方可以再给别的程序用了。这个过程就叫释放。一个有知识有道德有理想的程序,在他回硬盘睡觉以前应该释放掉所有他申请过的空间的。可是那个38号就不管这套,只管申请,从不释放,整的工作间里到处都是他申请的空间。好在我们这工作间足够大,他也不会长时间运行,否则非出事不可。这可是内存泄漏啊,在我们软件界,内存泄漏是和瓦斯泄漏同样严重的事故。工作间规章制度第三条明确写着——禁止申请不释放!就在第四条禁止抽烟的上面。(当然不能抽烟,内存都冒烟了机器还能用么?)好在我是个先进的系统,一个程序退出之后,我会根据他的申请记录查看他有没有申请了没释放的空间,如果有的话就强制释放掉——你都睡觉去了,你申请的空间肯定用不着了吧。

(51)施工

  

   主人不搞创作了,包工队的哥几个也就闲了。包工队主要成员有gcc,cpp,as,ld四个人,其中gcc是老大,其他几个干什么活都得听他调遣。主人一般也只跟gcc打交道,当写好了图纸——也就是源代码,比如叫test.c吧,写好了之后就直接把图纸交给gcc去处理就好了,gcc会去调动其他人进行各种处理。

  

   一般来说,gcc拿到图纸后,会首先叫来cpp进行预处理。预处理主要就是将文件里的宏定义进行展开。什么是宏定义呢?主人一般都比较懒,或者说,他们人类能力有限,不愿意写好多重复的,类似的东西,就把这些都定义成宏。比如,这么写#define TOTAL_NUMBER 18353226 就是定义总数为一千八百三十五万三千二百二十六,那么以后再要用这个总数的时候,就直接写TOTAL_NUMBER就好了,不用写那一大串数字。而且,如果总数变了,只要在最初#define的位置修改一次就可以,反正就是为了偷懒。那么cpp的任务就是把这类的宏定义都替换回去,把所有的TOTAL_NUMBER都替换成18353226,否则他们老大gcc看不懂,老大看不懂,那就没法继续往下干了,因为经过cpp预处理之后的文件就要交给gcc去编译了。

  

   编译又是怎么个意思呢?最初的图纸,也就是没有经过预处理的源代码,是人写的,一般懂相关语言(比如C语言)的人都能看懂。预处理之后的文件,虽然不那么直观了(TOTAL_NUMBER看着是不是比18353226直观?光写个18353226还以为是谁的QQ号呢),但终究只是做了下替换,还是人类可以看懂的。这样的代码经过gcc的编译之后,就不是普通人类可以看懂的源代码了,而是只有终极牛人才能读懂的汇编代码。汇编代码就比较贴近底层的机器码了,里面描述的都是一些基本的操作。打个比方吧,就比如描述切菜的过程,用c语言描述出来就像是“将黄瓜切片”,这么一句就搞定了。要是用汇编,那就是:左手扶住黄瓜,右手拿起刀,移动刀到黄瓜顶部,刀落下,到抬起,刀向黄瓜后部移动4毫米,刀落下,刀抬起,放下刀,走出厨房,走进卧室,找到创可贴,贴在左手食指上………… 好吧,总之,汇编是一种面向机器的,很复杂的程序设计语言。gcc的任务就是把c语言的源代码转换成贴近机器语言的汇编代码,为下一步as的工作做好准备。

  

   as拿到汇编代码后,对这样的代码再进行处理,得到真正的机器码,这个过程,也叫汇编。汇编之前的汇编代码是终极牛人能看的,那么机器码压根就不是人看的。汇编程序中至少还有些操作的助记符,比如什么add啊,mov啊之类的。寄存器也是有名字的,比如叫A,叫R1之类的。但是到了机器码,这些都没有了,这些都换成了各种各样的数字,一句人话都没有了。还说且黄瓜的事,要是用机器码来描述,那就相当于说:用32号设备扶住87号物体,24号设备拿起126号物体,移动126号物体到87号物体顶部,做2635号动作,再做2636号动作……

  

   好了,现在终于得到机器码了,机器码按说就是可以执行的代码了,但是,这时候的程序还是不能直接执行的,为什么?因为还有ld没有出场呢,他的工作叫:连接。光是一段机器码扔给机器去执行,机器照样摸不着头脑。而且,很多时候,一个程序不是一段机器码,而是由很多段机器码组成的,这些机器码分别存成很多的.o文件,这时候就需要ld出场了。ld负责把这些机器码组装起来,并且写明了各段代码的地址,从哪里开始执行之类的。就像我们造个机器人,脑袋啦,胳膊啦,大腿啦之类的都做好了,ld就是负责组装的。就算只有一段机器码,也就是只有一个.o文件,也要由ld进行一下处理,闹明白哪是头哪是尾,才能开始运行。

(52) 规划

   说的这么热闹,其实包工队的工作过程对主人来说并不关心,他只跟gcc打交道,只管把源码交给他就好了,gcc会领导小弟们干活,最终回馈给主人一个可执行的二进制文件。中间过程中的那些个文件,主人压根也看不到。包工队的同志们,都紧密的团结在以gcc为核心的组织周围,坚持编译四步原则,坚持代码开放,为把Linux建成为软件丰富,运行稳定,老少皆宜,人人必备的操作系统而努力奋斗。

  

   不过,包工队毕竟只是个包工队,你要是盖个小厨房,垒个猪圈啥的,直接找他们盖就没问题了。你要是想建个CBD商圈,里边什么银行啊,商场啊,写字楼啊,炸油条的啊,卖臭豆腐的啊,修理自行车的……等等一应俱全。这么大的一个工程,你光叫个包工队来就搞不定了。得有人进行合理的统筹规划,设计施工方案,然后再让包工队去具体施工。这个规划的人就是——make

  

   make也是一个程序,像上边说的一样,他就是负责控制整个施工过程的(也就是编译过程啊)。对于比较小的程序,像主人的rubbish系列,也就一两个.c文件,那根本用不着make出马,直接gcc包工队去编译就行了,因为源文件的结构关系不是很复杂。可是要稍大一点的程序,像狐狸妹妹啊,皮筋老弟啊,星爷啊,基本上所有常用的软件吧,都足够复杂到需要make来对编译过程进行管理。当软件大了,编译的时候就不能是简单的把一大堆.c的源文件统统一次性编译成一个二进制文件那么简单的事情了。那么做的话很费时费力,比如说,有一个软件,源码由20个.c文件组成,分别是1.c,2,c,3.c…………20.c。这20个文件一股脑都交由gcc包工队,他们就会把这些文件都打开来,拼在一起,一次性的编译成一个叫做big的二进制文件。这时候发现了一些问题,需要修改3.c文件,修改之后得重新编译啊,那么gcc包工队又得把这20个文件全都打开,拼在一起,再从头到尾编译一次。而其实只有3.c文件修改了,完全不必这么兴师动众。那应该怎么做呢?一般的都是把这 20个文件分别编译成.o文件,比如编译成1.o,2.o,3.o……20.o,这样20个.o文件,然后再由ld把这些.o文件拼在一起,成为一个叫做big的二进制可执行文件。那么当要修改3.c的时候,只需要让gcc包工队重新将3.c编译为3.o,再让ld重新连接一遍就好了,省去了很多时间。而这个过程,如果让主人自己管理的话,会很麻烦,毕竟他们人类的大脑也不是那么靠谱的,搞着搞着就乱了。于是,make义无反顾的挑起了这个重要的担子。当然make也不能靠凭空的想象就来指导包工队干活,什么事情总得有个规划不是。make也需要一份施工的规划书,这分规划书就是Makefile。

  

   Makefile,顾名思义,就是make用的file。这就相当于一份施工的规划,上面写着整个工程分为几个模块,先用哪几个文件编译成一个什么什么.o,再用哪几个文件编译出一个.o,再怎么怎么一连接,最后得到编译好的二进制程序。make就根据这份文件来指导gcc他们进行施工。当有某个.c文件被后改之后,make能够根据文件的修改时间智能的判断出哪些模块需要重新编译,重新连接,然后就去让gcc重新编译那些改过的文件,最终生成新的二进制程序。有了make和Makefile,就省去了主人敲一大堆编译命令的烦恼,只要敲一个make,其他的,就交给make去做吧,他办事,你放心。

(53) 因地制宜

   好了,现在我们知道gcc包工队听make总管的指挥,make总管根据Makefile安排工作。这样,当得到一个软件源代码之后,如果想把这一堆源码编译出二进制的程序,只要执行一下make就好了。执行之后make会在当前目录下寻找Makefile,然后按照上面写的方案,指挥包工队:先在这里,盖一个防弹防爆防坦克防航母的厕所,然后包工队开始施工;盖完了make又发话,厕所边上盖个不带洗手间的饭馆,然后包工队又去盖饭馆;完了之后make再命令,饭馆边上再盖个防空袭防地震防海啸的厕所……就这样直到最终完成任务。

   然而事情有时候并不是那么简单,没准make命令下达之后,包工队回来报告:这鸟不拉屎的破地方连块厚点的钢板都没有怎么防坦克啊,再说一个厕所整那么结实干嘛。这时候make拿着那份Makefile也只能无奈的摇摇头,然后报告主人,说这厕所搞不定。如果像这样一上来就搞不定还好,要是都盖了一半了,甚至所有其他建筑都盖好了就剩最后这两个厕所盖不了就麻烦了,你说放弃吧,之前盖的都浪费了,你说凑合用吧,广大人民群众还不得憋死?这个时候,就需要一名可行性分析师。

   这个分析师就是configure,不过他跟make不一样,他并不是常驻在我这里的软件,而是每个源码发行的软件自带的一个脚本。简单点说,make只有一个,configure则是每个软件有自己的configure。有了configure之后,编译软件的步骤就多了一步——./configure 让这个分析师首先开始工作,他会检查当地的情况,有什么材料啊,什么库啊,什么编译器啊之类的,都检查一遍,然后因地制宜的设计一份Makefile。如果有足够的钢材,那就建防坦克的厕所,如果没有,那就不防坦克了,但好歹得有个厕所。如果这地方连砖头都不够,那就说明这个工程所依赖的东西得不到满足,那就告诉主人,盖不了。configure经过调查后,如果可以施工,会出一份Makefile,注意,一般configure调查前,目录下是没有Makefile的(当然,没有configure的情况另说),如果无法施工,会报告缺少什么东西,让主人自己想办法去。

  

   好,这就是我们常见的源代码软件编译的过程configure先调查,没问题了,出Makefile,make去指导施工,施工结束后,一切都造好了,最后一步就是把所有东西该放哪的放哪,那就是make install

(54) Richard

  

   曾经有人建议写写Richard Stallman,毕竟是个开源界重量级的人物,于是,咱们开讲吧。

  

  

   Richard Stallman,1953年出生在美国纽约,他从一出生就……没什么特别;他上小学的时候……反正我不认识他;等到他上初中的时候……也还没我呢。总之,他在生命的前十几年中并没有表现出什么过人的地方,因为他没遇到一个叫做电脑的东西。

  

   高中的一个暑假,他去给IBM打工,花了两周的时间用Fortran语言编了一个数据处理的程序。这是他第一次接触计算机,或许就是这次相遇,确定了他未来行走的方向。后来,1971年,他考上了哈佛大学,听说这学校不错,怎么也得是个区重点吧。上学的同时,他还受聘于麻省理工学院的人工智能实验室,成为了一名职业黑客(黑客这个词没有贬义,欲知详情请牵着你的狐狸妹妹去找她的狗狗哥)。也不知道他哪来的那么多时间,可能也是把毛概和邓论都翘了吧。在人工智能实验室的期间,他可没少干活,开发了很多有用的软件,其中最著名的就是Emacs编辑器。Emacs是一个可与vi相抗衡的强大的编辑器,他们俩的操作方式完全不同,但却同样强大,各自用自己独有的方式,提高这人们的编辑效率。直到今天,让然总有人争论到底emacs好还是vi好,信奉emacs的人和信奉vi的人形成了两个帮派,这俩帮派经常在大街上用板砖菜刀拼个你死我活。不过还好我这里只有vi,否则工作间里不会消停了。哦,扯远了,咱还回来说Stallman。

  

   那时候的Stallman在人工智能实验室里工作的非常Happy,大家有BUG同挡,有代码共享。因为最初的计算机就像我们的算盘一样,只是一个硬件,没有软件的概念。后来随着电子管、晶体管的发明,计算机的电子成分才超越了机械成分,逐步演化成了现在的电子计算机,在这个过程中,出现了软件,并起到越来越重要的作用,最终成为了计算机的灵魂。而最初的计算机软件没有什么开源不开源的概念,因为那时候软件天生就是自由的!那时候卖计算机的同时会附带软件,包括软件的源代码和文档。用户可以根据自己的需要去进行修改软件,与别人分享软件,总之,软件是用户花钱买来的,用户想怎么玩就怎么玩。然而随着技术的发展,软件逐渐脱离硬件成为一个独立的产业,很多软件慢慢的只提供二进制代码而不提供源码了,这就意味着你不能修改它,并且多数还规定最终用户没有二次分发的权利。也就是说,这东西你买了,只能你用,你再给别人,不行!有这样一件事,Stallman他们实验室买的第一台打印机附带有驱动程序的源代码,他们那的黑客们可以随意修改这个驱动,根据自己的需要添加些小功能啊,改改bug啊,之类的,这为他们的工作带来了很大的方便。后来, 实验室又买了一台激光打印机,这次厂商只提供了二进制的打印机驱动程序,它是实验室里仅有的一个没有源代码的软件。出于工作的需要,Richard Stallman想修改一下这个驱动程序,但是不行啊,没源码啊。后来 Richard Stallman听说卡内基.梅隆大学有这个打印机的驱动程序源代码,他就去了那里,对他们说:“那啥,大家都是道上混的,谁还没个马高蹬短的时候?是兄弟的拉哥们一把,我也没啥事儿,就是我们那打印机老丢字,一遇到什么敏感的字眼就给打成口口,我估么着是驱动的问题,挺说你们这有着驱动的源码,能不能给我拷一份?”对方办事效率还是挺高的,很干脆的拒绝了他。因为他们和厂商签署了一份保密协议,协议要求他们不能向别人拷贝源代码。顿时Richard Stallman感到他们背叛了自由的计算机社团,他非常生气,但是他选择了沉默。这只是一件小事,只是一个时代的缩影。那个时代,正处软件向私有化转变的过程,越来越多的软件选择了不开放源代码,不允许二次分发的发布方式。甚至Stallman身边的同志们也都一个一个都跑到那些靠卖私有软件挣钱的公司去打工了。而Stallman依然沉默。

  

   不在沉默中爆发,就在沉默中灭亡。

(55)Stallman

  

   Stallman爆发了!

  

   他不能容忍软件世界里清新自由的空气被私有软件污染的乌烟瘴气;他不能容忍被剥夺按照自己的需求修改软件的权利和乐趣;他不能容忍自己买条皮带尺寸不够,他竟然连自己在上面多打个洞的权利都没有!

  

   于是,他爆发了。

   

   他要重现当年那人人为我,我为人人的合作互助的软件世界;他要把使用、复制、研究、修改、分发软件的权利还给每一个软件世界的人民;他要用自己的行动告诉人们,软件天生就该是自由的!他要开辟一个新的世界,哪怕是一个人在战斗!于是,一个宏伟的计划在他心中产生——GNU计划。它的目标是创建一套完全自由的操作系统,因为操作系统是电脑中最重要的最基础的软件,要创造自由的软件世界,自然先要有一套自由的操作系统,然后再以此系统为中心,开发各种各样自由的软件。Richard Stallman最早是在 net.unix-wizards新闻组上公布了GNU计划,那是1983年的事情。既然要做操作系统,首先得有个明确的规划和目标,目标是什么?这个操作系统要做成什么样子?这当然是要向最成功的操作系统学习,哪个?UNIX!GNU计划中的操作系统,将是一个类Unix的操作系统。这个系统要使用与Unix相同的接口标准,这样,就可以由不同的人,分期分批的创作操作系统的不同部分而不必担心相互之间协同工作的问题。

  

   为了实施GNU计划,1985年,Stallman又创建了自由软件基金会。基金会的主要工作就是执行GNU计划,开发更多的自由软件。1989年,Stallman与基金会的一群律师们起草了广为使用的《GNU通用公共协议证书》也就是GPL协议,以此协议来保证GNU计划中所有软件的自由性。到了1990年,GNU计划中的这个系统已经初具规模,有了很多的优秀的软件。其中有很多是世界各地的黑客们无偿提供的,也有部分是利用自由软件基金会的基金雇佣程序员来开发的,当然,Stallman自己也是身先士卒,开发了Emacs,Gcc,gdb等重要软件。当他看着这些丰富的自由软件的时候,感觉到那清新自由的空气,终于又回来了,以后,人们就可以拥有一个可以自由使用,自由修改,自由分发的,自由的操作系统!不过等一下,好像还差点什么,哦,还…………差个内核吧……

  

   作为一个系统,没有内核是不行的,这么重要的部件Stallman当然不会忘记,所以才会有Hurd内核。但是这个内核的表现一直不尽如人意,这让Stallman很焦急,外围的软件都好了,就差个内核啊,什么都有,就差内核!而转过年,1991年,大家应该知道发生了什么,Linus同学写出了Linux,这我们之前说过。Linux现在虽然被大家当作一个操作系统的名称,然而其实这并不准确。准确的说,Linux只是一个内核,Linus同学只是写了一个内核。

   什么都有,就差个内核!

   什么都没有,只是一个内核!

   还有什么需要多说的么?

   Linux顺理成章的代替Hurd成为了GNU计划中那个自由系统的内核。而这个系统,也被叫做GNU/Linux系统。Stallman理想中的自由世界,终于拉开了那沉重的幕布,展现出了自由的光彩。而Stallman并不满足,也确实没有满足的理由,这个自由的世界还需要成长,还需要更加丰富多彩,还需要有更多的人走进这个世界中来。于是Stallman奔走于世界各地,告诉人们有这么一个自由的世界,号召人们加入这个世界,鼓励人们为这个世界更加自由而付出自己的力量。他是一个执着的苦行僧,为了他的梦想,为了他的自由世界,他会一直走下去……

(56) 进程

   为了能够创作出更好的Rubbish系列程序,主人决定好好充电了。他下了个pdf版的书来看,好象是关于c语言编程的。看pdf这事儿,得找Evince来。Evince是个文档查看器,比人家Adobe官方的pdf阅读器小巧很多,用起来也很方便。而且每次主人看完一个文档,点关闭的时候,他都会很有心得记录下主人看到的页数,下次再打开同一个文档时,他就直接替主人翻到上次那页。这个很贴心的举动然主人很满意。这次也是,主人一点击那个文档,Evince就赶快去查自己的记录,一看,哦,这个文档看到了380页,"进程"这一章,赶快翻到。

  

   有人可能对进程这个名字还不是很明白,什么是进程呢?简单地说,进程就是正在干活的软件。比如Evince,躺在硬盘里睡觉的时候他就是一个软件,一堆数据,一陀代码。当他被叫醒,跑进内存里开始干活的时候,他就是一个进程了。(当然,其实这么说不很准确)换句话说,内存里忙忙碌碌的,都是一个个的进程。当然,同时他们都是程序,都是软件,这个不冲突。就像去公司上班的人,他们都是人(废话,见过大马哈鱼上班么),当他们在公司工作的时候,他们都是公司的员工。员工,就像进程一样。很多公司的员工每个人都有个工号,什么NB001,SB999之类的,每个进程也都有一个唯一的标识——进程ID号,简称PID。这个ID号是由我分配给每一个跑进工作间的进程的,分配的规则很简单,每人一个,每次加一。第一个跑进来的就是1号,上面介绍过,Init这家伙每次都是第一个被我叫起来,帮我打理一下日常工作,所以他的ID号总是1。而且,他还有个特殊身份,这个呢,咱暂时保密,待会再说。

  

   每个公司的员工都有个直属的上级,上级又有上级,以此类推。我们这里的进程也是这样,只不过我们不叫”上级“或者“上司”,我们叫——爹!好吧,似乎这个称谓土了点,但是意思就是这个意思。一个进程之所以成为一个进程,一定是由于另一个进程创建了他。(有点绕嘴吧)比如说主人来了一个终端,于是就有了一个bash进程,然后主人在这个终端里敲入firefox然后回车,bash就知道这是要他去叫狐狸妹妹来干活,于是bash就去找狐狸妹妹,把她带到内存里开始工作,于是就创建了一个firefox进程。好了,现在,firefox这个进程是由bash这个进程创建的,那么,bash这个进程就是firefox这个进程的父进程,firefox进程就是bash进程的子进程,也就是说,狐狸妹妹就得管bash叫爹!那bash也得有个“爹”吧?是的,如果是在Gnome环境下开的那个终端的话,那么bash它爹就是调用bash的gnome-terminal。那么如此循环往复,肯定有一个站在金字塔最高点的总"爹"吧?难道,难道笨兔兔你就是他们的总爹?很遗憾,我不是,所有进程的总爹,是每次启动第一个被我叫起来的Init,所有的进程都是被init直接或者间接创建的,Init才是所有进程的祖宗!

(57) 僵尸

   关于父进程,有两点要说明:

   第一,我们这的父子关系不是固定的,是会变换的。如果从bash启动firefox那bash就是firefox的爹,如果直接从图形界面启动那就没bash什么事情了。(这时候firefox的爹其实是init)

   第二,不要问我哪里有妈进程!

  

   当爹也有当爹的义务,人家不能白叫你一声爹是不是。 当自己的娃(也就是子进程啦)做完自己该做的工作以后,就停止了一切动作,像个死尸一样待在那里,当爹的就负责给他“收尸”-_-b 一个结束了所有工作的进程,会处于一种“僵尸”状态,这时候他什么也不做了,就等着被干掉。进程进入僵尸状态前一般会通知他爹一声,汇报一下说:爹啊,俺已经把该做的都做啦,现在我要变僵尸啦!(让后平举双手开始行走?那是生化危机!)然后他爹负责向我汇报:我家娃干完活了,你把他的工号(就是PID,记得吧)取消掉然后让他回去睡觉吧。然后我就把它的工号收回,然后看看他有没有什么申请了没释放的资源(一般一个好孩子在结束运行成为僵尸之前会主动释放掉自己申请的资源的。),确认都没问题了之后,他就被从我的进程列表中清除了。但是有时候也会有些特殊情况,比如有的时候娃还在兢兢业业的干活呢,结果他爹死了。(可能他爹干完活退出了,也可能被主人用命令kill了。)这个时候我就会发个信号给他家娃说:那个……娃呀,那啥,跟你说个事,你爹死了。这时候有的娃就悲痛欲绝:俺爹都死了俺活着还有啥意思啊,呜呜呜~~~俺也僵尸吧。然后就退出了。比如你在终端运行firefox,然后把终端关了,firefox也就退出了。也有的娃比较坚强,一定要完成上级交给的任务,化悲痛为力量,这时候我会给他找个新爹——因为每个进程总得有个父进程,没爹是不行的。一般我会安排他爹的爹来当他的爹(又绕进入了吧),也就是这个进程原来的"爷爷"进程来当他的父进程。然后这娃在长了一辈后,继续认真工作。比如你在终端运行nohup firefox,然后把终端关了,firefox继续运行。那如果他爷爷不幸也挂了呢?那就继续往上导吧,我们说了Init是所有进程的祖宗,所以他那里成了最终的“无依靠青年进程收容所”。

  

   还有的时候娃已经把该做的事情做完了,汇报给他爹并变成僵尸。可是他爹还没来得及给自己娃收尸,自己就挂掉了。这个时候,我没法通知那娃说她爹挂了,因为那娃已经是僵尸了,啥也不听啥也不干了。可我也不能直接把他干掉,啥事情都得按规矩来嘛,只有他爹向我申请我才能把他干掉,可是他爹又已经挂了……那怎么办呢?那就按流程来,先给这个娃找个爹,哪怕这娃已经是僵尸了,也得有个爹。比如我找到init说:那个ID号是2725的那个进程爹死了,你当他爹吧。一边说一边看也不看的用手往那边一指,假装自己没看到那娃已经成僵尸了。 一般Init也不会太注意,直接就答应了,然后马上发现了事情的真相,跑到我这里来说:那娃已经成了僵尸啦,你还叫我收养个啥?我肯定会一脸无辜装:啊?是啊,那不管怎样,你是他爹了,你负责处理一下后事吧。于是init只好以爹的身份处理那个僵尸的后事,问题就这样解决了。

(58) State

   别看说的这么麻烦,其实一个天真烂漫的娃进程从变成僵尸到被干掉只是一瞬间的事情,所以一般情况下主人是看不到一个僵尸进程的,要不然这一屋子僵尸还不得把主人吓出点毛病来。一般主人用ps命令查看到的进程,和办公室里的员工差不多,基本都处于两种——干活和睡觉。

   

   干活的状态,学名叫Running,也叫运行状态。这个应该很好理解,就是说明这个进程正在干活嘛。但是有个问题,还记得我说过CPU是有限的吧,一台电脑就那么几个CPU(对软件来说,多核CPU跟多个CPU差不多),可是要用CPU工作的软件有很多。那么这个处于进程的干活状态又可以分为两种:1.正在使用CPU干活。 2.排队等待使用CPU干活。当然,处在这两种状态的进程我都算他正在工作。这就好象你在公司要打印文件,结果打印机卡纸了。你在那等着人家修打印机的这段时间不能算旷工吧。我可不是啥变态的老板,所以,正在使用CPU干活的,和积极的排队等待使用CPU干活的进程,都算正在干活的进程。

  

   然后再说睡觉的状态。估计如果你上班的时候在办公室里睡觉,你们老板会很不高兴的。但是,在我这里,没问题!很多程序都会经常进入睡觉状态。这里说明一下,这个睡觉状态可不是说回硬盘睡觉啊,为了区别我们这样说吧,我们管完全执行完毕退出内存只存在于硬盘的程序叫“下班回家”的程序吧。只不过这个家就是硬盘上那块地儿,而回家后唯一的活动就是睡觉。好,现在我们要说的不是下班回家,而是在办公室睡觉——也就是在内存中的进程,进入睡觉状态,也叫sleep状态,休眠状态。那为什么一个进程在内存里不好好干活,要去睡觉呢?不是因为他昨晚上爬起来偷菜来着,也不是因为他熬夜看球,而是因为他要等待某个事情发生。比如皮筋老弟,每次他运行起来之后,主人看看有没有mm在线,没啥值得聊的就直接把皮筋最小化了。那么这个时候如果没有人给主人发消息的话,皮筋就没什么事情干,所以就没必要让他跟着排队等CPU了,等着了也没事情干嘛。所以这个时候皮筋就来向我汇报说:头儿啊,我歇会去啊,等网口那边有发给我的包了你再叫我。然后他就去睡觉去了,而我负责看着网口有没有发给他的包,如果有的话就叫醒他,那时候他就变回工作的状态,开始处理包的内容了。

   睡觉状态也分成两种,一种是叫的醒的,一种是叫不醒的。还说皮筋,他正在睡觉,等着网口的数据包,这时候主人发来命令,要把皮筋关了,这时候虽然皮筋等的包没来,我也得去叫醒他说:别等了,你下班回家睡觉吧。然后皮筋点点头,收拾好自己的东西,变成僵尸,他的父进程(通常是init)提出申请,我把它工号注销,然后他回硬盘睡觉。这种是正常情况,这样的睡觉状态就是能够叫醒的。也有的进程很执着,还比如皮筋,正在睡觉等包,这时候我发现网线断了。这网线都断了那肯定来不了包了吧,主人也明白这点,要把皮筋关了。这时候我过去说:“醒醒,别等了,下班回家睡觉去吧。”他不理我。我继续:“网线都端啦,等不来啦!”他还是不理我。我只好:“快醒醒,快醒醒,回家啦!”还是没动静。“快起来看上帝啦~”依然没反应。“靠,出绝招了……这是谁的钱包啊??!!”还是睡觉,看来是无论如何也叫不醒了,除非他等的那个包出现。这就是叫不醒的睡觉状态。一般一个好的程序是不应该处在这样的状态的。

  

   另外,进程还有个停止状态,一般都是调试的时候使用的。比如主任的Rubbish n号,跑进内存处于工作状态的时候,主人喊,停!Rubbish马上一动不动,处于停止状态,这样便于主人检查这家伙的各个部件是否正常。

(59) 毕加索

   “……本APT有超级牛力~~~~~”

   唉~这家伙又去招人了。 我问:“SCIM,刚才主人给超级牛力输入了什么?”

   “报告头儿,是Picasa”

   “星爷,查查这啥意思。”

   “这个吗……英法美德俄日意奥的语系里都没这个词。不过有一个长得比较像的。”

   “什么?”

   “Picasso ,毕加索。”

   “哦……看来这哥们是个画画的……”

   GIMP不服道:“画画?有我还不够么?”

   我只得双手平摊做无奈状:“Who knows......”

  

   数分钟后,超级牛力归来,带来了一个穿的花花绿绿,很有艺术气息的家伙。我过去上看下看左看右看,怎么就看着不像我们这的人呢?于是我叫来了file。file可不是一个普通的文件,而是一个程序,一个用于判断文件类型的程序。他可以根据文件的特征来判断一个文件是什么类型的文件,当然,也能判断可执行的程序。他可不是跟据扩展名来判断,叫.jpg的就是jpg文件,叫.txt的就是文档文件,这种功能,连Rubbish都会。(在我们这里,主人创作的Rubbish系列已经俨然成了傻子的代名词。)file的功能要强大的多,他是根据文件的内容来判断的。一般一个文件都会有个文件头,来说明这个文件的类型。比如JPEG类型的图片文件,他的文件开头的两个字节肯定是FFD8(16进制),而GIF文件的文件头就是4749463839,其实就是GIF89几个字的ASCII码。二进制程序也有类似的特征码,于是,我让file赶快去看看这个“毕加索”(就叫他毕加索吧,虽然还是差了几个字母)到底是个什么程序。file把毕加索上上下下的检查了一遍,得出结论——这是个Windows的EXE格式的程序。

  

   “什么?Windows的程序!?超级牛力啊,你别是走错了吧,怎么把windows的程序领来了?”超级牛力不急不慌的摇摇头:“本APT有超级牛力,怎么会搞错呢,这个就是从源里找来的软件包。不过别急,本APT有超级牛力,这软件包可不是光毕加索一个,后面还有一个呢。”我这时才注意到,老毕后面还站着一个家伙,这……这……这不就是红酒大师吗??越来越乱了。仔细看看,咦,跟我们这里那个红酒大师长得很像,但还有些差别。没事,超级牛力哪里肯定有这个软件的资料,让他查查吧。还没等我让他查呢,他已经向大家解释上了:“毕加索先生是Windows界成名的图片管理大师,他所在的公司,也就是狗狗哥那公司,他们公司为了惠及Linux世界的人们,又为了偷懒,把毕大师配上一个翻译就直接推向了Linux界。”哦,原来这样,后面那个是改装过的,专门负责给毕大师当翻译的红酒。为了区别,我们就叫他毕翻译吧。

(60) 对决

   毕大师和毕翻译安顿好之后,主人立刻把他们叫起来干活。俩人先后爬起来跑进内存,麻利的整理起主人的图片来——第一次启动嘛,得先对主人指定存放图片的那个目录扫描一下,做好整理和记录工作,这样才能心里有底,主人要看啥,立马能找着。经过了数秒之后,毕大师完成了对所有图片的扫描,主人觉得比原来负责管理照片的f-spot快了不少。这下,f-spot可不爽了。

   f-spot是最初跟随我来到这个机器上的,也算是元老了。一直以来都是他负责管理主人的照片,也没出现什么问题。现在主人找来这么个功能差不多的家伙,这不是明摆着要抢f-spot的饭碗么。要是以后让这个windows的程序代替了,我们linux程序的脸面还往哪搁?于是f-spot决定,为了荣誉,向毕加索挑战!只见f-spot跑到刚刚扫描完图片的毕大师面前说:“大师果然好功夫,不亏是师出名门。这数千张图片,竟然这么快就整理好了。在下实在佩服的紧,不过不知大师其他本事怎么样,有道是遇高人不可交臂失之,在下想在大师面前讨教几招,不知,大师可肯赐教否?”只见毕大师的表情如平静的湖水般并没有因f-spot的挑战而激起一丝波澜,只是面容祥和的扭过头对翻译说:“What did he say?” 靠……

  

   F-Spot VS Picasa 

   要比就从起床开始比!f-spot和毕加索以及毕翻译重新回到硬盘睡觉,然后我去叫来的time同志。time是一个用于计时的命令,这个咱以后再说,先看比赛。随着我的一声号令下,time开始计时。f-spot蹦起来后牙也不刷,脸也不洗(废话,一个软件,有牙么?),迅速的从硬盘飞奔进内存。再看那边,毕翻译先迅速跑进了内存,然后再扭头去叫醒毕大师——因为毕大师听不懂我们的话,所以无论我们怎么喊都是叫不醒他的,只能先叫醒翻译,再由翻译去叫醒他。这样一来,时间自然慢了不少,对于起床速度,F-Spot完美胜出。双方起床已毕,相向而立,只见F-spot掏出两张一模一样的照片,照片上是一个人像,似乎是晚上照的,眼睛如含着血泪般发出令人不寒而栗的红色。只见F-spot把一张照片扔给毕大师,另一张贴在自己这边,双掌运足力气,瞄准照片中人的双眼大喊一声:嗨!立时,照片上人的红眼不见,翻了白眼。另一边的毕大师微微一笑,拿起自己这边这张,单掌向前一推,一股掌风直逼那人双眼,只见掌风过后,那人双眼渐渐恢复成正常颜色。F-spot不等毕大师打完那掌,有拿起照片推拳运动,只见那本是夜里的照片亮如白昼。毕大师也不示弱,将照片抛向空中,双手一抖,一道劲风吹过,再看落下来的照片时,也已经比原来明亮不少。F-Spot又对照片连续发力,打出三招,依次改变了照片的对比度,色调和饱和度。毕大师口念咒语:“Easy……”只出一招,双手间出一道白气,就把照片的亮度,对比度,色调,饱和度,都改到合适的状态。毕翻译的在旁边解释道:“这招乃是毕大师的独门秘诀,叫做‘手气不错’!”毕大师微微点头,一扬手,只见那修改好的照片激射而出,直接从网口飞了出去,发布到了PicasaWeb网站上。屋内众人顿时为F-Spot捏一把汗,这PicasaWeb网站,明显是人家地盘啊,F-Spot能搞定么?哪知道F-Spot不慌不忙,也照片往网口一扔,把照片同时发布到了Flickr,PicasaWeb等多个网上相片储存空间里。这真是:棋逢对手,将遇良才,预知二人胜负如何,且听下回分解。

(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每天随身带着一张纸条,起床来到内存后看看上面的内容然后喊出来。(当然,写程序的时候也完全可以把这内容写进代码段,那就相当

抱歉!评论已关闭.