多任务

最近在做WebCast的PPT, 总在想怎样才能用最简单的方法把一件事情解释到最透彻. 结果冥思多任务的时候发现我们一直说自己(IT)是High Technology的行业, 其实除了在金属板上画的图画更精细一点儿以外, 比古人高级的货色并不多.

比如多任务:

DOS时代: 其实用的是老子的方法”无为而治”. 其实就是不管, 也有些现代的说法叫”放羊”… 这绝对是最自由的实现方法了, 你可以随便怎么(胡)搞. 怀念那个遍地TSR的年代吧. 后来因为碰到个比较实在的老外, 他说”DOS不支持多任务”.

想象一群小朋友吃一个棒棒糖(我们今天不讨论卫生和疾病……)阿姨把糖扔到人堆里然后大喊”糖来了, 抢啊~~”. (如果你想象不出, 请换成小羊和一群狼)

Windows 3.x时代: 协作式多任务. 这个是儒家学派的标准做法. 因为这个是江湖大派, 按今天的话说, 这个组织制定了无数的工业标准; 所以当大家呼唤多任务的时候, 就按照他们的标准进行了实现.

这个标准的基本依据是”程序之初, 性本善”. < <论语>>里面记载了怎样实现多任务的论述:

颜渊问仁。子曰:“克己复礼为仁。一日克己复礼,天下归仁焉。为仁由己,而由人乎哉?”颜渊曰:“请问其目。”子曰:“非礼勿视,非礼勿听,非礼勿言,非礼勿动。”

颜渊(就是颜回, 大牛啊!)问孔子(Robin Kong?)怎样实现多任务, 孔子说:”约束自己的一切行为,使之符合或不超越规范. 一旦程序都能达到以上标准, 多任务就可以实现了.” (这里的规范其实就是要求程序(进程)得到CPU使用权并使用之后, 将使用权交还给操作系统.) 孔子还说:”多任务是靠程序们自己实现的, 不需要专用的部分(在操作系统里)来控制CPU的使用权. 颜回又问:”那对程序们还有其他要求吗?” 孔子说:”不是自己的内存, 不要Read/Query/Run/Write.”

参考以上理论, 协作式多任务被实现了. 它其实已经足够先进, 并且完美解决了用户对多任务环境的需求. 可是问题是它的理论基础是”性本善”, 它的很多要求都是需要应用程序实现/遵守的. 而在接下来的日子里, 有那么一些程序, 坚定不移地向世界证明, “性本善”地那句话是不对地.

还是棒棒糖和小朋友, 这次阿姨说”排成一个圈, 拿到棒棒糖的小朋友舔一下然后传给下一个小朋友.” 问题是个别小朋友拿到了棒棒糖后就坐下狂舔, 干到只剩棒棒了都不肯给别人…… (3.x里面进程其实是把控制还给操作系统的)

Win9x后: 抢占式多任务. 3.x时代的一小撮程序, 让人感叹”程序心不古啊”. 于是韩非出现了. 他是在人们问为什么总有些程序不听话, 占着CPU就不还的时候出现的; 他说”不听话的小兔崽子就是欠揍!” (韩非认为有人犯罪是因为刑罚不够严厉)

又是棒棒糖和小朋友, 这次阿姨说”排成一个圈, 拿到棒棒糖的小朋友舔一下, 最多舔5秒. 然后传给下一个小朋友.” 然后如果有人舔了5秒还不还, 阿姨就毫不留情地把棒棒糖抢下来, 给下一位小朋友.

这还不止, 韩非还说:”谁不听话就干掉谁!” 于是那些以访问NULL指针(还有别人家内存)为首的家伙们就看到了一个对话框:”该程序执行了非法操作, 将被关闭.” 作为用户这个上帝一般的存在, 你会有两个选择:斩立决, 和开堂审理. 而即使你开了堂(用debugger) 狂审了一把, 不管是什么罪, 最后给出判决的时候还是只有一个选项:斩立决.