Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2519867
  • 博文数量: 323
  • 博客积分: 10211
  • 博客等级: 上将
  • 技术积分: 4934
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-27 14:56
文章分类

全部博文(323)

文章存档

2012年(5)

2011年(3)

2010年(6)

2009年(140)

2008年(169)

分类: IT业界

2009-02-12 21:03:12

  看到这个标题,不同的人会有不同的反应。一类是嘲笑,“无稽之谈!”这种人可以称之为无知;一类是怀疑,“真的有这种可能吗?”这种人可以称之为好奇;还有一类人是微笑,“不是什么问题!”这种人可以称之为乐观。
     如果您是的一类人,对不起,您可以不用往下看了。这里的东西,你就全当做真的是“胡言乱语”好了。不敢浪费您的时间;如果您是第二类人,你可以继续看看,不必对本文过于严肃。如果您是第三类人,我倒是真的很想和您聊聊。因为显然您知道有这么一种事实,只是相对而言,你是有着充分理由和信心的乐观派。而我本人处于性格,属于谨慎的保守派。很想了解一下你乐观和自信的理由。其他没有列出的朋友,不论您怎么看待这个问题,希望您保留意见。
     首先,请各位朋友,找条件做如下一个简单的实验。
     很简单,找一台运行有类unix系列的计算机,如各类linux,BSD。然后确保这台计算机使用的是32位字长的处理器。通常而言,你我现在用的X86计算机,就是这种。然后关机,进入BIOS设置。将您的系统硬件时间设置为2050年。至少,到这一步您可以肯定的做到。现在可以得到第一个结论:硬件的时钟可以表达超过2038年的正确时间。接下来,启动您的计算机,进入类unix系统。然后,敲入date,查询当前时间。或者,您可以用您其他喜欢的方式查询时间。现在可以得到第二个结论:你的系统时间现在是错误的!如果我没有记错的话,我的linux显示是1917年。具体的也许有差异,但可以肯定,您会发现你的系统无法表达超过2038年的时间。
    好了,问题来了。2038年会有unix时间虫问题吗?
    现在,就以我这个尚且菜鸟的家伙,给您点合理的解释。当然,您有编程经历和点点内核知识,一定已经知道我要说什么了。首先,明确一下unix系统对于时间的表达方式。unix系统1970年代设计的时候,是贝尔实验室几个大拿们为了更好的玩一个星际旅行的游戏,而编写的。目的是更好的在当时那种没有只有批处理的计算机上玩的一种辅助管理硬件的系统。结果,由于实在成功,不断发展,一直到今天。也就是如此,我们有理由猜想,这个系统是没有规划过长期的大规模应用的。至少设计之初一定是这样。(我无比敬仰的前辈,请原谅我对您的臆测)计算机总是要表达时间的,并且考虑到不同的机器相互信息交换,彼此的时间至少可以相互同步,相互识别。要知道,时间的表达方式有很多种。怎样才能统一表达时间呢?而不依赖于不同使用者习惯的地方时间?unix的方法就是不论系统对于使用者交互的时间是如何,总将其转化为格林尼治时间1970年1月1日0:00开始到现在的秒数。这个秒的计数值,使用 time_t 这个类型定义。如果您查查库手册,或者搜索一下内核代码。最终您会跟踪到,在32位字长的处理器上,time_t 定义为一个 long int 型整数。而恰恰由于处理器的字长是32位的。那么这个 time_t 所能表达的时间长度就可以知道大约为68年。(2的32次方除以2那么多秒,别忘了这是个整型数,2的32次方用了一半来表达负数)。因此,你的计算机如果过了2038年,虽然硬件时间是正确的,但是基于这样一个缺乏长远考虑的软件设计,你的系统将会认为你的系统现在已经是1970年1月1日0:00以前了。因为这个数据类型已经溢出。超过了它所能表达的正确的时间。
    目前,可以肯定,只要您用的是unix系列的系统,并且用着GNU的C库。你就一定有这个问题。
    这其实是公开的秘密,注释写在代码里,工作原理写在教课书中。只是我没看到国内有人讨论这个问题,至少我在论坛上发的帖子,也没有回应,给沉了。老外倒是有人讨论,看各个内核的代码,大都有这样的注释,说明 2038 年计时的问题。
 不过,总的来讲,好像老外都比较乐观,都认为不用考虑去 hack 一下。主流的观点是到了 2038 年前后,所有能用的系统已经全部跑在 64 位处理器上了。这个问题会自然解决。而我个人则不乐观。我总觉的,到时候嵌入式领域,可能还有个别盲目乐观,或者对这个问题无知的开发者,还在 32 位处理器上跑 unix/linux ,到时候可能所有的电器设备都联网,交互数据的。搞不好,哪个设备就要出问题。
    因为unix的设计真的是完美了,至少我相信它还可以继续生存一直到2038年以后。
   也许,我是个谨慎的保守主义者。
   反正,目前,国内外,没有哪个人,哪个项目组提出 hack 这个问题。不知道为什么大家都是这么乐观?想想过去,设计PC电脑的时候,人们也是一样的乐观,人为根本没有必要考虑 30 年后的问题。结果 2000 年的千年虫问题,让全世界忙了好一阵子。虽然没见哪里真正出问题。但是未雨绸缪,总比到时候恐慌忙乱的好。总不能又象2000年一样,全世界都忙着检查计算机吧?也许到时候,只是个别倒霉蛋的闹钟显示错误,个别人的电子身份证显示错误的年龄,又或者哪个人的自动烹饪微波炉,定时器故障加热过头,毁掉自己一顿早餐。也许,什么都很平静而又乐观的过去了。
   我是一个开发人员,希望您也是。并且希望您也是谨慎的保守主义者。因为,任何想当然的等待问题自己解决的态度,都是可怕的。如果,你寄希望于到2038年前后,技术的发展会淘汰32位处理器,人们全部使用64位,这样来自然而然的解决问题。那我觉得,您是一个可耻的,缺乏严谨,没有责任感的技术人员。尽管我不否认,硬件的发展,有这种干干净净淘汰32位处理器的可能性,尽管我觉得几率不大。因为这是一个态度问题,一个职业道德的问题。
   至少,你我考虑设计的时候,假如你的硬件放出去,有可能连续运行到 2038 年以后,就要考虑 这个问题。基本上,职业守则也要我们对自己的设计负责。最起码的底线要保证:不求完美,至少无错。
阅读(2204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~