购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 动机

构建一种文件格式十分类似于在非托管内存模型的语言中构建数据结构。我们先分配一个数据块,然后使用定长的原始类型和结构体以任意我们希望的方式将它切片;如果想要引用一大块内存或是变长的数据结构,则可以使用指针。

非托管内存模型的语言允许我们在需要时(在合理范围内)分配更多的内存,而不必考虑诸如是否有连续的内存段、这些内存是分段还是连续的、内存释放之后会怎样等问题。而在磁盘上,我们必须自己处理垃圾收集和碎片问题。

磁盘上数据布局的重要性也远大于内存中其重要性。要想设计一个高效的磁盘数据结构,我们需要仔细设计布局以确保高速访问,还要考虑持久性存储介质的特性、设计二进制数据格式,并找出一种高效的序列化和反序列化的方法。

只要用过C这样的低级语言(不含其他库),我们都体会过这一限制:结构体有预定义的大小,并且需要被显式地分配和释放。手动实现内存分配和跟踪则更有挑战性,因为我们只能操作预定义大小的内存段,而且必须跟踪哪些段已经被释放了、哪些段还在使用中。

当数据存在主存中时,大部分内存布局的问题都不存在、很容易解决或是能用第三方库来解决。例如,处理变长字段和超大数据就要简单得多:只要分配内存并用指针指向它即可,无须以任何特殊的方式对其进行布局。在某些情况下,开发者确实会设计特殊的内存数据结构以利用CPU缓存行、预取或其他硬件相关的特性,但这样做主要是出于优化的目的[FOWLER11]。

即便操作系统和文件系统承担了部分职责,实现磁盘数据结构仍需要关注更多细节,而且在具体实现中也存在更多的陷阱。 7WhAQfmvSsdHBAKzGDI8b2R7thqE6yT/SFc/rM7mQx6+BJ5E2TVVXApldpJMQuQ0

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开