庚子年是中国传统的 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 秒作为时间的基准点,往前往后每过一秒就加一个数字,依此来计算时间。

image

这个时间的最后结束点是 2038 年 1 月 19 日 03:14:07,一旦越过这个瞬间,时间将会“绕回”(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为 2038 年,而可能会依个别实现而跳回 1970 年或 1901 年。因此可能产生错误的计算及动作。就像下面这样。

img

所以如果时间将近 2038 年时,还存在 32 位机器在世界中运行,那将会受到 2038 年问题的影响。

从这也可以看出为什么很多厂商都不再提供 32 位支持了。

危害性

可能很多人都疑惑,这不就是个时间问题吗?有你说的那么严重吗?

当然,简单来看这就是个时间问题,而且换成 64 位的机器 2038 年问题就会自动消失了。但这只是一厢情愿,对于嵌入式设备来说,现在还有大量 32 位系统在全球各地运行,谁也无法保证这些系统在 2038 年之前就能光荣退役。

而且很多程序都会依托时间进行计算,最简单的就是银行的贷款利息等金融服务的计算,如果不解决,就一定会出现各种混乱。

而且,由于这个特殊时间点的存在,并不是说只有到 2038 年的时候才会出现问题,比如前两年就出现过,将 iPhone/iPad 等设备日期设置成 1970 年 1 月 1 日,设备就会变砖,并且无法通过寻常的备份还原等手段进行恢复。就是因为,iOS 是基于 Unix 操作系统构建的。

image

而且事实上 2038 年问题的范围远不止于此。前面谈到的问题都还是操作系统运行时表示数据的溢出,但还有一些数据是静静在躺在某个磁盘上,当时间走到 2038 之后再把它它们翻读出来,一样会出现问题。

我们知道文件都有几种时间属性,比如创建时间,最后一次访问时间,最后一次修改时间。如果该时间类型也是 32 位有符号数,那在 2038 之后的某个早晨,试想一下你和朋友喝着咖啡,回忆起 2038 年以前的某次旅游,你兴高采烈说着之前见闻,并拿出手提电脑打开之前拍下的照片,这时扫兴的事情将会发生,文件打不出或者出错。

所以说,如果这个问题不解决,夸张点说,未来真的可能会出现,全世界大部分的电子设备全部瘫痪的场景。

如何解决

2038 年问题的根源就是使用了 32 位有符号整数来表示时间,看起来它的解决方案非常的简单,直接粗暴地将32 位有符号整数 修改成 64 位有符号整数

如果真的这样做,那对这个世界会产生什么影响呢? 在修复 2038 年问题那一天,估计全世界人已都在做同一件事情:

  1. 所有应用程序统统重新编写代码,至少得重新编译才能在新系统上运行
  2. 所有受影 2038 年影响的文件系统对应的分区,得统统格式化掉
  3. 在那天有的互联网服务都统统下线了,整个应用网络处于瘫痪状态
  4. 更离奇的是,你在银行的存款被清零了;对于那个贷款的家伙来说是个好事情,因为他们不用向银行还钱了

因此这样的做法无异于格式化整个世界,创建一个新的世界。我们当然不能这样。

不过,遗憾的是,当前并没有针对现有的 CPU/操作系统搭配的简单解决方案。直接将时间更改为 64 位模式将会破坏对于软件、数据存储以及所有与二进制表示时间相关的部分的二进位兼容性。更改成无符号的 32 位整数则会影响许多与两时间之差相关的程序。

那我们就真的无能为力了吗?并不是,我们还可以:

  1. 推广 64 位机器/软件的使用,争取当那一天来临的时候波及的设备尽可能少
  2. 做好对 32 位软件的兼容

不过大家也没必要恐慌,毕竟离 2038 年还有 18 年的时间,Linux 社区也开始着手处理这个问题了,离目标不远了,胜利在望。

最后

如果你真的有兴趣的话,可以到time.is/Unix这个网站,他会告诉你从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在一共过了多少秒。

以上就是这次介绍的 2038 问题了,相信很多工程师都知道这个问题,也许到时候世界上就没有 32 位的机器了,或者是说已经有大佬解决了这个问题。毕竟已经有过千年虫问题的前车之鉴了,很多人已经知道要提前做准备了。

最后,如果你觉得我的文章对你有帮助的话,不妨给个关注支持一波,

image

聊一聊2038年问题相关推荐

  1. Linux 5.10将解决2038年问题

    Linux 5.10将解决2038年问题 新添功能以支持时间戳直至 2486 年_IT专家网

  2. 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已准备好应对 2038 年问题

    2038 年问题与千年虫问题类似,它可能会导致某些软件在 2038 年 1 月 19 日 3 时 14 分 07 秒之后无法正常工作.届时,在大部分 32 位操作系统上,依据 "time_t ...

  3. mysql 2038年问题_当前系统在2038年之后datetime类也无法获取当前时间的解决

    由于php 32位使用 int 类型保存时间戳,也就是从1970 00:00:00 到当前时间的秒数. 而32位int 数字的取值范围是 -2147483648 到 2147483647. 所以当 时 ...

  4. 千年虫与2038年问题

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

  5. 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已率先做好准备 应对 2038 年问题

    新十年伊始,Linux Kernel 5.6的开发者已经准备好着手解决将在下一个十年到来的2038年问题(又称"Y2038"或"Unix Y2K"问题).Lin ...

  6. 2038计算机系统,2038年问题

    2038年问题是指在使用POSIX时间的32位计算机应用程序上,格林尼治时间2038年1月19日凌晨03:14:07(北京时间:2038年1月19日中午11:14:07)之后无法正常工作. 中文名 2 ...

  7. mysql 2038年问题_64位Ubuntu系统的时间戳,2038年问题

    问题描述 我正在使用64位Ubuntu系统. 我目前正在研究一个包含MariaDB的项目.我打算在项目中引入时间戳记技术,以便人们可以在不同时区获得正确的时间. 我已阅读并阅读了一些有关2038年问题 ...

  8. 2038年问题 linux内核5.6,Linux 5.1延续为2038年问题所做的多年准备

    Linux 5.1为2038年问题在内核方面继续进行大量的工作. 多年来在Linux内核一直看到"Y2038"的工作,而这一努力远未结束.Thomas Gleixner为Linux ...

  9. 洛谷 P2655 2038年问题

    P2655 2038年问题 题目描述 网络时代,机会与危机共存."千年虫"解决之后,会不会有新的"虫"出现?回答是肯定的,"2038年"就是 ...

最新文章

  1. docker ps 列出容器 命令简介
  2. 怎么看另一个电脑端口是否通_谁一个人睡觉另一个看看夫妻的睡眠习惯
  3. linux安装mysql后怎么进去_linux安装mysql详细步骤
  4. kali linux 截图位置,Kali Linux中使用shutter截图工具 | CN-SEC 中文网
  5. Android的滑动分析
  6. 利用 PIL模块实现生成动态验证码
  7. linux命令行 正则,Linux shell基础(四)正则表达式与grep命令 beta
  8. html语言中 头元素的标记是,HTML元信息标记
  9. iframe页面相互调用方法
  10. regulator linux,linux下regulator的应用
  11. linux用户打开进程数,Linux 用户打开进程数的调整
  12. ENVI 5.3软件安装教程(附带安装包获取方式)
  13. python商品总数抹零_销售发货单
  14. 设置google浏览器为黑色底色
  15. CNN可视化-Guided Grad-CAM
  16. 使用memcpy函数的耗时测试(拷贝不同大小数据量耗时不同)
  17. 训练神经网络的详细步骤,如何训练一个神经网络
  18. awk和sed命令详解
  19. 基于无人机倾斜摄影模型提取高精度地形DEM数据
  20. android ellipsize的使用

热门文章

  1. 三相永磁同步电机无速度传感器控制(基于扩展反电动势)
  2. 【缺陷管理】9:偶尔出现的缺陷如何处理?
  3. Navicat 连接 MySql 报错2059时的解决方法
  4. DNS,二级域名泛解析
  5. 计算机网络笔记:DNS域名解析过程
  6. 关闭电脑时提示有人远程使用计算机,关机时提示有人正在远程使用
  7. Ceph _backfill and recovery 之间的不同以及 peering理解
  8. Python3,10行代码,制作艺术签名,从此走上人生巅峰。
  9. 昇腾AI与“紫东.太初”赋能法律服务,多模态大模型迈向“多专多能”
  10. [CocosCreator]封装对象池