以“页面”为单位写入磁盘

时间:2011-06-21 16:42:22

标签: database-design file-io

最近,我一直在阅读数据库管理系统(Raghu Ramakrishnan和Johannes Gehrke)。它说,磁盘空间管理器负责以页面为单位进行分配/解除分配/读/写操作,以确保在一个磁头读/写中进行最大量的数据操作,以最大限度地减少时间。现在要实现,比如一个函数,写一个页面到磁盘,我可以这样做: -

1 - 将n个字节的数据写入内存中的缓冲区,其中n是页面大小

2 - 使用C ++(ofstream)中的简单文件I / O操作将此缓冲区写入文件。

我的问题是,这些n个字节是否会成功写入磁盘上的单个页面,或者在使用此过程时会有其他失真,这会阻止缓冲区作为单个页面的数据写入磁盘,尽管其大小等于页面大小。如果它不会被写成一个页面,我必须采用什么方法?非常感谢!

1 个答案:

答案 0 :(得分:0)

通常,数据库系统会使用直接I / O将内存中的页面持久保存到磁盘。数据库系统可以通过直接I / O控制,估计和优化磁盘写入,而不是由OS或缓冲库缓冲。

您可以通过以下链接引用OS的系统调用:

  1. UNIX-Like: open(2):查看 O_DIRECT 标志
  2. Windows: CreateFile:查看 FILE_FLAG_WRITE_THROUGH
  3. 即使缓冲的I / O库具有 flush()方法,操作系统也不能保证在调用flush()时数据会以正确的方式保留在磁盘上。