OS 为开发者提供了如 mmap 这样的系统调用,使开发者能够依赖 OS 自动管理数据在内外存之间的移动,那么 DBMS 为什么要重复造这样的轮子?主要原因在于,OS 的磁盘管理模块并没有、也不可能会有 DBMS 中的领域知识,因此 DBMS 比 OS 拥有更多、更充分的知识来决定数据移动的时机和数量,具体包括:
- 将 dirty pages 按正确地顺序写到磁盘
- 根据具体情况预获取数据
- 定制化缓存置换(buffer replacement)策略
使用操作系统的mmap,如果是读取文件还好说。但如果是写入文件就会出现问题,操作系统并不知道某些pages必须要在其他pages执行之前先从内存刷到磁盘上——日志和并发控制会涉及到。但是可以给操作系统一些“提示”来解决这个问题。
数据库系统使用mmap是很糟糕的,因为数据库总是很确定的知道查询要做什么,知道工作负载是怎么样的,数据库系统可以作出最佳选择,但是操作系统什么都不知道,他只知道读取、写入文件
再后面我们会讨论如果不使用mmap,我们也会使用预存、更好的替换策略、更好的调度之类的东西。
总之,操作系统并不是你的朋友,你不能依赖他,我们应该尽可能尝试避开他。他可能会做出对我们数据库系统有害的决策。操作系统既是朋友也是敌人。