cmu15-445 Project #1-Buffer Pool

2024-03-11 06:32
文章标签 buffer cmu15 445 project pool

本文主要是介绍cmu15-445 Project #1-Buffer Pool,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TASK #1 - CLOCK REPLACEMENT POLICY

实现src/buffer/clock_replacer.cpp中的函数:
  • Victim(): 使用时钟算法淘汰一个frame,从时钟的指针指向的地方开始,找出第一个ref=0的frame。如果所指向的frame的ref=1,那么将其ref置为0。然后更新clock hand
  • Pin():
    在一个页面被pin的时候调用,将对应的frame直接移出clock_replacer
  • Unpin():
    在page的pin_count_为0的时候调用,将frame插入clock_replacer。
  • Size()
    返回clock_replacer中frame的数量。

TASK #2 - BUFFER POOL MANAGER

Task2为实现db中的BufferPoolManager,BufferPoolManager负责将Disk中的页面抓取到内存中。另外BufferPoolManager还负责将脏页写回disk,这种情况由主动调用还有淘汰一个页面时触发。
内存中的页面都使用Page对象来表示,每一个Page都存储了对应 disk位置中一个block的内容。需要注意的时在BufferPoolManager中会重用Page对象,同一个Page可能是多个disk区域的映射,Page使用page_id来记录该Page包含哪一个物理页面,如果一个Page对象中不包含物理页面,那么page_id应被设为INVALID_PAGE_ID。
每一个Page对象都会维护一个计数器来记录有多少个线程pin住该页。BufferPoolManager不允许一个Pinned Page被释放掉。Page对象中还记录了对应的页面是否为脏页,在实验中需要实现一个页面变为Unpinned之前该页是否被修改过。

实现src/buffer/buffer_pool_manager.cpp中的函数:
  • FetchPageImpl(page_id)
    将page_id对应的页面加载到内存,如果page_table_中已经存在对应的页面,那么证明该页面已经加载到内存,将Page的pin_count_增加1后直接返回。如果page_table_中没有相关的item,那么要从free_list_或者replacer中找出一个页来作为对应页面的缓存。free_list中存储的时frame_id_t,可以通过pages_[frame_id]来访问对应的Page。查看free_list是否有可用页面,如果有则将队首的页面pop出来。删除page_table_中的过期的映射关系,如果获取的页面为脏页,那么需要将frame中的内容写回硬盘。然后更新Page的metadata,包括将is_dirty设为false,将page_id设为新的page_id,将pin_count_设为1。最后将page_id从硬盘加载到Page上。

  • NewPageImpl(page_id)
    在buffer pool中创建一个新页,page_id通过disk_manager->AllocatePage获取,为全新的page_id。类似于FechPageImpl,从free_list_或者replacer中获取可用的frame,删除page_table_中的过期的映射关系,如果frame对应的Page为脏页需要将Page的data写回硬盘。在page_table_中建立page_id和frame_id_t的映射,更新Page的metadata,其中包括将is_dirty设为false,将page_id设为新的page_id,将pin_count_设为1,将memory reset掉。

  • UnpinPageImpl(page_id, is_dirty)
    upin一个page意味着有一个用户结束了对page_id对应Page的使用,如果pin_count_ <= 0,直接返回false。否则pin_count减1,减1后如果pin_count_为0,那么将对应frame放入replacer中,最后返回true。

  • FlushPageImpl(page_id)
    将page_id对应的Page中的data写回硬盘

  • DeletePageImpl(page_id)
    从buffer pool中回收一个页面到free_list_,如果page_table_中不存在对应的映射,直接返回true。如果page_table中存在对应的页面,且该页面的pin_count_不为0,返回false。如果pin_count_为0,删除page_table_中对应的item,将对应的frame放回free_list_。

  • FlushAllPagesImpl()
    将buffer pool中所有的页面都写回硬盘

这篇关于cmu15-445 Project #1-Buffer Pool的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796950

相关文章

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

Java 文件读写最好是用buffer对于大文件可以加快速度

参考例子: FileReader fileReader = new FileReader(filename);BufferedReader bufferedReader = new BufferedReader(fileReader);List<String> lines = new ArrayList<String>();String line = null;while ((line =

【Node】Buffer 与 Stream

node 为什么会出现 Buffer 这个模块 在最初的时候,JavaScript 只运行在浏览器端, 对于处理 Unicode 编码的字符串很容易,但是对于处理二进制以及非 Unicode 编码的数据便无能为力。 不过对于 Server 端操作来说 网络I/O 以及 文件I/O 的处理是必须的,所以 Node 中便提供了 Buffer 类处理二进制的数据。 二进制缓冲区 Buffer

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

SVN Cornerstone 报错信息 xcodeproj cannot be opened because the project file cannot be parsed.

svn点击update 之后,打开xcode工程文件,会出现  xxx..xcodeproj  cannot be opened because the project file cannot be parsed. 发现项目中代码全没了。只有一个空的工程名字,因为xcodeproj工程文件冲突了,然后就是svn强制给你更新了,内部的文件冲突了,你们改了同样的地方的一段代码,可能是你们只是多加

python测试开发基础---multiprocessing.Pool

1. 基础概念 多进程编程:Python中的multiprocessing模块允许你使用多个进程并行执行任务,这可以提高程序的性能,尤其是在需要大量计算的情况下。Pool类是一个常用工具,可以帮助你更轻松地管理多个进程。 进程池:进程池是一个包含多个工作进程的池子,用来处理多个任务。你可以将任务分配给池中的进程,池会自动管理这些进程。 2. 使用方法 以下是multiprocessing.

【python 多进程传参】pool.map() 函数传多参数

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。人工智能教程 一、背景介绍 相信很多人都用过,pool.map()函数,这个函数,有两个参数可以传,第一个参数传的是函数,第二个参数传的是数据列表。 那么怎么在第二个数据列表,多传几个参数呢,方法是通过对有多个参数的方法进行封装

Vulkan描述符、描述符Pool、Layout概念

1、DescriptorSetLayout为了组织和管理着色器资源(如缓冲区、纹理、采样器等),多个相同类型的Descriptor放在一个Layout中以优化GPU对资源的访问   //DescriptorSetLayout定义了哪些描述符Descriptor类型(Buffers、Textures、Samplers)可以包含在其中 VkDescriptorSetLayoutBinding

Android Studio打开Modem模块出现:The project ‘***‘ is not a Gradle-based project

花了挺长时间处理该问题,特记录如下:1.背景: 在Android studio 下导入一个新增的modem模块,如MPSS.DE.3.1.1\modem_proc\AAA, 目的是看代码方便一些,可以自由搜索各种关键字。但导入该项目时出现了如下错误: The project '***' is not a Gradle-based project.造成的问题: (1) project 下没有代码,而