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