首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么DMBSes不能依赖操作系统缓冲池?

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

Stack Overflow用户
提问于 2010-07-03 23:26:27
回答 5查看 1.8K关注 0票数 6

Stonebraker的论文(Operating System Support for Database Management)解释说,“从缓冲池管理器获取块的开销通常包括系统调用和核心到核心移动的开销。”忘记缓冲区替换策略,等等。我唯一的问题是被引用的。

我的理解是,当DBMS想要读取一个块x时,它会发出一条公共的读指令。这应该与请求读取的任何其他应用程序没有区别。

我不是在寻找通用的答案(我得到了它们,并阅读了论文)。我寻求所描述问题的详细答案。请参阅Does a file read from a Java application invoke a system call?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-04 01:55:56

阅读你的另一个问题,并继续努力:

当DBMS必须从磁盘中取出一个页面时,它将至少涉及一个系统调用。在这一点上,大多数DBMS将页面放入自己的缓冲区中。(它们也会在操作系统的缓冲区中结束,但这并不重要)。

所以,我们有一个系统调用。但是,我们可以避免任何进一步的系统调用。这是可能的,因为DBMS在它自己的内存空间中缓存页面。当DBMS决定需要一个页面时,它要做的第一件事就是检查它的缓存中是否有该页面。如果它这样做了,它就会从那里检索它,而不会调用系统调用。

DBMS可以自由地以任何最有利于其IO需求的方式使其缓存中的页面过期。操作系统的缓存以一种更通用的方式过期,因为操作系统有其他事情要担心。这方面的一个例子是,DBMS通常会使用大量内存来缓存页面,因为它知道磁盘IO是它能做的最昂贵的事情之一。操作系统不会这样做,因为它必须平衡磁盘IO的成本和其他应用程序使用的内存。

票数 2
EN

Stack Overflow用户

发布于 2010-07-03 23:38:00

操作系统盘i/o必须被通用化以适用于各种情况。DBMS有时可以使用不太通用的代码来获得显着的性能,这些代码根据自己的需要进行了优化。

DBMS做它自己的缓存,所以不想通过O/S缓存工作。它“拥有”磁盘的补丁,所以它不需要担心与其他进程共享。

更新该论文的链接是一个帮助。

首先,这篇论文已经有将近30年的历史了,它指的是过时已久的硬件。尽管如此,它还是很有趣的读物。

首先,要了解磁盘i/o是一个分层的过程。那是在1981年,现在更是如此。在最低点,设备驱动程序将向硬件发出物理读/写指令。上面可能是o/s内核代码,然后是o/s用户空间代码,然后是应用程序。在C程序的fread()和磁头移动之间,至少有三到四个级别,甚至可能更多。DBMS可能会寻求提高性能,可能会绕过某些层,直接与内核对话,甚至更低。

我记得几年前在Sun机器上安装Oracle。它可以选择将磁盘专用为“原始”分区,Oracle将以自己的方式格式化磁盘,然后直接与设备驱动程序对话。操作系统根本无法访问磁盘。

票数 2
EN

Stack Overflow用户

发布于 2010-07-03 23:41:02

这主要是一个性能问题。dbms具有高度特定和不寻常的I/O需求。

OS可能有任意数量的进程执行I/O,并使用由此产生的各种缓存数据填充其缓冲区。

当然,还有大小和缓存内容的问题(与更通用的设备缓冲区缓存相比,dbms可能能够更好地满足其需求)。

还有一个问题是,一个通用的“块”实际上可能会造成比dbms理想情况下所能承受的I/O负担大得多的I/O负担(这取决于分区等);dbms自己的缓存可能会被调优,以便更好地与磁盘上的数据布局配合工作,从而能够最小化I/O。

另一件事是索引和类似的加速查询的方法的问题,当然,如果缓存首先真正知道这些意味着什么,那么它们的工作效果会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3171919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档