版本 0319f297f6a6fcd6441bf470dfcd6dcf94997b4e
yy214123 (陳柏儒)
簡介
2025 Linux 核心設計 自我評量
1.成果發表和貢獻:
《Demystifying the Linux CPU Scheduler》
已收錄之 pull requests: #252, #254, #255, #256, #257, #258, #260, #261, #262, #263, #264, #270, #272, #287,其中包含了文法錯字修正、實驗目錄路徑修正、外部參考專案版本更新。
在寫作業的過程中,首先是發現註解與實際程式行為不符,於是著手修改。修改後我思考到了 locality 的議題,所以針對了井字遊戲的勝利判斷方式提出修改,使其以 row-major 優先掃描,並輔以實驗結果來說服專案維護者。
這是我第一個非僅修改註解的貢獻,過程中我清楚了解到,為甚麼授課老師說溝通這麼重要。負責 reviewed 我這次提交的是 Linux 核心 min-heap 子系統的 maintainer,我見識到了其對於細節的要求,並沒有因為只是課程的作業專案就降低審核的標準,無論在實驗結果的報告或是 commit message 的撰寫我都獲得了寶貴的經驗,這對我未來投入其他大型專案的開發來說是很好的起始點。
在效能提昇方面,經由我的修改,該專案在 5*5 的棋盤上約減少了 30% Cache misses 及 40% 的 Cache references。
我認為在這個環節我有充份的投入,這個項目我給自己的評分為 9 分。
2.作業/隨堂測驗:
這次修課的整體作業完成度不佳,但第一個作業我有充分投入,也比去年做的更好:
- commit message 的品質提升,能夠用更精簡的內容來傳達此次提交的更改。
- 註解及文件的閱讀,更細心的去瀏覽相關內容,發現錯誤並提交修正。這對於我後期閱讀核心程式碼有莫大幫助。
- 實驗設計,我開始清楚如何更嚴謹的進行實驗,且不再是基於理論去分析,而是透過合適工具將結果量化。
隨堂測驗的部份,如果單以分數來看我表現得很差。在作答結束後我的分佈幾乎位於低分區間,但我誠實面對自己,沒有依靠任何大語言模型來協助作答,因為在面試的場合也是得靠自己,如果習慣了大語言模型協助整理說明,我覺得對我的成長沒有幫助。透過這個環節也清楚知道我在快速解析程式碼用途還有很大的進步空間。
我認為在這個環節雖相比去年有所進步,但整體的完成度不佳,這個項目我給自己的評分為 5 分。
3.期末專題
任務簡述
Linux 系統提供多種排程類別,而本次期末專題將著重探討其中的公平排程(Completely Fair Scheduler, CFS)。
隨著雲端伺服器的普及,過去單純從任務角度進行排程的方式已不再適用。在現今的雲端環境中,一台伺服器主機可能同時服務多位使用者,而這些使用者通常支付相同的費用給伺服器供應商,然而他們各自運行的任務數量卻可能存在巨大差異。若僅根據任務數量來分配寶貴的硬體資源,將會對任務較少的使用者產生嚴重不公平的現象。
為解決此問題,Linux 引入了群組排程(Group Scheduling),以使用者或任務群組為單位進行資源分配。本專題將深入探討群組排程的核心機制,並透過實驗方式檢視相關核心程式碼與群組控制器(cgroup controller)的實際行為及效能表現。
我認為和 2024 年期末專題相比,我有大幅度的進步。去年什麼都求快,沒有靜下心來好好將細節研究清楚就著手進行,但核心程式碼就是博大精深,沒有基礎知識及理論輔佐直接去看程式碼簡直是紙上談兵。今年從授課老師撰寫的書籍開始,仔細閱讀每個章節,理解各個世代排程器的優缺點,以及每次變革的根本原因,到實驗的設計以及相關工具的使用。
本學期我幾乎將所有時間投入在其中,雖可能導致我會延後畢業,但我並不後悔,因為準時畢業對我來說沒有什麼幫助,但認真投入此專案可以讓我的個人簡歷多一個稍有規模的作品。
我認為在這個環節我有充份的投入,這個項目我給自己的評分為 10 分。
4.與授課老師的互動
上課互動:
第一次互動 4/25 直播
第二次互動 5/8 直播
一對一面談:
2025 年 4 月 16 日
這是本學期第一次面談,主要討論了期末專題進行的方向。我在這次面談提出了我對排程器有興趣,經授課老師指示先閱讀其撰寫的排程器書籍《Demystifying the Linux CPU Scheduler》,因為一開始的我對排程器的基礎知識相當缺乏。
2025 年 4 月 21 日
前期授課老師有指定我先閱讀特定章節,這次面談的時間點我閱讀到了第二章,我整理了閱讀過程所發現的問題,針對這些問題與授課老師討論。並且從這時候開始投入該書籍的 維護。
2025 年 5 月 2 日
在這個時期我開始追蹤較新版本的 Linux 核心程式碼,發現書中有些名詞說明已過時。這次面談主要討論了授課老師在最初撰寫這本書的時空背景。
2025 年 5 月 9 日
在第一次面談時,原先老師有指示可以投入 sched_ext 相關專案,但隨後有另兩名同學投入相關主題,於是從這個時期開始,我的期末專題方向確定為群組排程相關。
2025 年 5 月 16 日
2025 年 5 月 21 日
2025 年 5 月 28 日
開始投入群組排程的議題後,我經歷了好一陣子的碰壁期,上方三次面談主要就我所遇到的問題逐一討論,並開始追蹤最新版本的 Linux 核心程式碼。
2025 年 6 月 6 日
過程中發現了許多議題值得投入,與授課老師討論是否有貢獻的空間,主要針對 cfs_rq 相關成員名稱的變革以及 Linux 核心文件對應的說明相當不足。
2025 年 6 月 15 日
授課老師預計在書籍中加入新的章節來展示群組排程的實驗,此次面談主要討論了實驗設計的細節。
2025 年 6 月 26 日
授課老師邀請參與期末專題線上發表,這次主要討論我進行實驗時發現了非預期的結果,授課老師指示可關閉超執行緒再次進行實驗,並嘗試找出是否僅在特定比例的行程數量下才出現非預期的結果。
我認為在這個環節我有充份的投入,每次面談都有解決當下的問題並持續進步,這個項目我給自己的評分為 10 分。
5.所見所聞所感,務必提及閱讀〈因為自動飲料機而延畢的那一年〉和回顧自身在本課程的投入狀況
經過了一年再次閱讀 〈因為自動飲料機而延畢的那一年〉後,我覺得有十分不同的觀點,我覺得要樂於去觀察,無論是什麼面向。書中的作者也是跟飲料店合作過,進行飲料 DIY 網站的架設,才有了自動飲料機這個 idea。姑且不論結果好或壞,我覺得過程是很重要的一環。不斷的重複「設計、製造、修正」的循環,我認為這不只應用於軟硬體的設計上,這觀念也充斥在很多方面。
去年幾乎沒有去瀏覽其他學員的開發紀錄,我覺得這是很大的損失,在同樣的事情上每個人都有不同的看待觀點。透過觀摩他人的作業很容易可以進行對比,在這個過程中都可以發現一些自己沒注意到的細節,期末專案的學員相互 review 環節也是,舉例來說,由 EricccTaiwan 同學留下的問題就是我進行實驗時不曾考慮過的議題。
至於課程投入的部份,我認為今年我有全心全意投入,但這不代表做的足夠好,我還是沒有在較大規模的專案有所貢獻,這也是日後要積極爭取的方向。
這個項目我給自己的評分為 8 分。
自我評量 (1 ~ 10)
- \(\text{GEOMEAN} = (9 \times 5 \times 10 \times 10 \times 8) ^ {1/5} \approx 8.3\)
- 方案 A : \(8 + \text{floor}(0.3 \times \text{GEOMEAN}) = 10\)
- 方案 B : \(1 + \text{floor}(\text{GEOMEAN}) = 9\) ___
2024 Linux 核心實作 春季班 自我評量
1.成果發表和貢獻:
當我進行作業二時,我在第 3 週對應的測驗教材頁面的第一題發現了一個數學公式的錯誤。在本課程第二次實體 code review 結束後,我向授課老師反映了這個問題。老師回應說這是故意寫錯的,目的是測試我們是否能注意到這些細節。這次經歷顯示了我在閱讀過程中對細節有仔細觀察。
至於書本部分,目前我尚未有任何貢獻。然而,在 Linux 核心程式碼方面,可以參考 4.與授課老師的互動 中的 Linux 核心程式碼詢問。我原本有意提交貢獻,但基於組合語言序列的實驗結果,發現還需要更多的理論輔佐。在這個過程中,我意識到自己的理論知識仍需加強,因此我決定進一步深入研究相關理論,確保未來能夠提供高質量的貢獻。
這個項目我給自己的評分為 4 分。
2.作業/隨堂測驗:
作業
這是除了期末專題外,我花費最多心力的作業,我認為自己在這個作業中有顯著的進步,列舉如下:
對 C 語言的掌握度提升:在大一上學期我擔任大學部資料結構課程的助教,作業部分是以 C 語言實作,但當時我完全不會 C 語言,只能協助書寫題目部分。為了完成此作業,我透過授課老師的「你所不知道的 C 語言系列講座」和李根逸博士的 C 語言入門,重新學習 C 語言,我認為在這一學期中有了顯著成長。
學會操作 Linux:從小到大我都只用 Windows 作業系統,上大學時甚至覺得 Linux 很難用,直接退選相關課程。但透過這門課,我逐漸發現 Linux 的許多優點,例如環境架設的便利性遠超過 Windows,也不會有擾人的自動更新。雖然一開始不習慣,但現在發現只要給我鍵盤,我就能完成許多事情。
學會 Git 相關操作:以前都用雲端或隨身碟保存程式碼,雲端容量逐年減少,設備也可能遺失或損壞。學習 Git 後,我體會到這個工具的強大,只要認真撰寫 commit message,後續追蹤程式碼功能變更也變得相對容易。
這次作業 review 是很不錯的體驗,收穫了許多其他修課學員的建議。針對各項建議,我都有進行對應的調整,每次調整後都有獨立的 commit,我覺得這個作業做得很好。列舉如下:
在實作尋找中間節點的過程中,有一個經驗讓我特別印象深刻。起初,我使用快慢指標策略進行實作,其中快指標需要走 \(n\) 次,而慢指標只需走 \(n/2\) 次。在進行同學互評時,有人提到,其實可以使用兩個指標分別從頭尾走向對方,這樣可以將總走訪次數降至 \(n/2\) 次。這次經驗讓我深刻體會到,多換幾種角度思考問題的重要性,因為不同的資料結構可能會帶來不同的解決方案。
在實作
q_insert_head和q_insert_tail的過程中,我原本的實作中包含多行重複的程式碼。在經過同學的建議後,我才發現這兩個方法其實可以互相配合,只需在呼叫另一個函式時改變所傳入的佇列節點。受到這個建議的啟發,我也同步修改了q_remove_tail的實作方式,使其可以重用q_remove_head的程式碼。這個過程顯示了我能夠舉一反三,從而提高程式碼的重用性和維護性。
2024q1 Homework6 (integration)
測驗
我每週都有參與測驗,但有幾次我得到了 0 分。起初這讓我感到相當挫折,但也使我意識到自己的還有許多努力空間。慶幸的是,這些錯誤是在修課階段發生的,而不是在未來的面試中。如果在面試中還是得 0 分,那才會是致命的打擊。
在作業/隨堂測驗這個項目,我給自己的評分為 9 分
3.期末專題
整體而言,我覺得作業的完成度平平,還有很大的努力空間。比較遺憾的是沒有完全理解 CMWQ。然而,在期末專題中,我向老師發信詢問的部分讓我有較大的收穫和成長,這是我實際去實作測試的部分。其餘的部分主要是瀏覽教材,但這也讓我體會到,好奇心不會害死貓,反而讓我獲得了許多意想不到的收穫!
在這個項目,我給自己的評分為 8 分
4.與授課老師的互動
第一次一對一討論
時間:2024/05/08 PM9:30
在這次討論中,授課老師現場出了一道有關 ldexp 的題目,當時我完全無法解答。這讓我意識到自己對位元操作的掌握並不像想像中那麼全面。隨後,老師詢問我對哪些議題有興趣,我經過思考後請老師指派。討論結束後,我重新閱讀了《深入理解計算機系統》(CSAPP)第二章,運用書中關於浮點數的知識,解決了我原先無法回答的問題。這次經驗顯示了我在面對挑戰時,能夠積極尋求學習資源,不斷提升自己的技能。
第二次一對一討論
時間:2024/05/22 PM4:30
完成第一次面談的題目後,我再次聯繫授課老師進行面談。這次面談中,先是討論當前實作在非正規化數、無窮上有缺陷,老師提供了更好的解決方法(使用 union),以及針對我原先的實作方式,並且提到我進步許多。老師還幫助我解釋了期末專題進行過程中遇到的問題。
Linux 核心程式碼詢問(透過電子郵件)
時間:2024/06/26 PM10:23
這個環節源於我的好奇心。在進行期末專題時,我需要研讀 Linux 核心程式碼中的 div4,並發現其中某部分程式碼似乎有改進空間。我發信給老師討論此事,雖然事後想想,老師可能早已知道我的改進建議並沒有實質改善,但他在第一時間並未否決我的疑問,而是給予一些分析建議。我隨即展開實驗,結果雖與預期大不相同,但我很享受這個學習過程。如果當初老師直接告訴我不可能,我可能就沒有動力去研究相關議題。
紀錄一下老師給的毒雞湯: 「幻滅是成長的開始。希望你體會到何以我一直強調「細節」的重要。」
第二次面談後,在 2024/06/19 ~ 2024/06/24 我發了十次訊息到粉絲專頁想要再次預約面談,但沒有收到老師的回覆,在互動這個項目我覺得我有盡全力投入了,
我給自己的評分為 10 分。
5.所見所聞所感,務必提及閱讀〈因為自動飲料機而延畢的那一年〉和回顧自身在本課程的投入狀況
是個很振奮人心的故事,讓人深思。 如果你只會寫程式,而且對原子筆一竅不通,那會發生什麼悲劇就可想而知了。
- 對這段話頗有感觸,也反映了為什麼這門課程特別強調閱讀原始教材的重要性,一直以來我都在舉燭,只會在心中腦補程式碼,還沒著手進行 lab0-c 前,在如今這個生成式AI迅速發展的時代,我常常僅是打開 ChatGPT,描述我的目標,然後是一連串的「ctrl + c >> ctrl + v >> run」。當遇到 bug 時,我再次「ctrl + c >> ctrl + v」尋求 ChatGPT 的幫助來解決問題。剛開始寫 lab0-c 時,我也嘗試過這樣幹,然而,我發現從 ChatGPT 得到的回答往往不切實際。也對應到老師在 Google meeting 上提到的,如果只是一昧的使用這些工具,那並無法與他人拉開差距,其他科系的同學甚至比你還會問 ChatGPT 問題。
If I had eight hours to chop down a tree, I’d spend six hours sharpening my axe.” – Abraham Lincoln
- 我意識到基本功的重要性,綜觀這學期下來,我雖然沒辦法按時將每項作業完成,也未能在每週四課程開始前將教材確實看完,更不用說時常需要重複閱讀教材和相關的影片。但我發現,每當我重新閱讀教材時,總能獲得新的理解。那些在第一次閱讀時感到模糊不清的知識點,隨著閱讀次數的增加,逐漸浮現出新的見解和突破。
事情如果太順利代表絕對有問題,而問題永遠會從意想不到的地方冒出來。
- 就像我在期末專題碰到的問題,天真的我自以為找到了好辦法,果然問題真的從我沒預料的地方冒出來!以前會覺得理論、實作是分開的兩個議題,但隨著課程進行我發現兩者其實相輔相成,甚至還會有設備不同造就結果不同的情況發生。
回顧我在本課程的投入狀況,我覺得我很努力了,儘管作業、測驗、期末專題都有瑕疵,但這絕對是我來成大後最用心投入的一門課,跟學期初的我相比,我很滿意自己的成長,
在這個項目,我給自己的評分為 10 分。
6.每月發給實驗室指導教授的學習回顧
二月份學習回顧
- 寄信日期:2024/03/05 PM5:08
- 信件內容簡述:與上方作業一的描述雷同,主要與指導教授分享我不足之處,並分享作業進度。
三月份學習回顧
- 寄信日期:2024/04/07 AM1:29
- 信件內容簡述:主要與指導教授分享本課程所使用的共筆工具 HackMD,並且將此工具用於實驗室內部文件的撰寫。
四月份學習回顧
- 寄信日期:2024/05/11 PM4:16
- 信件內容簡述:主要與指導教授分享期末專題題目。
五月份學習回顧
- 寄信日期:2024/06/23 PM2:27
- 信件內容簡述:主要與指導教授分享期末專題進行狀況。
我每個月都有發回顧信,且在信件只要討論到課程相關主題,我都有附上對應的鍊結供指導教授參閱,也沒有任何隱瞞。
在這個項目,我給自己評分為 10 分。
7.使用GEOMEAN 來計算上述 (1) 到 (6) 各項的幾何平均
- 採用方案 B: 1 + floor(GEOMEAN)
計算後的分數為:9 分
