2010年9月26日星期日

十八个“盗梦图腾”助你摆脱运维“梦魇”

十八个“盗梦图腾”助你摆脱运维“梦魇”


利用中秋小假,我观看了最近备受热议的电影《盗梦空间》。影片中的盗梦团队筑造的梦中梦体现了复杂逻辑的魅力。该电影所引发的热议甚至比起电影本身更精彩。虽然现实中人不需要防御“盗梦者”,但是计算机系统却是随处可遇“盗梦者”,那么作为系统管理员究竟该如何抵御这些“盗梦者”呢?

首先允许我先介绍下《盗梦空间》这部电影的主要内容:《盗梦空间》是由《黑暗骑士》导演克里斯托夫·诺兰执导,莱昂纳多主演的一部具有很强逻辑思维和数学理论为基垫的电影。主要讲男主角科布(莱昂纳多饰)领导的盗梦团队筑造了一个梦中梦(共有4层梦境),目的是将一个思想注入能源大亨继承人费舍尔(希里安·墨菲饰演)的头脑中,让其放弃继承庞大的遗产。

有资深影迷评论称,影片中的多重梦境实际上是利用程序算法中的递归思维。假设做梦是一个函数Dream(),那么梦中梦就是该函数的递归调用。比起一般的递归调用来,该程序的特殊之处是,它是一个多线程的递归调用,也即是说每一次递归都会新建一个线程来执行函数体。因此该递归函数有两种结束机制,一种是wait超时(药物失效),另一种是由其调用函数来结束(kick)。这就好比影片中,当需要进入下一层梦境,就必须注入药物,当需要返回上一层梦境,就必须以自杀形式结束。

而由于硬件平台所限,该递归只能进行四层,因为每次递归都需要消耗系统资源,所以递归深一层,系统运行就越慢(梦境每深一层,时间就变慢20倍)。一旦在第四层的时候资源耗尽(做梦者生命耗尽),就会产生栈溢出,因此线程就会进入僵死状态(limbo状态)。而一旦将运行超时时间设置得过长(强力镇静药物),则会导致子线程运行过长从而耗尽资源。此时如果子线程还没有被上层调用函数强制结束(撞击),则会被detach(在梦中死去),因此进入僵死状态(进入limbo状态)。而为什么多层次的梦唤醒需要同步撞击呢,这就跟我们析构一个含有指针的STL容器一样,如果不遵守顺序,那么就会出现容器被析构而指针内容还在从而发生内存泄露的问题。

总的来说整个电影的梦中梦的营造就是利用多重递归的三个操作:入栈(pushing),弹出(popping)、堆栈(stacks)。其中“入栈”就是暂停手头工作、标记停止地点、开始另一项工作,新工作比原工作要“低一个层次”。“弹出”就是结束低层次的工作、在上一层次暂停的地方恢复原工作。“堆栈”用来记录暂停地点的环境信息。例如接电话过程中有新电话进来,于是暂停第一个电话开始接第二个电话,不一会又暂停第二个电话来接第三个电话……堆栈可以记录你结束当前电话后该回到第几个电话、该电话是谁打来的、暂停时你们谈到哪儿了。人们很容易在多重嵌套中迷失,这时候堆栈的作用就很重要。只要堆栈记录准确,我们就不会搞混各种层次。

显然,《盗梦空间》中多重嵌套的梦就是“递归”,入梦机器负责“推入”,穿越操作用来“弹出”,每层梦中留守的人就是“堆栈”,负责维持现场环境以确保成功穿越。

作为一个盗梦团队,盗梦的目的其实跟计算机安全中的缓冲区溢出攻击是同理的,也就是利用程序漏洞(人的性格弱点),向其地址空间对应于人的头脑)植入可执行代码(想法),从而可以在对方的系统(大脑)中执行自己的特权指令(解散Fisher的公司)。

盗梦巧妙的应用了程序设计思想,同时也证明了再完善的系统也是存在漏洞的的,只有全面了解你的系统才能做好充足的安全防御工作,而系统监控就是安全防御的第一步,接下来就向大家介绍10款优秀的监控工具、以及常用内存监控和系统性能监控工具……


没有评论: