本文是看这个文档的一些随想:https://lwn.net/Articles/777212/。这是收费内容,如果你没有订阅看不见,但本文不依赖你看得到该文档。
在大学里学计算机体系结构的时候,我最大的一个梦想是非易失内存。因为当时教科书里说,随机内存都是需要进行周期刷新的,不断刷电才能保证里面的内容不会丢失。
这种说法很自然让我有这么个联想:如果正好我们能找到一种新材料,不用刷这个电,就可以保证里面的信息不丢失,那么我们的软件是否就容易写很多?也许我们就不再需要一个关机的过程了,任何时候,直接关机好了,重新开机所有状态还在,接着运行就可以了。
当然,那是小孩子不切实际的幻想,这个世界单一要素的变更,可以带来巨大的变化,但这种变化只会带来撕裂,不会带来彻底的改观,就好像房子断了一根梁,房子会倒塌,但墙和地板的大体还在,不会因此变成另一个东西。(这其实是道德经中“德”存在的理论基础)
所以,非易失这个问题是一样的。内存可以保留原来的内容,但时间并没有停止,CPU的状态,IO的状态,都在变化,内存必须和他们进行同步。大量认为内存会丢失的软件也不会改变他们当初的假设。而且,易失内存也有一个非易失内存不具备的优势:断电以后它的内容会自动清0,但非易失内存你要主动清。
这些所有的问题,都给非易失内存的应用带来这障碍。所以,到现在未知,非易失内存都被当做“存储设备”来用,比如SSD。
Intel还有另外的解决方案:Intel® Optane™ DC Persistent Memory Operating Modes Explained - IT Peer Network
它是把易失内存当做非易失内存的Cache。但在我看来,这个意义不大,这和磁盘Cache没有任何区别(Intel这个方案中,唯一的区别是易失内存和非易失内存的是一一对应的,不是一对多的关系),但这并不改变,这其实就是一个设备。
我简单考量这个问题,每个问题都要回到问题本身上去。非易失内存和现在的计算机名称空间对应,它就是存储设备,这一点是不可改变的,这个根本就没有必要变化。如果它的速度达到易失内存一样的速度,当做易失内存用,那么,它就应该被放到非易失的运行环境中。这个环境和IO,和CPU状态都无关,这个东西,很明显是和IO无关的进程空间。
所以,如果我个人发展这个方向,会创建一种persistent_fork,这样会创建一个进程,这个进程的内存全部放在persistent内存中,这样它关机后,它的内容就是不需要恢复的。好比你启动一个操作系统,操作系统还是要启动的,但你的Office不要。
要做到这一点,这个进程的关联数据结构也必须可以进行保存和校验,比如它在内核中的task_struct等数据结构,它打开的文件等。这也需要增加新的Signal,告诉它系统在恢复。这样一个新的子系统加进来后,就可以慢慢扩展到其他子系统,慢慢走到以非易失内存为主的道路上了。
我能想到一个很有趣的东西会是,这种系统以后只会打开很多的文件,但不保存,只有你要“另存到”,或者“备份到”一个“外部存储”的时候,才有真正的IO,否则都是在本地内存里就可以了。甚至备份可以不用到外部存储。自动在两个内存块接口上提供双写接口就可以了。
这个和虚拟机的Snapshot接口其实一模一样,所以,同样的技术将可以直接扩展为虚拟机支持,这样,未来我们的应用都会变成Snapshot的形态,迁移的不再是数据文件了,而是应用程序Snapshot本身。