首页 > 其他分享 >[15-445]Memory Management + Buffer Cache memo

[15-445]Memory Management + Buffer Cache memo

时间:2022-11-12 01:34:00浏览次数:50  
标签:Management 15 Buffer 可以 buffer 缓存 数据 page pool

这一章节的重点在 buffer pool manager 

 

buffer pool manager

这一章学完我感觉我才理解了,其实我在数据库里拿到所有的数据似乎都过了一次内存。而内存有自己的算法和策略可以尽量帮我缓存我会多次访问的数据。

 

访问数据的流程大概类似于 execution engine 执行了一条 query, 告诉 buffer pool 要获取的数据页,buffer pool 将调用系统函数帮助 execution engine 去查询 disk 的数据,访问 disk 上的数据字典找到对应的 page position and offset。取出该数据然后加载到 buffer pool 中。

最后我们将指向 buffer pool 的地址指针返回给 execution engine。即可让 application layer 操作该数据了。

从底层来看 buffer pool 就是 DBMS 划定的一块内存空间。在我进场使用的 MySQL 中,他几乎可以分配到数据库内存的80%以上以加快数据获取。

 

buffer pool 可以是一个固定元素大小的 array。比如 MySQL 里面规定 page size 16kb,那么 buffer pool 中的页大小就是 16kb。array 中的元素我们称之为 frame。frame 里面可以存储的是从硬盘 page 页中拷贝出来的数据。

 

ok 那么有一个套娃的问题来了,我怎么知道 page1 page2 page3 4 5 6 7 在 buffer pool 里面的哪个位置呢?因为 frame 只是存储了 page 而已。PageTable 用于解决这个问题, PageTable 可以 route pageID to buffer pool and return the point.

同时 PageTable 可能还存储了一些别的有用的 metadata 针对每个 page。比如当前是否已经是脏页或者被引用次数或者是否需要将该 page 固定之类的,引用次数也许后续可以被用来测算是否需要将该数据 evict from buffer pool. Pin 可以帮助我们让 dbms 知道不要将这个 page evict out from buffer pool。这里还有一个叫做 latch 的能力不知道中文应该叫什么。

latch 和 pin 还不太一样。latch 是避免多线程或者线程程序使用已经预定的 buffer pool 的这个位置。因为我已经即将要去获取 bufferpool 的某个页地址了。我要预防其他人也同时去使用这个地址。

而 pin 却是预防我在使用过程中被人换走了这个 page。如果我在使用,我希望他一直呆在 bufferpool 中直到我使用完毕。

 

 

这里我们谈到的 latch 有点锁的感觉,但是却不是 locks。所以课程又强调了一次 Locks 和 latches 的区别

简单总结一点就是,Latch 在 dbms 的世界中更像是一把保护各种静态条件的锁,比较底层。 Locks 要做的世界是锁住逻辑,保护事务正常进行,如果失败还需要回滚操作。

 

PageTable 和 PageDictionary 的关系就更简单一点不赘述了看 slices 记住就行。

 

Buffer Pool Optimizations

MULTIPLE BUFFER POOLS

 

使用多个 buffer pool 实例有两种方案可以实现。将数据分配进不同的 buffer pool 可以显著降低锁竞争的问题。大家互相读取锁定对应数据,和占用空间,互不干扰。

也可以更少的出现竞态条件。

 

PRE-FETCHING

预读一些记录到 buffer pool 中。比如我读了 page 1 2 3 那大概率我在执行一个 scan 操作,我们应该将 4 5 6 也提前读进来加快结果返回的速度。

 

SCAN-SHARING

如果一个查询已经扫描了整张表,然而其他查询也想做类似的事情。DBMS 将会将第二个查询的 cusor attach 到 第一个查询的 cursor 上。这里主要是解决一个数据获取效率的问题,因为和 cursor1 一起读,会直接享受到 buffer pool 里面的数据,直接从内存里面获取这些数据。等跟着 cursor2 读完了自己再回去补上没有读到的部分就可以了。这样我们可以充分重复利用 cursor1 读进 buffer pool 的数据。

 

BUFFER POOL BYPASS

有一些特殊的执行可以选择绕开 buffer pool 以避免影响其缓存策略。

 

OS PAGE CACHE

类似像 postgrelSQL 这样的数据库可以有效的利用系统页缓存。

 

BUFFER REPLACEMENT POLICIES

下面就是核心了,谈了这么多,那么该使用什么策略去决定缓存什么数据,缓存多久。又什么时候逐出数据呢?取决于我们使用什么 replacement 的算法。

 

 

 

 

 

 

 

 

 

 

 

Reference:

https://www.youtube.com/watch?v=Y9H2HaRKOIw

https://15445.courses.cs.cmu.edu/fall2022/slides/06-bufferpool.pdf

https://zhuanlan.zhihu.com/p/65811829

 

标签:Management,15,Buffer,可以,buffer,缓存,数据,page,pool
From: https://www.cnblogs.com/piperck/p/16882556.html

相关文章

  • altera 1588 test system
    https://www.intel.com/content/www/us/en/docs/programmable/683410/current/system-modules.html 1.4.1.SystemModulesBelowarethemodulesavailableinthe......
  • P1587 [NOI2016] 循环之美 题解
    P1587[NOI2016]循环之美这道题我推到后面推不下去了,最后还是看了题解。还是切不了这种题唉。前置知识:杜教筛开始时看不出什么,我们先用经验和手玩来找一下规律。我们......
  • day15-Servlet04
    Servlet0412.ServletConfig12.1ServletConfig基本介绍ServletConfig类是为Servlet程序配置信息的类Servlet对象和ServletConfig对象都是由Tomcat负责创建Servlet对象......
  • inux系统常用的150个命令/开发 运维 测试 安全
     线上查询命令和帮助2个man查看命令帮助命令的词典 help查看内置命令的帮助文件和目录18个ls-a-l查看目录的内容及属性 cd.当前目录..上级目录/根目......
  • CodeForces - 1156D 0-1-Tree
    题意:给出一棵树,树的边权只有0和1。求有多少有序点对,其最短路径上每条权值为0的边不紧跟在权值为1的边后面。解:合法路径如下所示:000000 111111 000111 随便找个结点为......
  • [欧拉函数] P2158 [SDOI2008] 仪仗队
    题目描述作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N\timesNN×N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所......
  • 【MySQL(三)】buffer pool相关
    bufferpool是一种减少磁盘io读的机制,原理是将访问过的磁盘数据暂留在内存中,这样下次访问相同的数据就不需要读磁盘了。这个思想在平时的开发中,也经常用到,比如我们通常会在......
  • ABC154F
    考虑容斥,拆成四部分,每部分都形如\[\sum_{i=0}^n\sum_{j=0}^mf(i,j)\]其中\(f(i,j)\)表示从\((0,0)\)走到\((i,j)\)的方案数,显然为\(\dbinom{i+j}{i}\)。而\[\su......
  • 在四边形ABCD中,AB=AC,DB平分∠ADC,∠BCD=150°。求∠ABD的度数?
    2022年11月10日22点33分END......
  • 第六章15
    【题目描述】你知道吗?在外国,如果你不修剪你的花圃,是要被贴罚单的。Xman忙于战斗,被贴了好多罚单。这一次好不容易休息了,他决定修剪一下。修剪成什么样子呢?当然是X形。Xman......