一个CBC latch管理多个bucket,根据hash找到bucket,不存在遍历完这个CBC latch的BH去下个CBC latch的现象
Buffer cache中hash bucket的数量由_db_block_hash_buckets参数设置。
宏观
1.根据要访问的文件号、块号,算出hash值
2.根据hash值找到hash bucket
3.根据每个hash bucket独有的一个 指向CBC链表(cache buffers cache chains list)的链表头(我愿称之为指针),找到对应的CBC链表
4.CBC链表就是一堆hash值相同的BH(buffer header)组成的,搜索CBC链表=遍历一个个BH
5.找到目标BH,提取其中的BA(buffer address),BA记录块在buffer cache中的地址
6.根据BA访问buffer(此处buffer指内存中的一个单位)
CBC链表
1.CBC链表是双向链表,互相指向,a互相b b互相a和c,等等,同个列表中的BH的hash值是一样的。
2.每个bucket都有一个CBC链表
3.每个BH大小相同
4.逐个比对BH中的文件号、块号,直到找到目标BH
更加微观一点
1.根据要访问的文件号、块号,算出hash值
2.根据hash值找到hash bucket
3.根据每个hash bucket独有的一个 指向CBC链表(cache buffers cache chains list)的链表头(我愿称之为指针),找到对应的CBC链表
4.从CBC链表的链表头——CBC链表,中间的CBC latch锁设成X模式(独占锁)
5.CBC链表就是一堆hash值相同的BH(buffer header)组成的,搜索CBC链表=遍历一个个BH
6.在CBC latch锁的独占保护下,找到想要的BH,此BH中的buffer pin锁从0转变为S(共享锁)
7.buffer pin锁修改完成,释放独占的CBC latch锁。
8.提取其中的BA(buffer address),BA记录着块在buffer cache中的地址
9.根据BA读取buffer中的数据(此处buffer指内存中的一个单位)
10.读完buffer数据后,buffer pin锁改为0
本文从Oracle内核技术揭秘_吕海波中理解