不确定性引发的烦恼

生活中,大多数人总希望事情的发展在自己可控制的范围内,喜欢规避风险和不确定性(呵呵,也许你是喜欢高风险高收益那类)。求解一个问题时,总想有个唯一确定的答案;向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。感兴趣的可以去看看。

 

在多核上除了记录单核上需要记录的信息外,还需额外的操作。因为在单核上,多个线程是交错执行的,一次只有一个线程对共享内存的读写。而在多核上,由于多个线程可以同时在不同核上执行,因此共享变量的访问序列跟复杂。要保证确定性,需要详细记录对共享变量的访问序列。同样还有对锁的获取也需要记录。要完全实现这些的操作通常意味着很大的开销。如何减少开销呢?学术界和工业界正在解决这个问题,期待你有更好的想法。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值