User/Bigtooth123
2026 年 Linux 核心設計課程自我評量
姓名:洪英豪
GitHub 帳號:Bigtooth123
成果發表與貢獻
6
在從 CPU cache coherence 談 Linux spinlock 可擴展能力議題當中修正分號問題
作業
9
從這些作業當中我獲得了以下收穫: 1. 更加深入的理解 C 語言指標運用技巧 2. 撰寫效能測試程式碼,並熟悉使用 perf 等工具來分析程式效能 3. 學習了很多 Linux kernel 相關議題,像是 linked list 操作與排序, hash table, 記憶體機制, syscall 完整流程以及 Linux 核心檔案 I/O 機制等等 4. 查閱第一手資料,比如直接看 Linux manual page 5. 實作這些作業後,重新統整並複習了作業系統跟計算機組織的概念,包括了像是浮點數, 記憶體快取架構與 page table 等等
期末專題
8
本期末專題著重於從硬體微架構與快取一致性(Cache Coherence)的視角,分析、建模並量化 Linux 中的同步機制。專案中我完成了下列幾項工作:
- 建構馬可夫鏈模型:建立基於 \(M/M/c\) 的排隊模型,推導出 Ticket Spinlock 與 MCS Spinlock 在不同排隊人數下的微觀狀態機率分佈(\(P_k\))與期望吞吐量公式。
- Userspace 競爭模擬與低開銷量化:使用 C11 原子操作在使用者空間實作 Ticket Lock 與 MCS Lock。為避免全域計數器破壞 MCS 的區域自旋優勢,透過 64-byte 快取行對齊(Padding)消除偽共享(False Sharing),並設計低頻率抽樣機制(SAMPLE_RATE = 1000)進行動態量化。
- 帶入微觀物理時間常數驗證模型:在模型中帶入與硬體環境對齊的物理參數(臨界區時間 \(E = 10\text{ ns}\) 對應 50 次空迴圈、快取交接成本 \(c = 50\text{ ns}\)、包含 x86 LOCK XCHG 原子指令開銷的到達時間 \(T_{\text{arrive}} = 50\text{ ns}\)),使理論吞吐量與狀態分佈曲線與實測趨勢高度吻合。
除以上成果外,我也深入分析了實驗中呈現的硬體運作邏輯。在狀態分佈對比中,Ticket Lock 的狀態高度集中在全員排隊(\(P_8\)),驗證了其釋放鎖時的循序點對點單播(Unicast)更新會帶來 \(O(N)\) 的延遲堆積;而 MCS Lock 則能有效將分佈往排隊人數較少的狀態推移。此外,實驗也解讀了效能在核心數 \(N=2\) 時達到巔峰後下滑的物理本質:當核心處於自旋時,快取作廢訊息將引發大量延遲。
觀摩同儕專題並提問
- andy20040: Linux 核心設計專題: 以 Weak AVL Tree 取代 rbtree
- CharlieZhangXY: 回顧作業
- illdoCc: Linux 核心專題: RCU
- jeremylu0830: Linux 核心設計專題: 異質多核通訊機制
- Stanley0915: Linux 核心設計專題: 測量系統資源開銷並改善
與授課教師的互動
8
- 第十週課堂問答(4/28)
- 討論Thread 間如何保護共享記憶體,發現自己對於 mutex, semophore, spinlock 概念不清楚。
- 第十八周課堂問答(6/23)
- 被問到第十六周考試的內容 SPSC。
- 線上一對一討論(5/27)
- 在一對一討論時被問到平方根相關問題,但是發現對於這些教材不熟習,結束討論我後把內容紀錄在 5/27 一對一討論
- 誠實面對自己
所見所聞所感
10
在選修 Linux 核心設計之前,就曾耳聞這堂課內容極多極廣,需要花費非常多的時間,因此在我大三的時候不敢選修這堂課,一直到了大四最後一學期,我才下定決心為了自己拼一把。
還記得第一個禮拜看到作業一後,我真的受到了強烈的衝擊,作業內容超級多,老師說需要每週付出 20 小時的時間,我覺得如果要完整完成要花的時間絕對超過 20 小時,為了能夠灌雙系統我甚至去買了 SSD ,還剛好碰上持續的價格上漲。
接下來的學習過程真的是既扎實又充滿挑戰,同時又非常特別,老師上課會隨機點人來回答問題,也要求要約一對一討論,都一再的讓我們面對自己的不足。更重要的是,這堂課不允許我們僅停留在概念層面,而是必須探究現實世界中系統的真實運作。在撰寫作業的過程中,我的學習方式也產生了改變,從最初遇到問題單純依賴 ChatGPT,到後來學會親自翻閱、追蹤 Linux Kernel 的原始碼,我對系統核心也變得越來越熟悉。
回顧這段學習過程,從前四次作業中學到了許多知識。在實作面上,我不僅深入掌握了 C 語言指標的進階運用,更學會了如何撰寫效能測試程式碼,並運用 perf 揪出系統效能瓶頸。在系統機制上,我研究了 Linked list 與 Hash table 的底層實作、記憶體管理、Syscall ,以及核心檔案 I/O 機制,我還重新重新複習了浮點數底層表示、記憶體快取架構與 Page table 是如何影響程式運作。而在最後的專題上,我理解了在 smp 架構上所面對的多核競爭問題,而為了解決這些同步與記憶體順序議題,必須引入 memory barrier 甚至 atomic 操作。
最後,在看了〈因為自動飲料機而延畢的那一年〉後,我對作者說的一句話深有感觸:「但這是他媽的真實的人生,熱血毫無用武之地」,我在寫作業跟專題的時候,常常沒有做好規劃,就投入到實做當中,急迫的想要趕快看到結果,但是往往會因為流程或模型沒有想清楚,導致又要整個實驗重作。這讓我深刻體會到,真實世界的工程開發靠的不是一時的衝動與熱血,唯有周全的實驗設計、嚴謹的邏輯推演與耐心的除錯,才能確保實作走在正確的軌道上。
分數計算
\(GEOMEAN=(6 \times 9 \times 8 \times 8 \times 10)^{1/5}=8.085\)
選擇方案 B :\(1+floor(GEOMEAN)=1+8=9\)
