operating-system - 为什么 DMBSes 不能依赖操作系统缓冲池?

标签 operating-system filesystems database

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/

相关文章:

networking - TCP缓冲区在进程内存的地址空间中吗?

c - fork 指令

Java 原子文件在断电时移动重复文件

c# - NHibernate- 防止删除特定实体(即设为只读)

C++编程: getting an error or not according to the computer in use.

linux - 计算机系统中的计时机制

c++ - 将文件系统路径转换为 ​​const BYTE* 的问题

php - 试图用php删除linux中的一个目录和他的隐藏文件

php - 删除用户后保留分配历史

sql-server - 如何阻止数据库部署删除服务器触发器?