千年虫与2038年问题

  1999年12月31日的夜晚,人类即将迎接第二个千禧之年的到来,大家喜气洋洋地等待新年钟声的敲响。然而有那么一批人此时此刻却紧张不已,因为过了十二点钟,世界各地的政府和金融系统可能会在一瞬间崩溃。

  上世纪六十年代,计算机存储器的成本很高,如果用四位数字表示年份,就要多占用存储器空间,就会使成本增加,因此为了节省存储空间,计算机系统的编程人员采用两位数字表示年份。随着计算机技术的迅猛发展,虽然后来存储器的价格降低了, 但在计算机系统中使用两位数字来表示年份的做法却由于思维上的惯性势力而被沿袭下来, 年复一年。直到新世界即将来临之际,大家突然意识到,用两位数字表示年份将无法正确辨识公元2000年及其以后的年份。这将导致世界各地所有的计算机系统会把2000年认为是1900年,也就是说,计算机不能把2000年识别为闰年,即在该计算机系统的日历中没有2000年2月29日这一天,而是直接由2000年2月28日过渡到了2000年3月1 日;另外,在一些比较老的计算机系统中,在程序中使用了数字串99(或99/99等)来表示文件结束、永久性过期、删除等一些特殊意义的自动操作,这样当1999年9月9日(或1999年4 月9日即1999年的第99天)来临时,计算机系统在处理到内容中有日期的文件时,就会遇到99或99/99等数字串,从而将文件误认为已经过期或者将文件删除等错误操作,引发系统混乱甚至崩溃等故障。人们把这个历史遗留下来的日期处理错误导致的危机成为“千年虫”。

  1997年,信息界开始拉起了“千年虫”警钟,并很快引起了全球关注。世界各国纷纷由政府出面,全力围歼“千年虫”。

  首个被“千年虫”侵袭的国家是西非国家冈比亚,除不少地方电力供应中断外,预计未来数月,海空交通、金融和政府服务亦大受影响,其中财政部、税局和海关更因而无法运作。总部设在华盛顿的国际千年虫合作中心表示,冈比亚出现千年虫祸,其实是意料中事,皆因国际社会太迟帮助冈比亚除虫。

  在中国,北京市计算机2000年问题办公室从1日至3日已经接到十几个求助电话,反映自己的电脑出现了千年虫问题。一位魏小姐的炒股机不能工作了;王先生的某国内知名品牌的电子记事本里几百个电话号码一夜之间不见了……紧接着香港也传来报道:著名的7-Eleven便利连锁店星期一遭到类似千年虫的计算机漏洞的袭击。这个连锁店的计算机把2001年当成1901年,使许多使用信用卡的用户感到不便。便利店一发言人说,星期二晚上他们已经控制了事态,星期三,商店已经开始正常营业。1999年,它对千年虫作了充分的准备,总共投入了880万美元对付千年虫。对于这次出现的同样是由计算机计时系统引起的问题,连锁店发言人说;“这的确是一个非常特殊的事件。我们已经对计算机系统做了近万次测试,工作一直正常,直到星期一。”

  而另一个计算机时间处理机制遗留下来的问题如果没有修正,将会在2038年出现,被称为“2038年问题”。问题的根源在于32位的Unix操作系统和Linux操作系统的时间溢出。

  C语言中用 time_t 来代表时间和日期,time_t 是整数(int)型的,它用来记载从1970年1月1日到2000年所经历的秒数。这个数据是以32位存储的,第一位是符号位,其余的31位用来存数字,而这31位数字可以存储的最大数字为2147483647。从1970年开始计算,这31位的数字可以表示的秒数最多可以用到2038年01月19日03时14分07秒,当时间到达这个数字的时候系统将会出现问题,到时候数字不会自动增加,而是会为-2147483648,而这串数字代表的时间是1901年12月13日20时45分52秒,这会导致很多的程序出现问题,甚至崩溃。

  2038年问题不仅比千年虫更隐蔽,而且比之前千年虫问题更具有破坏力,因为千年虫问题只会导致应用层的程序出现问题,比如信用卡支付系统,或者管理系统。而2038这个bug,将会影响系统最底层的时间控制的功能。要解决这个问题,最简单的方式是扩展Unix时间的长度,用64位数字来表示它。64位二进制数的实际可用位数是63位,最大表示到公历的UTC时间292,277,026,596年12月4日15时30分08秒. 如果那个时候人类文明还存在的话,公元纪年很可能已经因为太难用而被抛弃了. 理想的情况是到2038年,64位系统已经成为主流,从而避免特意去修正这个问题所需要的大量开销。否则,人们就必须把新的64位时间拆分成两部分并分别保存在两个变量里,这是一个麻烦而且效率低下的选择。
 
参考自百度百科

猜你喜欢

转载自blog.csdn.net/qq_45753394/article/details/120582243