網(wǎng)站制作NEWS
CMU15445學習經(jīng)驗(附簡單的b+樹優(yōu)化策略)
在學習CMU15445這門課程時,我總結(jié)了一些個人經(jīng)驗,希望能對后來者有所幫助。這門課程的學習建議如下:
建議在學習操作系統(tǒng)之后再來學習這門課程。CMU自己提供的預置課程應該是15-213。如果你僅是完成實驗,可能不需要了解操作系統(tǒng)知識,但在課程前半期,課堂上會多次涉及操作系統(tǒng)相關(guān)討論。如果你追求深入理解,不懂操作系統(tǒng)可能在上課時感到困難。
課程實驗部分使用C++語言。我建議在開始實驗前,花大約5天時間學習北大郭煒老師的C++課程,特別是其中關(guān)于面向?qū)ο缶幊毯椭悄苤羔樀牟糠?。這門課程內(nèi)容深入,適合有一定C語言基礎(chǔ)的學員。此外,推薦使用learncpp網(wǎng)站的教程和文檔cppreference進行輔助學習。
對于英文水平較弱的學員,建議在B站查找漢化版課程視頻。主講老師根據(jù)CMU的課件自己講解,講得較好。雖然官方部分課程由學生講解,質(zhì)量參差不齊,但觀看課程視頻仍然是必不可少的。
課程總結(jié)方面,建議參考andy在課程網(wǎng)站提供的notes,內(nèi)容詳實,基本覆蓋了課堂講解。國內(nèi)也有相關(guān)總結(jié),自行查找即可。這些總結(jié)通常停留在課程notes和ppt層面,未涉及個人思考或疑問,僅作為英文水平不夠時的輔助材料。
實驗部分,強烈推薦學習智能指針的相關(guān)知識。我建議在完成實驗前,先閱讀learncpp上智能指針章節(jié),內(nèi)容詳盡,從基礎(chǔ)到進階,解釋了智能指針的必要性及使用方法。此外,參考cnblogs上的一篇帖子,該文提供了寶貴見解。
在實驗P0(2020年智能指針)中,我推薦學習Learncpp網(wǎng)站的智能指針章節(jié)。它從基礎(chǔ)開始,逐步深入,解釋了為何我們需要智能指針及基本用法。建議在完成實驗時,花費時間學習智能指針部分。
實驗P1(bufferPool)內(nèi)容相對簡單,多數(shù)學生采用哈希表+雙向鏈表策略。實現(xiàn)時可參考innodb中bufferPool的策略,特別是區(qū)分新代和老代的部分。盡管無法實現(xiàn)簡單的預讀策略,但理解bufferPool的實現(xiàn)有助于深入理解課程內(nèi)容。
實驗P2(b+tree)是課程的難點之一。遇到的主要問題是b+樹頁面讀寫鎖與bufferpool頁面鎖之間的原子性問題。解決這一問題時,我引入了一個is_delete_標志位,用于檢測頁面刪除操作,確保原子性。
實驗P2的檢測與調(diào)試部分,我提出了幾種檢測方法,包括檢測page溢出、b_node內(nèi)部檢測、assert使用、bufferPool檢查以及多線程調(diào)試技巧。這些方法有助于確保代碼正確性和性能優(yōu)化。
實驗P3(execution)部分關(guān)注于查詢執(zhí)行計劃的生成,提供了一種理解tuple、page、table物理組織方式及Schema相關(guān)類交互關(guān)系的途徑。這部分內(nèi)容看似復雜,實際理解后有助于掌握SQL查詢優(yōu)化的原理。
實驗P4(lock_manager)相對簡單,主要涉及鎖管理機制,遵循課程指導完成即可。
課程中最重要的部分之一是實驗P2的b+tree優(yōu)化。我通過引入樂觀策略和改進bufferPool實現(xiàn),將實驗耗時從4.3s降低到2.1s。樂觀策略通過更直接的鎖申請和釋放,提高了并發(fā)性能。同時,改進bufferPool實現(xiàn),將index頁的pin_count設(shè)置為2,避免頻繁置換,顯著提高了性能。
多重隨機標簽