【CMU 15-445】Proj2 Hash Index

EXTENDIBLE HASH INDEX

  • 通關記錄
  • Task1 Read/Write Page Guards
    • 移動構造函數
    • `Drop`方法
    • 移動賦值運算符
    • 析構函數
    • `UpgradeRead`函數
    • `FetchPageBasic`、`FetchPageRead`、`FetchPageWrite`、`NewPageGuarded`
  • Task2 Extendible Hash Table Pages
    • `HeaderPage`
    • `DirectoryPage`
    • `BucketPage`
  • Task3 Extendible Hashing Implementation
  • Task4 Concurrency Control

CMU-15445匯總
本文對應的project版本為CMU-Fall-2023的project2
由于Andy要求,本博客只提供思路,不會公開任何代碼
本博客默認讀者已懂可擴展哈希的插入刪除理論知識,若不清楚流程可以看這篇博客

通關記錄

在這里插入圖片描述
在這里插入圖片描述
目前的rank還比較低,后續會優化下

Task1 Read/Write Page Guards

Task1要求實現三種PageGuard類,分別是BasicPageGuardReadPageGuardWritePageGuard。三種PageGuard類都使用RAII的思想保護Buffer Pool Manager的緩沖頁,防止用戶遺漏調用Unpin方法導致緩沖頁被固定無法驅逐,與智能指針相似,當PageGuard對象生命周期結束時,在析構函數中調用Unpin方法來確保釋放緩沖頁;進一步的,ReadPageGuardWritePageGuard還會保護緩存頁的讀寫一致性,且避免死鎖(若其他時候后忘記解鎖,則在析構時解鎖)。當然,PageGuard類也要對外提供方法用于手動釋放。實現Task1中的類會為后面Task3的可擴展哈希做鋪墊,后面用到的時候就知道多好用了。
三種類中的主要成員有:

  • BufferPoolManager *bpm_
  • Page *page_
  • bool is_dirty_

三種類中主要實現的方法有:

  • 三種PageGuard的移動構造函數、移動賦值運算符、Drop方法與析構函數
  • BasicPageGuard類中的UpgradeRead()函數和UpgradeWrite函數

在實現完三種PageGuard類中的方法后,我們需要使用這三種PageGuard,實現BufferPoolManager類中的FetchPageBasicFetchPageReadFetchPageWriteNewPageGuarded函數。

移動構造函數

移動構造函數的實現比較簡單,將參數中的成員復制到待構造對象,然后清空參數的所有成員即可。

Drop方法

Drop函數為對外提供的釋放頁接口,它需要做的事情就是調用一下BufferPoolManagerUnpinPage函數,將page_中維護的頁釋放(如果有的話);在ReadPageGuardWritePageGuard中,則還需要解鎖(讀鎖或寫鎖)

移動賦值運算符

移動賦值與移動構造差不多,不同點在于如果運算符左右兩邊的對象不同,需要將左邊對象維護的緩沖頁釋放掉,并解開讀鎖或寫鎖,再將右邊對象中的成員復制到左邊,最后情況右邊對象。

析構函數

調用Drop方法釋放頁并解鎖即可。

UpgradeRead函數

利用BasicPageGuard中的成員構造出一個ReadPageGuard,并加寫鎖返回即可。UpgradeWrite同理。

FetchPageBasicFetchPageReadFetchPageWriteNewPageGuarded

這幾個方法的實現都比較簡單,先調用bpm中對應的函數FetchPageNewPage,然后構造BasicPageGuard或者ReadPageGuard或者WritePageGuard返回即可。值得注意的是在返回后兩種之前需要先加RLatchWLatch

Task2 Extendible Hash Table Pages

Task2要求實現三種可擴展哈希中使用的數據結構,也就是三層結構中每一層的頁面布局。分別是HeaderPageDirectoryPageBucketPage,如下圖:
在這里插入圖片描述

HeaderPage

HeaderPage的成員包括第二層DirectoryPagePageId數組,以及一個位深度xPageId數組的大小為 2 x 2^x 2x,且使用哈希值的最高有效x位進行索引。如位深度為2,32位哈希值為0x5f129982,最高有效位前2位為01,則會被索引到01對應的DirectoryPage上。

DirectoryPage

DirectoryPage的成員包含第三層的BucketPagePageId數組,全局位深度global_depth和每一個Bucket的局部位深度local_depth數組,PageId數組的大小為 2 g l o b a l _ d e p t h 2^{global\_depth} 2global_depth,且使用哈希值的最低有效global_depth位進行索引。如全局位深度為2,32位哈希值為0x51129982,最低有效位后兩位為10,則會被索引到10對應的BucketPage上。

