Stonebraker 的论文 (Operating System Support for Database Management) 解释说,“从缓冲池管理器获取 block 的开销通常包括系统调用和核心到核心移动的开销。”忘记缓冲区替换策略等。我唯一质疑的是引用。
我的理解是,当 DBMS 想要读取 block x 时,它会发出一条通用读取指令。与请求读取的任何其他应用程序应该没有区别。
我不是在寻找通用的答案(我得到了它们,并阅读了论文)。我寻求所描述问题的详细答案。 参见 Does a file read from a Java application invoke a system call?
最佳答案
阅读您的其他问题,并继续努力:
当 DBMS 必须从磁盘中获取一页时,它将至少涉及一个系统调用。在他看来,大多数 DBMS 将页面放入它们自己的缓冲区中。 (它们最终也会出现在操作系统的缓冲区中,但这并不重要)。
所以,我们有一个系统调用。但是,我们可以避免任何进一步的系统调用。这是可能的,因为 DBMS 将页面缓存在它自己的内存空间中。当 DBMS 决定它需要一个页面时,它要做的第一件事就是检查它是否在它的缓存中。如果是,它会从那里检索它,而无需调用系统调用。
DBMS 可以自由地以对其 IO 需求最有利的任何方式使其缓存中的页面过期。操作系统的缓存以更一般的方式过期,因为操作系统还有其他需要担心的事情。这方面的一个例子是,DBMS 通常会使用大量内存来缓存页面,因为它知道磁盘 IO 是它可以做的最昂贵的事情之一。操作系统不会这样做,因为它必须平衡磁盘 IO 的成本与为其他应用程序使用的内存。
关于operating-system - 为什么 DMBSes 不能依赖操作系统缓冲池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171919/