生活中,大多数人总希望事情的发展在自己可控制的范围内,喜欢规避风险和不确定性(呵呵,也许你是喜欢高风险高收益那类)。求解一个问题时,总想有个唯一确定的答案;向mm表白时,也总希望有个确定的回复。模棱两可的东西让我们不踏实,然而现实中影响事物发展的因素总是多元的,关键是其中的一些因素是随机的、偶然的。哦,。。。,偶然性和必然性还是给哲学家去思考吧。
昨晚无聊的时候,把朋友一直推荐的《(500) Days of Summer》给看了,记住了一句话”忘记女人最好的办法就是把她变成文学“,想起了一个问题爱情到底是命中注定,还是只是巧遇后的化学反应?产生了一个推论,与summer分手后却巧遇autumn。也许还要再遇到一个winter和spring,才能找到属于主角的summer。也许是一个无限循环,一直颠沛流离下去。得出来一个结论,有巧遇有选择还是好的。
##############################闲扯的分界线###################################
XX大牛曾说过:”修复一个bug的时间取决于这个bug的重现时间“。但不幸的是由于操作系统的调度、I/O中断、信号等,多线程程序的执行通常是不确定性的,同一bug的重现就变成一件不确定的事情的。烦恼便由此产生了。怎么解决这个问题呢?
当我们遇到问题时,我们可以看看传统行业。拿电影业说吧,编剧编写剧本设定角色,导演找演员、摄影师等进行拍摄,然后不论那里的影院都可以放映效果一致的电影。现在你是不是也想出了解决方案呢?程序员编写程序设定每个线程执行的任务,记录(record)每个线程在CPU上的执行(类似电影拍摄),然后就可以回放(replay)这次执行来调试程序了(在不同影院上映)。呵呵,思想是不是很简单。但是要记录什么信息呢?
在单核上。首先,每次不同的输入,程序的执行路径可能不同。因此我们需要记录每次输入(包括从键盘、网络、硬盘等输入信息)的信息,这样回放的时候就能利用这些信息。其次,系统调用执行可能会引入不确定性,例如获取当前时间的系统调用,每次执行都返回不同值。因此需要记录系统调用的返回数据。在回放时不调用系统调用,直接返回记录的信息。最后,记录操作系统的调度和信号等信息,保证回放时这些事件被按序执行。目前linux上实现以上功能的一个库,http://home.gna.org/jockey。感兴趣的可以去看看。
在多核上除了记录单核上需要记录的信息外,还需额外的操作。因为在单核上,多个线程是交错执行的,一次只有一个线程对共享内存的读写。而在多核上,由于多个线程可以同时在不同核上执行,因此共享变量的访问序列跟复杂。要保证确定性,需要详细记录对共享变量的访问序列。同样还有对锁的获取也需要记录。要完全实现这些的操作通常意味着很大的开销。如何减少开销呢?学术界和工业界正在解决这个问题,期待你有更好的想法。