Leveldb 文件抽象 #
leveldb 是一个面向磁盘的存储系统,因此文件管理、操作的重要性不言而喻。由于 C++ 标准库中的文件实现是依托答辩,因此 leveldb 选择自己抽象文件。
leveldb 的文件抽象很值得学习,将文件按照不同的用途使用不同的类表示,底层都指向文件描述符,通过 base 类在不同的平台上进行了实现。
Append 写缓冲 #
append 没有采用直写文件的方式,而是增加了一个缓冲区
- 写入优先写缓冲区,一旦缓冲区满 flush 到文件
- 规避了 os page cache,每次写文件都是 fsync
实现细节
- windows 和 posix 的写文件抽象内部都分配了一个 64kb 的 buffer
- 一次写入可以完全写满缓冲区则返回,否则
- 部分写入缓冲区的内容需要 flush 到磁盘,此时缓冲区为空,尝试缓冲区是否满足剩余内容,如果可以则写入返回
- 否则认为这是一个较大的写入,不在写缓冲区,而是直写到文件