软件2038问题

  • 5
  • 3,465 views
  • A+
所属分类:[开发技巧]

2038年一月19号,星期二,凌晨3点14分7秒钟的时候,如果Linux程序员会做恶梦的话,那么梦的内容一定是关于这个日期的,在这一秒钟滑过后,凡是安装着linux的计算机都会死机或者陷入死循环,这会给很多的数据库带来极大的麻烦。这个可不是那些反对linux的人胡编乱造得东东,而是linux自身的千年虫问题。

如果你想知道什么是2038问题的话,你需要知道一些技术上的东西。这个bug是由用来写linux的c语言引起的,c中用time_t来代表时间和日期,time_t是整数(int)型的,它用来记载从1970年1月1日到目前所经历的秒数。

这个数据是以32位存储的,第一位是符号位,其余的31位用来存数字,而这31位数字可以存储的最大数字为2147483647

从1970年开始计算,这31位的数字可以表示的秒数最多可以用到2038年,当时间到达这个数字的时候系统将会出现问题,到时候数字不会自动增加,而是会变为-2147483647,而这串数字代表的时间是1901年12月13号,这会导致很多的程序出现问题,甚至崩溃。

这个可比千年虫问题更具有破坏力,因为千年虫问题只会导致应用层的程序出现问题,比如信用卡支付系统,或者管理系统。而2038这个bug,将会影响系统最底层的时间控制的功能.

Raju Mathur,GNU 和 Linux的顾问兼Linux Delhi Users Group的斑竹,说:“我认为到时候首当其冲的将会是嵌入式领域,因为这个领域内的软件更新不是很频繁。流程控制系统,手机,游戏平台,电话的交换机等等这类的设备将会是最大的受害者。”

但是他后来补充道,以现在技术革新的速度,到时候估计不会有人还会使用32位的系统。

但是目前呢?很多运行在Linux上的程序可以计算到30年后的日期,对于抵押以及保险行业来说,可能在D-Day之前就会有问题出现。

Charles Assissi,Chip杂志的编辑说:“这个问题目前还不会让很多人惊慌,除了那些脾气不好的人”。

问题应该怎么分类解决呢?较新的Linux程序可以64位的或者更长的数据来表示时间,从而解决这个问题。对于现有的系统,可能c现在记录时间的方式将会被修改,然后所有的程序重新编译。作远远的要比说难得多。

Mathur 说:“如果没有上10亿行的代码在使用这个值的话,至少也有上百万行,找到它们,修改他们,升级嵌入式的系统,然后再重新部署,我认为是一项不可能的任务。”这会不会是另一个对于印度的开发团队来说很好的机会呢?

    

   在谈论2038问题时,我们要知道,并不是wonderware软件会有2038问题,基本上所有的软件(跟时间有关),从大规模的ERP、MES到自动化组态软件、办公软件、聊天软件,从大型工作站到我们用的手机通讯都可能会出现2038问题,所以我们不要太惊慌,但也不能回避。

  资料中显示Y2038 bug将于2038年1月19日(星期二)03:14:07am(GMT)正式爆发,届时人们对千年虫问题的预言可能将一一实现,比如手机网络工作不正常,卫星脱离轨道,型号较老的电脑软件软硬件无法正常工作等。

  什么是Y2038 bug

  Time_t是C/C++等编程语言在内部代表/存储日期和时间的一种数据类型。Time_t实际上是一个代表秒数的整数,当它的值为0时,代表的时间是1970年1月1日12:00:00;当Time_t=60时,则表示1970年1月1日12:01:00,依此类推。

  所有32位电脑系统都用带符号32位整型来存储time_t的值,也就是说t_time只能用31位二进制数来表示(第一位用来表示正负号),而其最大值转换为十进制是2147483647,换算成日期和时间刚好是2038年1月19日03:14:07am(GMT),而这一秒过后,t_time的值将变成-2147483647,代表的是1901年12月13日8:45:52pm,这样32位软硬件系统的日期时间显示就都乱套了。另外,无法接受time_t为负值的其他功能也将返回错误。

  举个实际的例子来说,登陆上Yahoo messenger,给好友发个消息,恩没问题,现在把系统时间更改为2038年1月19日03:14:07am,此时如果再发消息Yahoo messenger就将崩溃。

  为何担忧?

  也许有人觉得2038年还早着,无需担心这个问题。不幸的是,上世纪60年代的程序开发人员也抱有类似的错误想法,并由此导致了Y2K问题,给全球IT页带来数十亿美元的损失。

  要知道时间对于许多电脑程序来说都非常重要,操作系统、数据库程序、电子表格软件、实时控制系统等无不涉及到时间。因此我们必须在Y2038 bug爆发前做好充足的准备。

  尽管到2038年,桌面PC和服务器基本上都将升级到64位甚至128位,但仍会有许多使用中的32位甚至更古老的系统。即使是在32位系统盛行的今天,大多数嵌入式系统仍是8位或16位的,而小型嵌入式系统的数量其实比台式机更多。

  如何应对?

  Y2038问题和Y2K一样难缠,其中一种解决办法就是用位数更多的数据类型来存储日期和时间。如果使用64位数据类型,time_t最大可以表示公元292000000000年,是宇宙估计年龄的20倍,最起码看到这篇文章的各位都不会再遇到什么YXXXX问题了。

  目前对于Y2038 bug的影响有多大还存在争论,但有一点可以肯定的是:有备无患。相信我们能像克服Y2K问题那样圆满解决Y2038问题。
 
    有人把2038问题称作“千年虫二世”,这个比喻非常恰当。 
 

    用32位元来记录时间,正值表示为1970以後,负值则表示1970年以前。我们可以很简单地计算出其时间领域:  

2^31/86400(s) = 24855.13481(天) ~ 68.0958(年)  

1970+68.0958 = 2038.0958  
1970-68.0958 = 1901.9042  

时间领域为[1901.9042,2038.0958]。  

准确的时间为2038年一月十八日星期一晚上十点十四分七秒。那一刻,时间将会转为负数,变成1901年十二月十三日黑色星期五下午三点四十五分五十二秒。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
广告也精彩
avatar
广告也精彩

发表评论取消回复

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:5   其中:访客  5   博主  0

    • avatar 洫之舞 2

      软件2083是什么东东啊!我也看不懂呢! :roll:

      • avatar 敏敏知音 0

        过来看望朋友!祝国庆节快乐!

        • avatar 海棠果 3

          看不懂的伤不起啊