ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。
https://ckai.xyz
1 levelDB读写抽象
在levelDB中,读写能力是通过Env提供的。Env是一个接口类,其提供创建读写代理文件类(是我自己特殊的叫法,因为这些类,本质上是对特定环境下的文件读写的代理。当然Env除了抽象了文件读写之外,还抽象了一部分任务执行或者说叫CPU能力,但是这块实现上还是比较简单),这些代理类根据不同的内核有不同的实现,在levelDB中主要是posix语义的实现以及windows语义的代理文件类。
在实现上,Env并不保有任何的代理文件对象,而是通过几个接口,创建对应的代理文件对象。几个抽象类的关系如下
Posix语义的实体类关系如下所示
2 细读PosixEnv
2.1 代理文件类型
2.1.1 PosixSequentialFile——顺序读代理文件类
该类提供顺序读文件的能力,在实现上是对c库的read函数的简单封装,没有特别的操作。
2.1.2 PosixRandomAccessFile——随机读代理文件类
该类提供随机读文件的能力。由于是随机读,所以针对磁盘,levelDB有一个优化操作,是通过mmap将整个文件映射到内存中,然后后续对这片内存进行随机读。当然为了避免使用过多的内存,levelDB使用了一个mmap_limiter来限制可以申请的用于mmap的最大内存数额,如果额度不够,则创建一个PosixRandomAccessFile,否则创建一个PosixMmapReadableFile。
2.1.3 PosixMmapReadableFile——使用Mmap进行随机读的代理文件类
前面已经描述过,此处不再赘述。