找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 169984|回复: 0

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

[复制链接]

该用户从未签到

发表于 2021-5-23 02:37:40 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在即将进入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位操作系统。
但是从前面的“千年虫”事件来看,没准还有变数,说不定最终还得程序员想办法去解决。
所以说,请大家对身边的程序员好一点,因为他们不仅要跟发际线、甲方斗争,还要为了拯救世界跟时间代码战斗。
好了,本期就到这里了,欢迎大家在评论区留下自己的看法。
我是月林科普,关注我,每天分享好玩有趣的科普知识。
回复

使用道具 举报

网站地图|页面地图|文字地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2024-11-27 06:25

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表