暂时构建出的数据库架构图:
- 通过磁盘,数据库文件,页(有时也会被称为块)来描述数据库 -> 基于磁盘上的数据库文件
- 内存中使用 缓冲池(Buffer pool)进行管理. -> 基于内存的 Buffer pool
这其实就像是 虚拟内存(Virtual Memory)
既然 os已经实现了虚拟内存,为什么数据库还要去构建类似虚拟内存?
在磁盘中有一些页面
在内存中,操作系统有自己的虚拟内存页面以及物理内存
使用内存映射文件(mmap)将文件中的内容存储到进程的地址空间中
- 内存映射文件,本质上是从磁盘中获取文件,然后告诉操作系统将文件页面映射到某个进程的地址空间中
- 然后我们可以对内存空间进行读写
- 最后可以让操作系统将之写出,通过执行一个 Sync并将其写回到磁盘上
而 操作系统去负责移动包含数据的页面 进出内存.
- 数据库 放弃了从内存上以及磁盘上移动数据的控制权,让 os来帮我们管理这些
- 数据库想要的是虚拟内存通过 mmap来映射到文件,这如何实现的背后 db无需关心,交给 os即可
本质上来讲,操作系统并没有看到数据库在做什么,它 只看到了某些页面的移进和移出(一系列页面的读写操作),它无需理解任何高级语义,或者查询要做什么,以及读取那些数据
这其实是 存在问题的:对于读数据,可以通过一系列内存调用来减少我们遇到的问题;对于写数据,os并不知道哪些页面需要在哪些页面之前从内存写回到磁盘;等等,还是有一系列问题存在
主流的数据库基本上都没有去使用 mmap,因为这其实 是一种糟糕的做法
MySQL并 不想放弃内存以及磁盘上移动数据的控制权,其实 MySQL能做得比 os更好!
好的数据库而言应该要尽可能去避免 mmap,尽量不要去依赖 os!
- os只能看到一系列页面的读取,并不知道实际的用途,os知道的很有限,但是对于数据库而言,它是知道着的准确的含义
- os的存在,可能会影响数据库在某方面上的决策