--- title: salmoniscute (林志芸) categories: User ... # 簡介 * 國立成功大學 資訊工程學系 114 級 (2021 ~ 2025) * GitHub: [`salmoniscute`](https://github.com/salmoniscute) * HackMD: [`salmonii`](https://hackmd.io/@salmonii) # 2025 Linux 核心設計/實作 春季班 自我評量 ## 成果發表和貢獻 8 分。 * 《Demystifying the Linux CPU Scheduler》 * [pr #265 ](https://github.com/sysprog21/linux-kernel-scheduler-internals/pull/265) * [pr #266](https://github.com/sysprog21/linux-kernel-scheduler-internals/pull/266) * [pr #267](https://github.com/sysprog21/linux-kernel-scheduler-internals/pull/267) * [pr #286](https://github.com/sysprog21/linux-kernel-scheduler-internals/pull/286) * 作業和教材 * [lab0-c pr #282](https://github.com/sysprog21/lab0-c/pull/282) * [kxo pr #12](https://github.com/sysprog21/kxo/pull/12) * 修正[作業一教材](https://hackmd.io/@sysprog/linux2025-lab0/%2F%40sysprog%2Flinux2025-lab0-c) select 程式碼註解 以上貢獻都是跟 typo、書本的段落語意相關的修正,雖然老師說勿以善小而不為,但是尚未有程式碼邏輯和行為的改動去解決真實世界的問題,因此計算為 8 分。 ## 作業/隨堂測驗 7 分。 * [2025q1 Homework1 (lab0)](https://hackmd.io/@salmonii/linux2025-homework1) * [2025q1 Homework2 (quiz1+2)](https://hackmd.io/@salmonii/linux2025-homework2) * [2025q1 Homework3 (kxo)](https://hackmd.io/@salmonii/linux2025-homework3) * [2025q1 Homework4 (quiz3+4)](https://hackmd.io/@salmonii/linux2025-homework4) * [2025q1 Homework5 (assessment)](https://hackmd.io/@salmonii/linux2025-homework5) 在撰寫作業的過程中學習 C 語言的新知識和過去沒掌握的觀念,像是 dangling else、指標的指標和浮點數等等。第一次作業中我閱讀 《The cost distribution of queue-mergesort, optimal mergesorts, and power-of-two rules》論文,嘗試用論文中的 QM 演算法實作鏈結串列的合併。作業也讓我了解閱讀第一手資料的重要性 e.g. C99 規格書、man page,與其訴諸 google 搜尋不如直接去看書本的定義。第三次作業很可惜的是我初期花了大量時間舉燭和猜測程式碼的行為,但我應該要做的是直接去看像是 softirq 等教材和文件然後動手實作。 ## 期末專題 8 分。 [Linux 核心專題: CPU 排程器之理論基礎](https://hackmd.io/@sysprog/HyFtDjMfxg) 有參與[期末發表](https://hackmd.io/29wzjTXtSgyu4oCaBJOwiQ)。 越深入了解 CPU 排程器會發現自己不懂的知識越多,要填補的坑越來越大。我現階段對於此領域整體的掌握還不足以給自己滿分,時間有限許多代辦事項也還未完成,像是修訂《Demystifying the Linux CPU Scheduler》第二章的 issue 還有理解 CPU BWC 等等。 但我還是想肯定自己當初在閱讀《Demystifying the Linux CPU Scheduler》時沒有無腦快速地看過去,而是另外參考了核心的原始碼和其他文件一起學習,即使要多花許多時間釐清和紀錄問題,後來這份堅持也幫助我確立專題的方向。 在研讀 CPU 排程器的過程中也很幸運的可以觀摩其他兩組很厲害的學長,了解他們做實驗的方式、貢獻 `sched_ext` 開源專案還有對於他們各自對於排程器的理解。另外我也大量的參考老師撰寫的《Demystifying the Linux CPU Scheduler》還有 `Yiwei Lin` 學長整理的一系列 [CPU 排程器的筆記](https://hackmd.io/@sysprog/Hka7Kzeap/%2FHkyEtNkjA),包含 EEVDF 的完整 patch series 分析等。若沒有這些前人和同儕的努力,我在投入這個新知識領域的初期會很迷惘。以上這些人不僅讓我學習到他們的學習方式,也促使我繼續學習,在整理筆記時也想著要讓以後的人看懂,因此尤其是 [EEVDF 論文筆記](https://hackmd.io/@salmonii/eevdf_paper)以及期末的專題簡報是經過了反覆的重構調整。 研讀論文: * [《A Generalized Processor Sharing Approach to Flow Control in Integrated Services Networks: The Single-Node Case》](https://pbg.cs.illinois.edu/courses/cs598fa09/readings/pg93.pdf) * [《WF2Q : Worst-case Fair Weighted Fair Queueing》](https://www.cs.cmu.edu/~hzhang/papers/INFOCOM96.pdf) * [《Earliest eligible virtual deadline first: A flexible and accurate mechanism for proportional share resource allocation》](https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=805acf7726282721504c8f00575d91ebfd750564) * [《CPU bandwidth control for CFS》](https://landley.net/kdocs/ols/2010/ols2010-pages-245-254.pdf) 研讀論文對我的幫助除了學習他人的思考脈絡,我覺得最有挑戰的是理解內化而不是單純瀏覽,因為論文很多地方都不會寫的非常清楚,比如說像是公式的完整證明,他會省略掉中間很多步驟,另外在不同的論文之間,即便在討論同一件事情,使用的數學符號會大不相同,所以需要比對整理。也要去觀察數學理論在真實世界的實踐,因為理論如果沒有實作出來也沒什麼意義,實際應用也一定會有難處讓理論和實作無法完全對齊,如同現今的 EEVDF 核心實作,全局虛擬時間改為由任務的虛擬執行時間去反推等等。對我來說,研讀論文和其他第一手資料是讓我知道實作設計的動機跟基礎,如果跳過這一步直接去看實作程式碼,對其舉燭猜測會很不踏實。 觀摩其他學員的期末專題: * [群組排程的考量因素和落實](https://hackmd.io/@sysprog/B14go-K-xx) * [探討 sched_ext 及機器學習](https://hackmd.io/@sysprog/BygEQ4dWxx) * [虛擬無線網路裝置驅動程式](https://hackmd.io/@sysprog/HyUvvBm-ll#Linux-核心專題-虛擬無線網路裝置驅動程式) * [作業系統的設計和開發](https://hackmd.io/@sysprog/HyIQvDYWll) * [Redis/Valkey + io_uring](https://hackmd.io/@sysprog/SyxZhzFZlg) ## 與授課教師的互動 10 分。 * 3/4 [課堂討論](https://hackmd.io/K4C5ofeqQg6LC8OEbdVcwg):如何利用「逼近」的方式來取代乘法。 * 3/11 [課堂討論](https://hackmd.io/AVg2YkX9RveH1W6SVWmNIw):老師提問大數運算可以怎麼做。我回家研讀 bignum 程式碼。 * 4/29 課前討論:老師說覺得目前書本中對於 CPU 排程器的理論知識太少,叫我去看 GPS 的論文。 * 4/30 一對一討論:問老師書本問題,確定期末專題的題目。老師也有解釋為什麼會想要寫 《Demystifying the Linux CPU Scheduler》 這本書,是因為他覺得許多其他關於 CPU 排程器的文本都忽略了很重要的一件事:忽略了排程本身的成本,排程本身也會消耗資源,並不是旁觀的。 * 5/27 一對一討論:問老師關於 [EEVDF 理論跟實作差異](https://hackmd.io/@salmonii/ryRHMZgMlg)的問題。 * 6/10 一對一討論:問老師要怎麼在 patch 海跟 mailing list 海裡面快速找到對應關鍵的的開發者討論,老師說不要急,這種重要的第一手資料怎麼可以求快。發現自己對 [target latency](https://hackmd.io/@salmonii/SJGiekyVgg) 了解不全,於是決定乖乖去追 CPU 排程器歷史。也因此發現《Demystifying the Linux CPU Scheduler》目前 EEVDF 章節與我的認知的矛盾之處,像是為什麼書中要如此的著重說明 `latency-nice` 而非從 EEVDF 理論基礎上強調 request length? 這是我認為書本的 EEVDF 章節可以再調整的部分。 ## 所見所聞所感 10 分。 * 眼見 這堂課首先讓我意識到作為一個學生,我連許多基本的素養都不足,像是如何撰寫好的 git commit message、如何流暢清楚的用文字表達想法以及如何有效的溝通等等。這些是我以前常常會忽略的細節,看似普通但是非常重要。另外還有數學的素養,像是從作業一的 [list sort 演算法分析](https://hackmd.io/@devaraja/paper)跟統計全部都是基於數學,工程人員不能靠感覺要靠客觀事實,數學跟理論是不可輕忽的一塊。以前很無知的時候還會覺得對於人工智慧沒興趣的資工系學生念數學幹嘛呢,但是從這堂課開始老師便不斷地強調,還有親身去研讀論文過後,才真正明白數學是許多東西的起點這件事。 我投入學習核心的 CPU 排程器已經快兩個月了,發現它比我預期的還要困難,到現在還是覺得自己並沒有真正融會貫通。理論上待完成的部分像是 GPS 的論文只研讀了前半段還有 EEVDF 和 WF2Q 的關聯,實作上像是整個排程程式的運作流程以及 cgroup 等等細節,還未研讀的東西還有太多太多,而這甚至只是整個龐大資訊領域裡面的小小一部分,但我深刻了解到當中的每個小齒輪都值得投注一輩子的時間去學習。老師常常說要誠實面對自己,我認為首先就是要先承認並且發現自己是無知的。跨出無知的舒適圈而見識到世界的廣大,是這門課帶給我最大的收穫。 * 不要急 這學期被老師提醒不要急三次了,包括像是之前詢問重點是什麼,結果被老師回了一句「沒有什麼重點,所有的東西都是重點」。急躁和總想著一蹴可幾一直是我的毛病之一,曾經也有因為專題大多停留在理論與考古階段而感到焦慮迷惘的時候,但是在定下心慢慢學習之後體會到了它對我的幫助還有老師指派這個題目給我的用意,像是補足許多缺失的作業系統基礎知識,在進入碩班前練習研讀論文並且內化成自己的理解呈現以及學習閱讀原始碼和開發者的討論等第一手資訊。對應到老師常說的:如果連基本的小事和細節都做不好,要怎麼去了解千萬行的 Linux 核心程式碼? * 閱讀〈因為自動飲料機而延畢的那一年〉和這堂課的關聯性 我最有感覺的是真實世界的問題,像是關於 CPU bandwidth control 運用在多租戶的雲端資源分配系統,以及從閱讀開發者之間的討論,了解到 CPU 排程器的漫長的演進其實跟 latency 和 throughput 之間的取捨息息相關,不同公司和開發者所在乎的指標大大不同,而這也讓 CPU 排程器的發展變得更為困難,要經過多次的實驗跟效能分析才能完成一次迭代。 ## 自我評量 (1 ~ 10): $GEOMEAN=(8×7×8×10×10)^{1/5}=8.516391205$ 方案 B:$1+floor(GEOMEAN)=1+8=9$