Oracle buffer cache

Buffer Cache

 

timg

                   buffer cache 结构图

HASH链

        ORACLE使用HASH算法,把buffer cache中每个buffer的buffer header串联起来,组成多条hash chain,一條hash chain由一個hash Bucket管理,hash bucket就是链的链头,从链头引出独立的双向链。一個hash buffer chains latch来保护多个hash chain

         1,每个buffer都有buffer header,buffer header指向具体的buffer

         2,hash链是双向链,串联的是buffer header

         3,先找到hash Bucket,然后扫描链上的buffer header,再定位到具体buffer

LRU链(LRU LRU-W LRU-AUX)

       根据LRU(Least Recently User)算法,对buffer cache进行分配和换出(age out)管理

在buffer header有一个控制结构叫TCH(touch count访问技术器),记录buffer被访问的次数,当达到某个阈值(_db_aging_hot_criteria决定),就标识为Hot块,

注意不是每次被访问都计数,而是大约3s一次,X$BH表记录buffer相关的信息。另外,过段时间,oracle也会“冷却”Hot块,过段时间会让TCH计数递减。

当我们需要分配一个buffer的时候,总是从LRU链冷端开始搜索,热块也可能处在冷端,扫描到标识为热块的就跳过。

新数据写入buffer的时候,先去LRU链找到一个Clean的buffer,写入数据,然后重新挂到LRU链上,挂的位置由_db_percent_hot_default决定,默认50%,即LRU链接近中间的位置

LRU list(replacement list)从该链查找可重用的buffer

LRU-W list(write list)脏数据链,DBWR通过该链批量刷新到磁盘

LRU-AUX list(LRU链的子链)LRU-w链写盘后首先挂到LRU-AUX链,分配的时候先找该链,找不到再去LRU链

LRU-P list  这条链上的buffer 都存在一定的锁或者被其他会话PIN住

posted @ 2016-09-22 10:29  guilingyang  阅读(615)  评论(0编辑  收藏  举报