不错 这个问题的确要写十几页 我以前也研究过一些 就把以前的一些笔记粘贴一下 你有什么细节想要深入 可以我们再细聊当一个服务器进程需要读数据到buffer cache中时,首先必须判断该数据在buffer 中是否存在,如果存在且可用,则获取该数据,根据lru算法在lru list上移动该block...
显示全部不错 这个问题的确要写十几页 我以前也研究过一些 就把以前的一些笔记粘贴一下 你有什么细节想要深入 可以我们再细聊
当一个服务器进程需要读数据到buffer cache中时,首先必须判断该数据在buffer 中是否存在,
如果存在且可用,则获取该数据,根据lru算法在lru list上移动该block;如果buffer中不存在该数据,则需要从数据文件上获取
(
a. 如果相应的buffer被找到,则该buffer被移到LRU列表的MRU(most recently used)端,这个叫做逻辑读(logical read),因为实际没有I/O产生;
b.如果相应的buffer未被找到,则server process必须从数据文件里读取所需数据块
)
在读取数据之前,server进程需要扫描lru list 寻找free的buffer,
扫描过程中server进程会把发现的所有已经被修改过的buffer移动到checkpoint queue上,这些dirty buffer随后可以被写出到数据文件
如果checkpoint queue超过了阈值,server进程会通知dbwn去写出脏数据;这也是出发dbwr写的一个条件
如果server进程扫描lru超过一个阈值仍然不能找到足够的free buffer ,将停止寻找,转而通知dbwn去写出脏数据,释放空间
同时由于增量检查点的引入,dbwn进程也会主动扫描lru list,将发现的dirty buffer 移动至checkpoint queue,这个扫描也受到一个内部约束
收起