您的位置 首页 > 传统文化

程序员为你揭秘,什么是“千年虫”事件,“2038年问题”又是什么

#21日图形卡挑战#

快要进入2000年的时候,电脑出了问题。就是著名的千年虫事件。

“千年虫”并不是现实生活中我们所见到的虫子,而是计算机系统由于时间紊乱产生的bug。

1999年到2000年,计算机由于bug无法识别这个时间变化,从而导致系统崩溃。

至于“千年虫”为什么会出现,这还得从计算机诞生时讲起。

时间回到1960年,当时计算机的存储设备非常昂贵,让很多大公司都无法承受。

5MB的磁盘,一年就要35000美元租金,并且只能租不能买。

所以程序员在写代码的时候,只能尽量精简每一个字符。

被誉为软件之母的格莱斯·霍普(美国计算机科学家),提出可以通过六位数表达时间来节约存储设备空间。

比如:1960年8月11日,可以简写成600811。

霍普女士发明的这种写法,确实节省存储空间,很快就被人们接受并推广。

但是这种写法有个天生缺陷,那就是年份前两位数会被默认缩写掉。

当时被缩写掉的是19XX年中19,如果时间来到2000年,程序就无法准确表达时间。

比如:2000年1月1日,简写成六位数是000101。

计算机就会怀疑人生,怎么时间倒流了呢?

然后就会导致计算机系统发生紊乱。

比如:程序预先在1999年设定好,一年后自动删除某个文件。

到了2000年,对于程序来说却是回到了1900年,这时文件到底是删除还是不删除?

类似这样的问题所引发的计算机故障,就是“千年虫”的问题。

当人们广泛使用六位数表达日期后,当时有个计算机科学家敏锐察觉到,到了2000年可能会出大事,他就是鲍勃·贝默。

他奔走于企业、大学、政府、机构之间,呼吁大家防范“千年虫”。

但鲍勃·贝默的呼声未能引起人们的注意,相反大家还觉得他杞人忧天。

当时人们都认为,这个程序不可能用到2000年。

因为以后存储设备的成本会降低,等到存储空间充足时,自然就不会再用六位数写法了。

于是,谁都没有更改这个写法。

这个问题一直被拖到1990年,计算机行业才重视起来,开始在新推出的程序中采用八位数写法。

但是由于之前的拖延,麻烦很快就来了。

因为还有很多计算机在运行着老程序,特别是那些需要考虑到耐用性和稳定性的行业。

比如:交通系统、医药业、税务系统、电力系统、电信业、保险业、金融业等,这些行业的计算机都还在使用六位数表达时间的老程序。

也就意味着,“千年虫”一旦发作,会给人们生活带来非常不便的影响。

人们为了避免“千年虫”发作,开始了计算机史上最大规模的bug修复行动。

程序员们加班加点,对程序中的代码进行重写。

但程序员们很快就发现一个问题:由于使用六位数表达时间的程序太多,如果全部都要进行重写的话,根本无法在2000年到来之前完成!

所以他们做出一个机智的选择,那就是只对那些关键行业的计算机程序进行重写,至于其他计算机中的老程序,则采用方便快捷的Windowing修复法。

简单来说,Windowing修复法就是通过更改时间窗口,只计算1920-2020之间的年份。

因为已经把1900年排除在外,00这两个数字只能代表2000年,所以计算机在时间的表达上就不会存在歧义。

这个方法不需要把六位数时间代码更改为八位数,因此能大大加快bug修复进度。

在随后的时间里,程序员们利用Windowing,修复了世界上80%的计算机,基本完成除虫行动。

当2000年的钟声敲响后,除了一些个人计算机崩溃以外,总体上还是相安无事的。

但是,还有其他与“千年虫”类似的程序bug,并未因此放过人类。

它们一直潜伏在计算机当中,寻找合适的机会发作。

上面提到修复“千年虫”的方法,只是简单把程序的时间计算区间调整为1920-2020年。

因为人们觉得到了2020年,大家应该都换新电脑了。

大家也许会说这个想法似曾相识,没错,这是人们又在自以为是地拖延问题。

因为到了2038年,有可能再次发生类似“千年虫”的事件,这就是“2038年问题”。

大家在平时或许有听说过,计算机的操作系统有32位和64位之分。

现在大多数计算机采用Unix时间戳的计时方法,简单来说就是:以1970年1月1日0时0分0秒为起点,然后通过计算秒数来算出当前时间。

比如:2021年5月7日15:00:00,换算一下就是1620370800秒。

由于32位操作系统所能计算的秒数有限,到2038年1月19日3:14:07,就会达到极限。

当操作系统所计算的秒数超过上限后,会自动把日期跳回到1901年,然后各种程序因为时间错乱而导致崩溃,跟之前的“千年虫”发作时类似。

理论上到了2038年,人们应该淘汰掉了32位操作系统,转而使用没有“2038年问题”的64位操作系统。

但是从前面的“千年虫”事件来看,没准还有变数,说不定最终还得程序员想办法去解决。

所以说,请大家对身边的程序员好一点,因为他们不仅要跟发际线、甲方斗争,还要为了拯救世界跟时间代码战斗。

好了,本期就到这里了,欢迎大家在评论区留下自己的看法。

我是月林科普,关注我,每天分享好玩有趣的科普知识。

关于作者: luda

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