聊一聊2038年问题
庚子年是中国传统的 60 甲子纪年法。擅长观测的古人很早就发现,每当年份执行到庚子这一年,自然灾害变多,突发事件频频,一些震动世界、影响安定的大事件也容易发生在这一年。而我们现在所处的 2020 年就是新一轮的庚子年,现在都 4 月了,很多网友都调侃说新的一年什么事情都没做,光在见证历史了。
当然了,作为一个技术博主,我并不是来给大家科普庚子年的,今天我们要说的是计算机中的一个比较危险的年份——2038 年。
PS:本期内容我制作了配套视频,点击即可查看:https://www.bilibili.com/video/BV1Qf4y1U7sR/
2038 年问题
在说 2038 年问题前,我们需要先明白计算机是如何存储系统时间的。
在 Unix 或类 Unix 系统中,都是以 1970 年 1 月 1 日 0 点 0 分 0 秒作为时间的基准点,用秒数来表示系统时间,也即当前系统时间是从基准时间(1970 年 1 月 1 日 0 点 0 分 0 秒)走过多少秒之后的时间。
用公式简单表示就是这样:系统时间 = 基准时间 + 秒数
因为基准时间是确定的,所以我们唯一需要考虑的就是秒数应该如何保存。在当时那个年代,计算机硬件资源非常紧缺,用 16 位表示数据就已经是一个非常奢侈的选择了。因此当时的设计者都认为用 32 位存储秒数已经“足够大”了。所以从那个时候开始使用 32 位来表示秒数。
我们知道在二进制中,32 位数能表示的最大的数是,不过为了能够让时间可以往前往后数,会用第一位作为正负的判断位,第一位如果为 0,则说明为正;若第一位是 1,则说明为负。因此,在 Unix 或类 Unix 系统中,这个数被分成了 2 部分,分别是和。这样我们就可以以 1970 年 1 月 1 日 0 点 0 分 0 秒作为时间的基准点,往前往后每过一秒就加一个数字,依此来计算时间。
这个时间的最后结束点是 2038 年 1 月 19 日 03:14:07,一旦越过这个瞬间,时间将会“绕回”(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为 2038 年,而可能会依个别实现而跳回 1970 年或 1901 年。因此可能产生错误的计算及动作。就像下面这样。
所以如果时间将近 2038 年时,还存在 32 位机器在世界中运行,那将会受到 2038 年问题的影响。
从这也可以看出为什么很多厂商都不再提供 32 位支持了。
危害性
可能很多人都疑惑,这不就是个时间问题吗?有你说的那么严重吗?
当然,简单来看这就是个时间问题,而且换成 64 位的机器 2038 年问题就会自动消失了。但这只是一厢情愿,对于嵌入式设备来说,现在还有大量 32 位系统在全球各地运行,谁也无法保证这些系统在 2038 年之前就能光荣退役。
而且很多程序都会依托时间进行计算,最简单的就是银行的贷款利息等金融服务的计算,如果不解决,就一定会出现各种混乱。
而且,由于这个特殊时间点的存在,并不是说只有到 2038 年的时候才会出现问题,比如前两年就出现过,将 iPhone/iPad 等设备日期设置成 1970 年 1 月 1 日,设备就会变砖,并且无法通过寻常的备份还原等手段进行恢复。就是因为,iOS 是基于 Unix 操作系统构建的。
而且事实上 2038 年问题的范围远不止于此。前面谈到的问题都还是操作系统运行时表示数据的溢出,但还有一些数据是静静在躺在某个磁盘上,当时间走到 2038 之后再把它它们翻读出来,一样会出现问题。
我们知道文件都有几种时间属性,比如创建时间,最后一次访问时间,最后一次修改时间。如果该时间类型也是 32 位有符号数,那在 2038 之后的某个早晨,试想一下你和朋友喝着咖啡,回忆起 2038 年以前的某次旅游,你兴高采烈说着之前见闻,并拿出手提电脑打开之前拍下的照片,这时扫兴的事情将会发生,文件打不出或者出错。
所以说,如果这个问题不解决,夸张点说,未来真的可能会出现,全世界大部分的电子设备全部瘫痪的场景。
如何解决
2038 年问题的根源就是使用了 32 位有符号整数来表示时间,看起来它的解决方案非常的简单,直接粗暴地将32 位有符号整数 修改成 64 位有符号整数。
如果真的这样做,那对这个世界会产生什么影响呢? 在修复 2038 年问题那一天,估计全世界人已都在做同一件事情:
- 所有应用程序统统重新编写代码,至少得重新编译才能在新系统上运行
- 所有受影 2038 年影响的文件系统对应的分区,得统统格式化掉
- 在那天有的互联网服务都统统下线了,整个应用网络处于瘫痪状态
- 更离奇的是,你在银行的存款被清零了;对于那个贷款的家伙来说是个好事情,因为他们不用向银行还钱了
因此这样的做法无异于格式化整个世界,创建一个新的世界。我们当然不能这样。
不过,遗憾的是,当前并没有针对现有的 CPU/操作系统搭配的简单解决方案。直接将时间更改为 64 位模式将会破坏对于软件、数据存储以及所有与二进制表示时间相关的部分的二进位兼容性。更改成无符号的 32 位整数则会影响许多与两时间之差相关的程序。
那我们就真的无能为力了吗?并不是,我们还可以:
- 推广 64 位机器/软件的使用,争取当那一天来临的时候波及的设备尽可能少
- 做好对 32 位软件的兼容
不过大家也没必要恐慌,毕竟离 2038 年还有 18 年的时间,Linux 社区也开始着手处理这个问题了,离目标不远了,胜利在望。
最后
如果你真的有兴趣的话,可以到time.is/Unix这个网站,他会告诉你从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在一共过了多少秒。
以上就是这次介绍的 2038 问题了,相信很多工程师都知道这个问题,也许到时候世界上就没有 32 位的机器了,或者是说已经有大佬解决了这个问题。毕竟已经有过千年虫问题的前车之鉴了,很多人已经知道要提前做准备了。
最后,如果你觉得我的文章对你有帮助的话,不妨给个关注支持一波,
聊一聊2038年问题相关推荐
- Linux 5.10将解决2038年问题
Linux 5.10将解决2038年问题 新添功能以支持时间戳直至 2486 年_IT专家网
- 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已准备好应对 2038 年问题
2038 年问题与千年虫问题类似,它可能会导致某些软件在 2038 年 1 月 19 日 3 时 14 分 07 秒之后无法正常工作.届时,在大部分 32 位操作系统上,依据 "time_t ...
- mysql 2038年问题_当前系统在2038年之后datetime类也无法获取当前时间的解决
由于php 32位使用 int 类型保存时间戳,也就是从1970 00:00:00 到当前时间的秒数. 而32位int 数字的取值范围是 -2147483648 到 2147483647. 所以当 时 ...
- 千年虫与2038年问题
1999年12月31日的夜晚,人类即将迎接第二个千禧之年的到来,大家喜气洋洋地等待新年钟声的敲响.然而有那么一批人此时此刻却紧张不已,因为过了十二点钟,世界各地的政府和金融系统可能会在一瞬间崩溃. ...
- 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已率先做好准备 应对 2038 年问题
新十年伊始,Linux Kernel 5.6的开发者已经准备好着手解决将在下一个十年到来的2038年问题(又称"Y2038"或"Unix Y2K"问题).Lin ...
- 2038计算机系统,2038年问题
2038年问题是指在使用POSIX时间的32位计算机应用程序上,格林尼治时间2038年1月19日凌晨03:14:07(北京时间:2038年1月19日中午11:14:07)之后无法正常工作. 中文名 2 ...
- mysql 2038年问题_64位Ubuntu系统的时间戳,2038年问题
问题描述 我正在使用64位Ubuntu系统. 我目前正在研究一个包含MariaDB的项目.我打算在项目中引入时间戳记技术,以便人们可以在不同时区获得正确的时间. 我已阅读并阅读了一些有关2038年问题 ...
- 2038年问题 linux内核5.6,Linux 5.1延续为2038年问题所做的多年准备
Linux 5.1为2038年问题在内核方面继续进行大量的工作. 多年来在Linux内核一直看到"Y2038"的工作,而这一努力远未结束.Thomas Gleixner为Linux ...
- 洛谷 P2655 2038年问题
P2655 2038年问题 题目描述 网络时代,机会与危机共存."千年虫"解决之后,会不会有新的"虫"出现?回答是肯定的,"2038年"就是 ...
最新文章
- docker ps 列出容器 命令简介
- 怎么看另一个电脑端口是否通_谁一个人睡觉另一个看看夫妻的睡眠习惯
- linux安装mysql后怎么进去_linux安装mysql详细步骤
- kali linux 截图位置,Kali Linux中使用shutter截图工具 | CN-SEC 中文网
- Android的滑动分析
- 利用 PIL模块实现生成动态验证码
- linux命令行 正则,Linux shell基础(四)正则表达式与grep命令 beta
- html语言中 头元素的标记是,HTML元信息标记
- iframe页面相互调用方法
- regulator linux,linux下regulator的应用
- linux用户打开进程数,Linux 用户打开进程数的调整
- ENVI 5.3软件安装教程(附带安装包获取方式)
- python商品总数抹零_销售发货单
- 设置google浏览器为黑色底色
- CNN可视化-Guided Grad-CAM
- 使用memcpy函数的耗时测试(拷贝不同大小数据量耗时不同)
- 训练神经网络的详细步骤,如何训练一个神经网络
- awk和sed命令详解
- 基于无人机倾斜摄影模型提取高精度地形DEM数据
- android ellipsize的使用
热门文章
- 三相永磁同步电机无速度传感器控制(基于扩展反电动势)
- 【缺陷管理】9:偶尔出现的缺陷如何处理?
- Navicat 连接 MySql 报错2059时的解决方法
- DNS,二级域名泛解析
- 计算机网络笔记:DNS域名解析过程
- 关闭电脑时提示有人远程使用计算机,关机时提示有人正在远程使用
- Ceph _backfill and recovery 之间的不同以及 peering理解
- Python3,10行代码,制作艺术签名,从此走上人生巅峰。
- 昇腾AI与“紫东.太初”赋能法律服务,多模态大模型迈向“多专多能”
- [CocosCreator]封装对象池