【发布时间】:2013-01-03 06:40:18
【问题描述】:
我正在尝试基于 Lehman 和 Yao 在 this paper 中建议的数据结构(Blink 树)和算法来实现数据库索引。在第 2 页中,作者声明:
磁盘被划分为固定大小的部分(物理页;在本文中,这些对应于树的节点)。 这些是进程唯一可以读取或写入的单元。 [强调我的] (...)
(...) 允许进程锁定和解锁磁盘页面。该锁赋予该进程对该页面的独占修改权限;此外,进程必须锁定页面才能修改该页面。 (...) 锁不会阻止其他进程读取锁定的页面。 [强调我的]
我不完全确定我的解释是否正确(我不习惯阅读学术论文),但我认为可以从强调的句子中得出结论,作者的意思是读取和写入页面的操作被假定为“原子”,从某种意义上说,如果进程 A 已经开始读取(相应地写入)页面,则另一个进程 B 可能不会开始写入(相应地读取)同一页面,直到 A 完成执行其读取(相应地)。写)操作。多个进程同时读取同一个页面当然是合法的条件,因为多个进程同时在完全不同的页面上执行任意操作(页面 P 上的进程 A,页面 Q 上的进程 B,页面 R 上的进程 C 等)也是如此。 )。
我的解释正确吗?
我可以假设 POSIX 的
read()和write()系统调用在上述意义上是“原子的”吗?我是否可以依靠这些具有一些内部逻辑的系统调用来确定是否应该根据文件描述符的位置和要读取或写入的块的指定大小来临时阻止特定的read()或write()调用?如果上述问题的答案是“否”,我应该如何推出自己的锁定机制?
【问题讨论】:
标签: concurrency posix b-tree database-indexes