Redian新闻
>
50 多年前,大神在操作系统中埋的雷,快要爆了…

50 多年前,大神在操作系统中埋的雷,快要爆了…

公众号新闻

1969年,贝尔实验室的大神Ken Thompson的老婆休假,带着儿子回娘家,时间长达三周。


趁这段时间,他决定开发一个操作系统:Uni


正在如火如荼地敲代码的时候,Ken突然卡壳了,这是一件非同寻常的事情,之前的开发都是一帆风顺,行云流水的。


因为他意识到有个非常重大的问题,必须马上解决。


这个问题就是:如何在Unix中表示日期和时间?


这个问题非常重要,因为日期和时间管理对于任何操作系统来说都是关键功能,包括文件时间戳、程序调度、日志记录等。


最容易想到,也是最简单的办法就是用一个字符串来表示,例如:


1970-09-17 00:00:30.751


有年月日,时分秒,还有细粒度的微妙,并且可读性非常强。


但是这种方式明显不符合Unix的设计原则:简洁,一致性,易于使用。


原因很简单:


(1) 存储效率低下


字符串需要占用大量的空间,处理起来也更复杂


(2) 计算复杂性读比较高


比如要计算两个时间的差值,需要先解析字符串,然后进行更复杂的日期和时间计算。



解决办法


正当Ken一筹莫展之际,Dennis Ritchie端着咖啡走了过来:“兄台,遇到什么事情了?”


Ken把问题的来龙去脉讲了一遍。


Dennis沉吟道:“嗯,这确实是一个问题,得有一个简洁易用的,符合Unix设计原则的方案....”


突然,Dennis一拍大腿:“用一个整数来表示日期和时间怎么样?”


聪明异常的Ken立刻秒懂,眼睛发光:“对,先确定一个开始时间(纪元),然后这个整数表示从纪元开始到当前时间流逝的秒数!”


Dennis说:“这个纪元可以设定为:1970年1月1日00:00:00,那个时候Unix肯定发布了。”


如果这个整数是:1631280731,那就表示 2021-09-10 13:45:31 UTC



Ken Thompson决定把这种方式成为Unix Epoch Time(Unix 纪元时间)


用一个整数来表示时间戳,有几个主要的优势:


(1) 简化


通过将日期和时间表示为一个单一的整数,可以大大简化日期和时间的计算。例如,计算两个日期之间的差异就只需要对两个整数进行减法运算。


(2) 便于存储和处理


整数易于存储(占用的空间较少)且便于在各种编程语言中处理。


(3) 兼容性


Unix时间戳可以在不同的操作系统和平台之间轻松地进行交换和比较。


(4) 全球统一


Unix时间戳是从同一时刻(1970年1月1日00:00:00 UTC)开始的,所以它提供了一种在全球范围内统一的时间表示方式。



问题出现



当然,Unix时间戳也有其限制。例如,它不能很好地处理闰秒,而且直接查看Unix时间戳并不能很好地理解当前的日期和时间。


在上世纪六七十年代,电脑主要还是16位的,Ken Thompson把Unix时间戳确定为32位整数,他觉得已经够大了,再说了谁会知道Unix操作系统能用多久呢?


让人想不到的是Unix一直存活了下来,它的很多概念对整个计算机科学和软件开发领域产生了深远的影响,包括时间和日期的处理方式。类Unix的开源操作系统Linux继承了Unix的衣钵,甚至统治了服务器端的OS市场。


开发Linux的时候,也是采用了32位的整数来记录时间戳。


现在一个大问题来了,32位的有符号整数最大值是2147483647 ,只能让我们用到2038年1月19号 03:14:07 UTC 



下面这个动图展示了整数溢出以后的效果:



这被称为Y2K38问题。


解决方案也非常简单,就像IPV6一样,用128位IP,可以给地球上每一粒沙子都赋予一个IP地址,并且还有大量剩余。


Unix Epoch time 可以把32位的整数变成64位。


使用64位整数,可以表示到接近290亿年后的时间,不知道那个时候地球还是否存在?


