论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
数据库
›
Oracle
›
15445第一阶段笔记+Buffer Pool(2019)
15445第一阶段笔记+Buffer Pool(2019)
王海鱼
论坛元老
|
2022-9-17 08:35:29
|
显示全部楼层
|
阅读模式
楼主
主题
1021
|
帖子
1021
|
积分
3063
15445第一阶段笔记+Buffer Pool(2019)
概念
page与frame
块,页,是对同一概念的不同叫法,取决于场景不同。其表述的都是磁盘上某一柱面上的连续扇区(固定数目)。数据在磁盘和缓冲区(内存)之间传输,传输的单位就是块(页)。
内存区是以定长的页数组的形式组织的,其中每一个数组条目,被称为一个帧(frame)。当DBMS请求一个页时,被请求页的一份拷贝就被读取进其中一个帧中。
所以,page和frame实际是指的是同一个概念,buffer pool中的叫做帧,磁盘与内存之间的传输单位的叫做page或者block。
page table
是一个Page ID到Frame ID的映射。Page ID是磁盘页的属性,不同的磁盘页的Page ID不同,当磁盘页被读取进缓冲区时,该磁盘页会在缓冲区中有一个位置,即Frame ID。缓冲区是Frame的定长数组,一共只有buffer_pool_size大小的frame,所以,当磁盘页读进写出,会存在不同的磁盘页先后出现在同一个帧位置的情况,那么这个Page Table,就是保存当前页ID到帧ID的映射。
page directory
Page Directory中的每⼀个小格中包含有对应page所在位置,也包含它剩余空间信息。通过Page Directory可以将page映射到内存或者磁盘上的某个位置
存储结构
总的来说,数据库内部的存储结构可以总结为,Page Directory负责映射内存或者磁盘中的page,Page Table负责将page映射到buffer pool中的frame中。
而page内部的header和slot array来组织tuple存放。以下是page中的结构
tuple内部的结构也是header+data。
项目
一些注意的地方
clock_replacer
replacer是一个定长数组,但是clock_size不是定长,而是可以被victim的frame的总数,所以replacer实际上存放的是可以被替换的帧。clock_size初始为0。
clock_hand是遍历replacer的指针,只有Victim()函数可以修改clock_hand指针。
buffer_pool_manager
pages_是buffer pool的帧数组。
函数
clock_replacer
bool Victim(frame_id_t *frame_id)
1.进行循环遍历,扫描所有实际存在replacer中的帧,如果没有可替换帧,则返回false。
2.只查看实际在replacer中的帧,如果ref为1,则将ref修改为0,clock_hand++。如果ref为0,则将其标记为不在replacer中,clock_size--,并令*frame_id = clock_hand++,将该帧的frame_id传出去,返回true。
void Pin(frame_id_t frame_id)
将目标帧标记为不在replacer中,clock_size--。
void Unpin(frame_id_t frame_id)
将目标帧标记为在replacer中,clock_size++,同时将ref标记为true(clock_replacer中新添加帧的ref需标记为true)。
buffer_pool_manager
FetchPageImpl(page_id_t page_id)
0.首先用latch上锁
1.page_table_中是否存在page_id所对应的帧。如果存在,则直接返回所对应的帧,并需要进行pin操作;若没有则需要将磁盘中的page读取到buffer pool中,即读取到pages_中的一个帧的位置。
2.首先从free_list中寻找空闲帧,如果可以找到空闲帧,则go to 4;如果free_list为空,则调用replacer.Victim()获得可替换帧的victim_frame_id。若没有可替换帧,则返回nullptr。
3.检查victim_frame的脏读位,如果脏读位有效,则需要调用disk_manager_->WritePage()写回到磁盘中。
4.进行victim_frame数据的读取以及元数据的更新操作:
(1)清除victim_frame的页表中的记录。
(2)添加victim_frame的page_id到victim_frame_id的新映射。
(3)更新victim_frame(在pages_数组中)的page_id。
(4)进行victim_frame的pin操作,pin_count++,调用者加1,并调用replacer_->pin()方法。
(5)victim_frame的脏读位记为false。
(6)调用disk_manager_->ReadPage(page_id, pages_[victim_frame_id].data_),将page的数据读取到victim_frame中。
5.返回pages_中victim_frame的地址。
Page* NewPageImpl(page_id_t *page_id)
0.首先用latch上锁
1.首先从free_list中寻找空闲帧,如果可以找到空闲帧,则go to 3;如果free_list为空,则调用replacer.Victim()获得可用帧的victim_frame_id。若没有可用帧,则返回nullptr。
2.检查victim_frame的脏读位,如果脏读位有效,则需要调用disk_manager_->WritePage()写回到磁盘中。
3.调用disk_manager_->AllocatePage()分配一个新的页,记页ID为page_id,然后进行victim_frame数据的清除以及元数据的更新操作:
(1)清除victim_frame的页表中的记录。
(2)添加victim_frame的page_id到victim_frame_id的新映射。
(3)更新pages_数组中的victim_frame的page_id.
(4)记victim_frame的脏读位为false
(5)清空victim_frame中的数据
(6)设置victim_frame的pin_count=1
4.返回pages_中victim_frame的地址
bool DeletePageImpl(page_id_t page_id)
0.首先用latch上锁
1.在page_table_中查找page_id是否存在对应的frame_id,如果不存在,则直接go to 4。
2.若page_table_[frame_id].pin_count不为0,则返回false。
3.若目标帧的脏读位为true,则调用disk_manager_->WritePage()将其写回磁盘。
4.进行目标帧的重置操作:
(1)该目标帧不再进行replacer_->Victim()操作,所以调用replacer_->Pin(frame_id)。
(2)从page_table_中删除page_id的映射
(3)设置目标帧的pin_count=0,is_dirty_=false,data_清空,page_id=INVALID_PAGE_ID。
(4)加入free_list_中。
4.调用disk_manager_->DeallocatePage(page_id),返回true。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
王海鱼
论坛元老
这个人很懒什么都没写!
楼主热帖
在Winform开发中,使用Async-Awati异步 ...
Vue 和 Django 前后端分离实践 (注册 ...
如何在 Vue 3 中使用<script lang=“t ...
C#依赖注入(直白明了)讲解 一看就会系 ...
一条SQL的执行原理
go中 for循环的坑
Vulnhub之Monkeybox详细测试过程(不同 ...
教务管理系统——数据库课程设计mysql+ ...
【Django】DRF开发中的一些技巧记录 ...
银河麒麟V10安装达梦数据库DM8 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
MES
开源技术
SAP
IOS
数据仓库与分析
快速回复
返回顶部
返回列表