什么是电脑千年虫
计算机2000年问题,又叫做“2000年病毒”、“千年虫”、“电脑千禧年千年虫问题”或“千年病毒”。缩写为“Y2K”。是指在某些使用了计算机程序的智能系统(包括计算机系统、自动控制芯片等)中,由于其中的年份只使用两位十进制数来表示,因此当系统进行(或涉及到)跨世纪的日期处理运算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功 能紊乱甚至崩溃。
千年虫的根本问题
“千年虫”包括以下两个方面的问题:一个是在一些计算机系统中,对于闰年的计算和识别出现问题,不能把2000年识别为闰年,即在该计算机系统的日历中没有2000年2月29日这一天,而是直接由2000年2月28日过渡到了2000年3月1 日;另一个是在一些比较老的计算机系统中,在程序中使用了数字串99(或99/99等)来表示文件结束、永久性过期、删除等一些特殊意义的自动操作,这样当1999年9月9日(或1999年4 月9日即1999年的第99天)来临时,计算机系统在处理到内容中有日期的文件时,就会遇到99或99/99等数字串,从而将文件误认为已经过期或者将文件删除等错误操作,引发系统混乱甚至崩溃等故障。
千年虫的根源
“千年虫”问题的根源始于60年代。当时计算机存储器的成本很高,如果用四位数字表示年份,就要多占用存储器空间,就会使成本增加,因此为了节省存储空间,计算机系统的编程人员采用两位数字表示年份。随着计算机技术的迅猛发展,虽然后来存储器的价格降低了, 但在计算机系统中使用两位数字来表示年份的做法却由于思维上的惯性势力而被沿袭下来, 年复一年,直到新世纪即将来临之际,大家才突然意识到用两位数字表示年份将无法正确辨识公元2000年及以后的年份。1997年,信息界开始拉起了“千年虫”警钟,并很快引起了全球关注。
千年虫的影响
千年虫主要会在什么地方发作呢?就世界上的情况来说,千年虫主要集中发作于两个方面:
一个是配备比较早(大约在80年代中期以前投入使用)的主机上的应用系统,如在IBM 4381,IBM AS/400等机型上运行的应用程序。这些机器系统国际上都应用的相当早,因此其上面的应用程序经过十余年的开发和发展其规模已经非常庞大,比如美国的AT&T电讯公司,其内部就有超过3.6亿行的应用程序需要检测是否存在2000年问题,这确实是很大的工作量,因此给解决2000年问题造成了极大的麻烦。
另外一个容易发作的方面是嵌入式设备。所谓嵌入式设备,就是指设备中使用了智能芯片的系统,由于智能芯片价格低廉,目前嵌入式设备已变成无处不在,由生产线、大量的自动化仪器仪表、汽车、电梯、警报系统、消防检测器到医疗设备,以至电话交换机、空调机、交通灯、恒温器等,可谓渗透到日常生活每个角落。这些设备中应用的程序往往都已经固化到元器件中,因此一旦产品只使用了两位数来表示年份,就会引发2000年问题,而要替换这些芯片,又往往不得不把整个系统都替换,这会造成资金和操作上的困难,使解决2000年问题更加麻烦,也是无法按时解决2000年问题的隐患之一。
对于我们普遍使用的PC机又会怎样呢?从硬件角度讲,2000年问题主要存在于微机的BIOS不能实现向2000年的自动过渡,相对来讲是比较简单的。否则问题一旦发作起来就会让你手忙脚乱,狼狈不堪。具体来讲,在微机硬件中有一个实时系统时钟,它依靠微机主板上的纽扣电池作为电源和动力,时刻保持运转,这样微机在关机时也能够保持时间前进。这个实时系统时钟的时间数值是保存到主板BIOS中的存储器(CMOS)中的。当微机启动时,微机操作系统从BIOS的那个时间存储器里读取当前时间,包括四位数的年份以及月份、日、小时、分钟、秒等,从此,只要不关机,操作系统的时钟就会以微机外接电源(不再是主板上的纽扣电池)为动力单独向前运转,并保存在微机的内存中(不再是BIOS中的存储器)。微机的2000年问题主要表现在,尽管RTC—实时系统时钟中使用了四位数来表示年份,但其年份数据的前两位(世纪信息,如“19”,“20”等)并不和后两位发生联系,也就是说,当后两位从“99”变为“00”时,并不能向前进位使前两位数由“19”变为“20”,这样,RTC中1999年的下一年便应该是1900年,从而引发了2000年问题。
而对于目前应用的操作系统(如DOS 5.0以上版本、Windows 3.x、Windows95、 Windows 98以及 Linux 、SCO Unix、Windows NT)时钟来说,其年份都是用四位数来表示的,因此不会存在2000年问题。但目前的问题是操作系统中附带的一些小实用程序、工具或函数调用,有可能因为年份表示不完整而引起千年虫发作,但可以肯定的一点是,只要你不使用到这些小实用程序或工具,就不会引发2000年问题。如果你要详细了解这些操作系统中到底有哪些实用程序、工具或函数调用存在,总之,对于我们自己使用的微机来说,其系统方面的2000年问题是相对简单的,其难点还应该是其上面规模庞大的应用程序上。
千年虫再现
10年前的千年虫事件,这个使几乎所有电子设备瘫痪的病毒,在沉寂了10年之后,再次悄然现身。据最近的网络消息称,出乎人们的预料,2010年再次出现类似2000年的“千年虫”问题。
银行卡失灵:德国银行协会5日警告说,在进入2010年之际,超过2500万张德国银行卡可能遭到类似“千年虫”软件漏洞的损害,导致电脑芯片无法识别年份“2010”,从而让使用自动取款机或在德国境内甚至境外分行取款、用卡消费的银行客户无法使用银行卡。
跳过2010直至2016年:不知道什么原因,澳大利亚昆士兰银行卡处理中心的计算机时钟,在越过2009年12月31日之后,反常地直接翻至2016年1月1日,掠过了中间的6个年头。然而,出现这样的状况会有什么样的后果呢?
最直接的,大量的昆士兰州的企业依靠该银行处理他们的信用卡支付业务,而大量信用卡在2016年之前就已经到期失效,所以几乎所有的交易都面临瘫痪。不过虽然还没有查明原因,银行已经启动人工批准流程,以保证经济的正常运转。
千年虫病毒竟手机再现
也许大家觉得澳大利亚的银行离我们还比较遥远,但如果同样的病毒出现我们的手机里,会是什么效果呢?目前已发现的大多出现在WM系统机型上,用户收到的在2010年1月1日后发送的短信,都会显示为2016年1月1日。尽管已经有玩家放出了补丁,但微软官方并没有对此作出任何行动。
“收到未来的信息”始终是个玩笑,但在相隔10年之后再次出现相同的事件,确实令人匪夷所思。是机器本来就不可靠?还是人类编写的机器语言本身就是有漏洞的?一切尚无定论。
赛门铁克产品事件:12月6日消息,据国外媒体报道,赛门铁克警告称,其Endpoint Protection Manager(端点保护管理器)服务器产品错误地把今年发布的病毒特征更新标记为过期。
出租车计价受影响:重庆晚报1月3日报道 因系统时间不能自动跳入2010年,安徽省芜湖市近千辆出租车出现了2010年第一个零时计价器就“清零”的失灵状况。据介绍,出现故障的计价器有两种“症状”,其中产自上海的计价器在1月1日零时一到,其显示价格就自动跳为0元,而溧阳产的计价器则无故将起步价由5元变为6元。专家分析说,故障是由于计价器的电脑系统时间不能自动从2009年跳入2010年而导致功能混乱,非常类似于“千年虫”,所以老款的计价器必须更换芯片。
2038年问题(Y2K38 BUG)与千年虫
和本世纪初的千年虫(Y2K Bug)问题类似,LINUX系统千年虫问题又称为2038年问题(Y2K38 BUG)。如果你想知道什么是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年问题不仅比千年虫更隐蔽,,而且比之前千年虫问题更具有破坏力,因为千年虫问题只会导致应用层的程序出现问题,比如信用卡支付系统,或者管理系统。而2038这个bug,将会影响系统最底层的时间控制的功能。
要解决这个问题,最简单的方式是扩展UNⅨ时间的长度,用64位数字来表示它. 64位二进制数的实际可用位数是63位,最大表示到公历的UTC时间292277026596年12月4日. 如果那个时候人类文明还存在的话,公元纪年很可能已经因为太难用而被抛弃了. 理想的情况是到2038年,64位系统已经成为主流,从而避免特意去修正这个问题所需要的大量开销. 否则,人们就必须把新的64位时间拆分成两部分并分别保存在两个变量里,这是一个麻烦而且效率低下的选择。
浏览器下千年虫的解决方法
日历脚本在火狐浏览器下显示的日期是:114年,在IE下是正确的。这个问题叫浏览器的千年虫的问题。解决方法:
把下面代码放到标签下:
var enabled = 0; today = new Date();var day; var date;
if(today.getDay()==0) day = "星期日"
if(today.getDay()==1) day = "星期一"
if(today.getDay()==2) day = "星期二"
if(today.getDay()==3) day = "星期三"
if(today.getDay()==4) day = "星期四"
if(today.getDay()==5) day = "星期五"
if(today.getDay()==6) day = "星期六"
document.fgColor = "000000";
date = " 今天是: " + (today.getFullYear()) + "年 " + (today.getMonth() + 1 ) + "月 " + today.getDate() + "日 " + day +"";
document.write(date);
效果如下:今天是:2014年 9月 11日 星期四。