大概是从Linux 5.6版本开始,Linux内核开始全面支持64位时间戳的系统调用,但是升级了内核以后,并不意味着完事大吉,应用程序和库在编写的时候如果使用了time_t类型(早期是32位的),现在需要改成64位整数,然后重新编译,要不然依然会产生溢出问题。


嵌入式系统最有可能受到Y2K38问题的影响,一般的服务器软件通常会定期进行升级,打补丁,但是嵌入式软件一旦随着硬件发布出去,就很少更改,很可能会运行到2038年。



尾声



在Unix Epoch Time确定下来30年后,一个准备转行Java程序员的年轻人打开了Java 的Date类。


Date内部实际上存储的就是一个长整型的数(long),它表示的是自1970年1月1日 00:00:00 (即Unix Epoch时间)以来的毫秒数。


他觉得非常奇怪:为什么是1970年1月1日 00:00:00呢?是谁确定了这么一个古怪的日期呢?


后记:Ken Thompson和Dennis Ritchie一起确定Unix纪元时间的故事是我杜撰的,大家了解下Unix纪元时间就好,不要当真。


作者介绍:本文作者刘欣,著有畅销书《码农翻身》,《半小时漫画计算机》,前IBM架构师,领导过多个企业应用架构设计和开发工作;洞察技术本质,擅长用故事去讲解复杂技术。


- EOF -

推荐阅读  点击标题可跳转

1、Google 有一个函数,20000 个变量……

2、员工每天“带薪如厕”3~6小时被开,官司一直打到高院

3、已刑拘!人大毕业生盗取学生信息建“颜值打分”网站


关注「程序员的那些事」加星标,不错过圈内事

点赞和在看就是最大的支持❤️

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
ChatGPT暂停集成Bing搜索;英伟达收购AI创企OmniML;天猫精灵启动大模型终端操作系统内测丨AIGC大事日报谷歌AR/VR操作系统工程总监辞职;Snapchat+订阅人数突破400万法国埋的“雷”炸了,一场暴乱马克龙看清中美,选美国,大错特错龙蜥操作系统重磅更新:全面支持智能计算,兼容主流 AI 框架唱和数首咏时间四十三 反右华为发布HarmonyOS 4操作系统;安全带或摄像头存隐患,特斯拉召回271辆进口汽车;宝能就姚振华遭袭事件发声明丨大公司动态中国首个开源桌面操作系统发布;世界气象组织确认厄尔尼诺出现丨科技早新闻硬核观察 #1082 ChromeOS 将分离浏览器和操作系统硬核观察 #1033 安卓开源项目将不是一个完整的开源移动操作系统山东最大的雷,炸了!从“新”出发,万字长文谈操作系统国产替代多年前,有人送给阿尤3个一摸一样的美女如何建立「员工操作系统」?Stripe前COO新书给出务实建议自主性增强!国产操作系统实现新突破普京的秘密(1)——瓦格纳组织(2)深度操作系统 deepin V23 Beta2 今日发布,修复问题超 450 个深圳发文推动鸿蒙欧拉比肩全球领先操作系统福建最大的雷,炸了!福建最大的雷,炸了国产操作系统突破,统信 UOS 装机量超 500 万套,功能追平 Win7山东最大的雷,炸了侃爷和妻子一连多天在意大利穿着暴露四处晃悠,意大利网友快要爆发了...苹果宣布最新操作系统:visionOS工信部:欧拉服务器操作系统累计装机量超430万套,为130个国家和地区用户提供服务后 CentOS 时代,国产操作系统能否扛起大旗?ZT:龚俊在红毯上的游刃有余之感就在本周六!四大咨询大神在线公开香港咨询求职内幕Windows Copilot抢先上手!GPT-4全线接入Win11,重新定义操作系统手机操作系统的沉浮往事好消息!我国首个开源桌面操作系统发布“开放麒麟1.0”发布!我国首个开源桌面操作系统来了→人老病多。。。AIoT情报|Sig fox新所有者寻求1亿美元融资;马斯克再度大赞中国:将有很强的AI能力;我国首个开源桌面操作系统来了应届生租房,能不踩的雷,咱尽量不踩…比恒大更劲爆的雷,要来了吗?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。