Motivation
创建一个文件格式跟在非托管内存模型的语言中创建一个数据结构是类似的。我们分配一个块然后按照我们想要的方式,使用指定大小的机制跟结构来对其进行切分。当我们想要引用一大块内存或一个不定长的结构时,我们会使用指针。
使用非托管内存模型的语言允许我们自如的分配我们所需的内存 (在合理的边界内) 而无需担心这块内存是否连续、是否有碎片、或是在我们释放它之后会发生什么事。在磁盘中,我们需要自己来小心的处理垃圾回收跟碎片化问题。
数据布局在磁盘中相对于内存要重要得多。为了让基于磁盘的数据结构能够高效,我们需要将数据以能够快速访问的方式进行组织,还要针对特定的持久化存储介质做出考虑,设计出二进制数据的格式,找到高效的序列化及反序列化的方式。
那些使用过低级语言,比如 C 且没有使用额外的库的人会明白其中有哪些限制。数据结构需要预定义其尺寸及明确的进行分配跟释放。手动的实现内存分配跟跟踪是一个巨大的挑战,因为只能对预定义好尺寸的内存块进行操作,我们还需要跟踪哪些块是已经释放的,哪些是还在使用的。
当在内存中存储数据时,大部分的内存布局问题都是不存在、或容易解决的、或可以使用一些第三方库来解决。比如,处理可变长度的字段及超大的数据都是很简单的,因为我们可以直接使用内存分配跟指针,而不需要将他们以某种特殊的方式来布局。不过还是有一些场景是需要开发人员设计特定的内存数据结构来从 CPU 的缓存、预读机制等硬件特性中得到优化的,但这些已经是属于优化目标了。
景观操作系统跟文件系统已经做了许多的事,实现基于磁盘的数据结构仍然需要关注更多的细节跟避开鞥更多的陷阱。