BucketPage

BucketPage的成員包含一個Key-Value數組,以及數組大小size。被索引到該Bucket的Key-Value會追加到該Bucket上進行存儲。

以上三個類的實現都比較簡單,跟著頭文件中的注釋實現就是了。值得注意的是DirectoryPageIncrGlobalDepth方法,在增加global_depth的同時還需要設置PageId數組中新增的PageId(具體見插入時的操作,見引言中的理論博客)

Task3 Extendible Hashing Implementation

Task3要求利用Task1和Task2中實現的類與方法,實現可擴展哈希類DiskExtendibleHashTable的方法,主要就是可擴展哈希的插入和刪除。
理論知識見引言中的理論博客,大致跟著理論實現就行,需要注意的細節有:

  • 不需要使用的PageGuard需要及時釋放,防止頁面緩沖池滿了
  • 關于插入,當Bucket滿了導致分裂,可能分裂后的重新分配仍會產生Bucket滿的情況,此時需要繼續分裂,直到可以正常插入新tuple,我的實現方法是遞歸,也可以循環實現。
  • 關于刪除,我刪除空白頁的方法是,每當刪除一條tuple后,檢查當前是否有空白的Bucket,如果有,判斷global_depth與該Bucketlocal_depth是否相等,相等則刪除,不相等則后續縮短DirectoryPage之后再考慮;刪除tuple導致的DirectoryPage縮短也需要循環的進行,直到無法再縮短為止。

Task4 Concurrency Control

Task4要求保證可擴展哈希的并發安全性,其實在Task3中如果FetchPageGuard和NewPageGuard使用正確的話,自然就保證并發安全性了,故不需要額外考慮這個Task。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212477.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

飛天使-linux操作的一些技巧與知識點5

文章目錄 roles批量替換文件 role 的依賴關系role 的實際案例 roles tasks 和 handlers ,那怎樣組織 playbook 才是最好的方式呢?簡 單的回答就是:使用 Roles Roles 基于一個已知的文件結構,去自動的加載 vars,tasks 以…

Python字典去重竟然比集合去重快速40多倍

這里寫目錄標題 對比代碼結果圖代碼解析 對比代碼 from glob import glob from tqdm import tqdm import time path_listglob("E:/sky_150b/任務組_20231207_2023/*.jsonl") # for two in tqdm(path_list): onepath_list[0]with open(one,"r",encoding&q…

【C++】POCO學習總結(十):Poco::Util::Application(應用程序框架)

【C】郭老二博文之:C目錄 1、Poco::Util::Application 應用框架 1.1 應用程序基本功能 Poco::Util::Application是POCO實現的的應用程序框架,支持功能如下: 命令行參數處理配置文件初始化和關機日志 1.2 命令行程序和守護進程 POCO支持…

Java架構師系統架構實現高內聚低耦合

目錄 1 導語2 邊界內聚耦合概述3 聚焦內聚4 關注耦合5 如何實現高內聚低耦合6 內聚耦合規劃不當的效果7 總結想學習架構師構建流程請跳轉:Java架構師系統架構設計 1 導語 架構設計的核心維度,從系統的擴展性、高性能、高可用、高安全性和伸縮性五個維度進行了探討,并介紹了…

【Docker】進階之路:(一)容器技術發展史

【Docker】進階之路:(一)容器技術發展史 什么是容器為什么需要容器容器技術的發展歷程Docker容器是如何工作的 什么是容器 容器作為一種先進的虛擬化技術,已然成為了云原生時代軟件開發和運維的標準基礎設施。在了解容器技術之前…

抖音本地生活服務商申請入口在哪里?具體流程是怎樣的?

不論是抖音的本地生活業務,還是后來的支付寶、視頻號的本地生活業務,因為市場體量足夠龐大,市場前景廣闊,一直很受各大創業者的追捧。那么,如此火熱的本地生活項目,想要申請成為服務商,具體的申…

列表標簽的介紹與使用

列表的作用&#xff1a; 整齊、整潔、有序&#xff0c;它作為布局會更加自由和方便。 根據使用情景不同&#xff0c;列表可以分為三大類&#xff1a;無序列表、有序列表和自定義列表 無序列表 <ul> 標簽表示 HTML 頁面中項目的無序列表&#xff0c;一般會以項目符號呈…

深入了解linux下網卡防火墻selinux

深入了解linux下網卡防火墻selinux 在Linux系統中&#xff0c;網絡安全是非常重要的。為了保護系統免受惡意攻擊和未經授權的訪問&#xff0c;我們可以使用防火墻來限制網絡流量。而在Linux下&#xff0c;我們可以使用SELinux&#xff08;Security-Enhanced Linux&#xff09;…

Java調試技巧之垃圾回收機制解析

Java作為一種高級編程語言&#xff0c;以其跨平臺、面向對象、自動內存管理等特性而廣受開發者的喜愛。其中&#xff0c;自動內存管理是Java的一大亮點&#xff0c;通過垃圾回收機制實現對內存的自動分配和釋放&#xff0c;極大地簡化了開發者的工作。本文將深入探討Java的垃圾…

mysql數據庫文件丟失恢復---惜分飛

客戶服務器重啟,mysql相關數據文件丟失 通過底層工具進行分析,無法正確恢復數據庫名字,一個個單個ibd文件(而且很多本身是錯誤的) 對于這種情況,通過mysql block掃描恢復出來page文件 恢復出來客戶需要數據 這個客戶出現該故障的原因大概率是由于文件系統損壞導致.最終…

C語言進階之路-數據結構篇

目錄 一、學習目標 二、數據結構 1.基本概念 線性關系&#xff1a; 非線性關系&#xff1a; 存儲形式 2. 算法分析 2.1 時間復雜度 2.2 空間復雜度 2.3 時空復雜度互換 總結 一、學習目標 了解數據結構的基本概念了解算法的分析方法 二、數據結構 1.基本概念 數據結…

測試bug分析

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 例如&#xff1a;項目場景&#xff1a;示例:通過藍牙芯片(HC-05)與手機 APP 通信&#xff0c;每隔 5s 傳輸一批傳感器數據(不是很大) 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1…

Nacos源碼解讀11——客戶端怎么讀取最新的配置信息

項目啟動怎么讀取的配置信息 自動裝配 SpringBoot 自動裝配機制 加載 WEB/INF spring.factories 會將如下幾個Bean加載到ioc 容器中 BeanConditionalOnMissingBeanpublic NacosConfigProperties nacosConfigProperties() {return new NacosConfigProperties();}BeanCondition…

【算法Hot100系列】兩數之和

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

【rabbitMQ】模擬work queue,實現單個隊列綁定多個消費者

上一篇&#xff1a; springboot整合rabbitMQ模擬簡單收發消息 https://blog.csdn.net/m0_67930426/article/details/134904766?spm1001.2014.3001.5502 在這篇文章的基礎上進行操作 基本思路&#xff1a; 1.在rabbitMQ控制臺創建一個新的隊列 2.在publisher服務中定義一個…

MySQL中的數據類型

MySQL中的數據類型 大家好&#xff0c;我是微賺淘客系統的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討MySQL中的數據類型&#xff0c;這是數據庫設計中至關重要的一部分。數據庫作為程序的底層支持&#xff0c;數據類型的選擇…

[python]利用whl輪子文件python3.12安裝talib

ta-lib目前很多人使用&#xff0c;網上也有很多人下載whl文件直接pip安裝即可&#xff0c;但是最新版本3.12沒有出來&#xff0c;因此本人獨家制作python 3.12版本whl文件&#xff0c;從源碼開始編譯生成。TA-Lib-0.4.28-cp312-cp312-win-amd64.whl &#xff0c;注意這個whl文件…

Java 多線程下的單例模式

單例對象&#xff08;Singleton&#xff09;是一種常用的設計模式。在Java應用中&#xff0c;單例對象能保證在一個JVM中&#xff0c;該對象只有一個實例存在。正是由于這個特 點&#xff0c;單例對象通常作為程序中的存放配置信息的載體&#xff0c;因為它能保證其他對象讀到一…

JWT的原理

在談及jwt原理前,我們其實對jwt并不陌生,對于有經驗的碼農,大都聽過或者實踐過,對于一些初學者,凡是談及安全方面的問題,總是覺得很復雜,感覺不是自己能搞得懂得,但其實無非也是加密解密的過程,不要想的太復雜,我們先說一說JWT在生產上的應用 JWT在生產上的應用 傳遞用戶身份信…

Android系統中使用Cunit測試C/C++接口

Android系統中使用Cunit測試C/C接口 Cunit是C/C語言的單元測試框架&#xff0c;但常用于Windows和Linux開發中。 Android系統中經常有jni、so庫、hal service等都是C/C實現&#xff0c;本文講解如何將Cunit嵌入Android中&#xff0c;用于測試一些C/C api。 Cunit簡介 Cunit是很…