版本 7c522380fb659ad5abe4dce39d6a668b3f8aec8d
vax-r (鄭以新)
簡介
- 國立成功大學 資訊工程研究所
- Github:
vax-r
- HackMD:
vax-r
- LinkedIn: I-Hsin (Richard) Cheng
Linux 核心和相關專案貢獻
- [Linux Kernel]: [PATCH] lib/plist.c: Avoid worst case scenario in plist_add, [PATCH] lib/plist.c: Enforce memory ordering in plist_check_list
- [sched_ext]: PR 208
評分:此項我為自己打的分數為 10 分,學期初預計能在本學期間對 Linux Kernel 做出一項貢獻即是我的目標,最後共計三項 non-trivial contribution ,外加數次 trivial contribution ,我認為達成的程度為目標之上,因此給予自己 10 分。
其他專案貢獻
- [scx]: commit 6cce01c, commit e605b06, commit 5881c61, commit f839106, commit 0921fde, commit 4e30bb9, commit 94e3616, commit 1334a4d, commit 99960ad
- [vwifi]: commit e5eb949, commit 7814d59, commit 21a60d0, commit baf4714
- [lab0-c]: commit b13335b, commit 9fa4d90
- [concurrency-primer]: commit a74e1b1
- [gatus]: commit 34313be, commit 5c5a954, commit 1e82d2f
評分 : 此項目我為自己打 9 分,貢獻開源專案、發起開源專案本就是軟體工程師應該做的事,我用上述幾項貢獻說明我不只能夠修正程式碼的 bug ,同時也能針對現有程式進行效能改進,但我尚未能夠引入新的功能或者引導一項新的專案開發,還有進步空間,因此給自己 9 分。
2024 Linux 核心設計 春季班 自我評量
作業/隨堂測驗
- lab0-c: Github / HackMD
- Homework2: Github / HackMD
- ttt-in-lab0: Github / HackMD
- KMLdrv: Github / HackMD
- Homework4: Github / HackMD
- Homework5: HackMD
- kHTTPd: Github / HackMD
評分 : 此項目我為自己打 8 分,完成作業和測驗是我修課的份內之事,我對於每一份作業都有盡力去做,可惜能力尚待加強,未能完整的完成每次作業,作業七完成度更是差強人意,整體來說還能夠更好,因此給自己 8 分。
期末專題
- CPU 排程器 : (https://hackmd.io/@sysprog/BJdyxvxX0#Linux-%E6%A0%B8%E5%BF%83%E5%B0%88%E9%A1%8C-CPU-%E6%8E%92%E7%A8%8B%E5%99%A8)
評分 : 此項目我為自己打 8 分,這個專案的強度超出我原本的預期,別說引入新的 feature 或進行效能改進,要完整了解都超過我現有能力範圍,但我確實在短時間內最大程度的了解它,並且已經成為 scx 專案前 10 名的貢獻者,引入機器學習進行改進的部分也小有成果。整體而言我認為我做的比原先預期的還要好,不過依舊有很多不足需要加強,不管是 CPU 排程器、 cgroup 機制 、多核處理器議題還有 cache 等議題,唯有每個部分都有足夠程度的認識才能夠完整的掌握 CPU 排程器的開發以及發展脈絡,要加強的方面還很多,因此我給自己 8 分。
與授課教師的互動
- 4/23 下午6:30 一對一討論
- 4/29 下午2:00 一對一討論
- 5/29 下午4:30 一對一討論
- 數次課堂中問答
評分 : 此項目我為自己打 10 分,本學期課堂每次點到我時我都有和老師進行充分的互問互答,我不只是單方面回答老師問題,也能夠適時提問請老師解答我的疑惑。一對一討論也約了三次,本來想約更多次不過老師的行程表這學期比較滿就盡量減少次數。我覺得和老師的問答過程很有趣,他提出的問題有些很基本,考驗我的表達能力算是一種面試的練習,有時候也會問一些想都沒想過的問題,我當下也不知道答案,不過這適當的讓我知道我欠缺的還很多,還有很多能學習的地方,而且我們不一定得總是探討最新的議題才能獲得進步,許多時候我們連過往的基本根本都沒打好,甚至沒想過,我覺得老師特別擅長問這類型的問題。
所見所聞所感
評分 : 此項目我為自己打 9 分,對我而言選修這門課的理由不外乎是我對資訊科技本身的興趣、想對 Linux Kernel 這樣高強度專案貢獻的興趣、以及授課老師本身的名氣。之前在科技公司實習就已經聽聞這個授課老師在資訊科技業界的影響力,許多公司也十分在意是否有修過這門課,所以我想這堂課列為成大資訊所的必修課都不為過。授課內容相較於課名 Linux 核心設計/實作,其實我更認爲是在上進階版的計算機概論, 20 週當中超過一半和 Linux Kernel 沒有直接相關,老師也很少直接教導我們 Linux Kernel 當中某些技術的運作機制,我一開始是有些不解的,不過在課程大約進行到第三週時我逐漸了解要是沒有前半段 2/3 的基本知識教學,我們試圖看 Linux Kernel 程式碼或者試圖了解當中機制都是無用的,看不懂也沒有能力看懂,不是多花幾天或幾週盯著相同程式碼就會了解的。 Linux Kernel 充滿太大量特化的機制以及功能,哪怕是想理解一個特定 device driver 的運作都需要大量 domain knowledge 的支持,更別說其他和我們原本在作業系統課程當中學到的,看似相同的 mutex lock 、 cache coherence 或 CPU scheduling 議題,在 Linux kernel 當中因為現代硬體以及某些效能上的需求,進行非常多特化的程式碼, fast path 、 middle path 、 slow path ,各種排程邏輯,排程時候涉及的多核心議題,多核心當中又會碰到的 cache 議題,甚至到更細緻的數學運算,這些都是我們過往的課程當中用片面的概念自以為有學到其實只有把名詞背起來的知識。沒有這前 2/3 的內容我們無法對任何高強度專案產生貢獻,而事實上這前 2/3 的內容也就足以讓我們對這些專案做出貢獻,在我的期末專題 scx 以及 sched_ext 專案當中,我送出的 patch 沒有引入任何新功能,單純就是修正程式碼錯誤和效能改進,而當中我運用到的 bitwise 技巧 、 branchless 技巧 、基本運算的成本等等就是來自前 2/3 的課程甚至只有前 1/3 的課程的教授內容,我沒有想出任何高級的演算法、沒有引入任何酷炫的新功能,非常單純的是減少運算次數、減少分支預測錯誤等等這一類非常非常基本但是經常被忽略的細節而已。我認為「誠實面對自己」在這裡就有很好的驗證,前 1/3 也就是前六週的內容,看似如此基本但如果我連使用這六週內容幫程式碼進行改進都做不到,還以為自己真的有學會就因為內容看似簡單,但是程式碼改不動,這豈能算是有學會?我在最後六週時確實的用上前六週的內容來為程式碼進行改進,我認為這可以驗證我有學會這部分的內容,而剩下的內容顯而易見我還沒有學會。針對 kernel 相關議題的知識這堂課僅是為我帶來了一個開頭,我無法在 18~20 週內完全學會,但未來我會繼續在這堂課給我的基礎上不斷擴充並繼續嘗試在這些專案當中貢獻。
至於閱讀〈因為自動飲料機而延畢的那一年〉和這堂課的關聯性,我認為有兩個,第一個是解決真實世界的問題,從第一天開始我們的作業就是一個真實的專案,到最後我的期末專題要試圖在一群 Linux Kernel 開發者當中進行貢獻,他們建立的專案是實際會被公司採用的方案,存在世界上你我的電子裝置當中,我們在這堂課當中嘗試培養的就是這樣能影響真實世界的能力,不是發起什麼運動或抗爭,就一行程式碼就夠了,和那些真實參與 kernel 開發的工程師們交流,向他們提問,這過程當中我學到的非常多,詳細可以參考我期末專題的筆記有一部分是談及我一部分和開發者們的討論。第二個我認為是一個人不可能什麼都懂,哪怕是資訊領域,在進行期末專題的過程當中我挫折感蠻大的,因為我的目標僅僅是想改進排程器當中對於搬移任務與否的決策行為,連排程策略本身都沒涉及到,但這一個看似小小的問題卻引發背後我得學習 Rust 程式語言、 cache 與 NUMA 機制,量測 kernel 當中各項細節 metrics 的方法、 eBPF … 太多太多單獨探討都需要大量時間的議題,我一個人怎麼做得到全部精通,很快我就意識到我不可能全部精通,我只能盡力並且選擇一個領域精通,剩下的交給時間以及和我合作的人們,要一個人全部了解在現在的情況已經不實際,即便花時間全盤瞭解了,所有機制日新月異更新的速度不是我們學習速度跟得上的。
研究生發信時間
- 二月份學習回顧 (2024/03/06) : 整合 tiny-web-server 並確保命令列的 auto-complete 套件正常運行,透過 linux 之 select() system call 來達成同時監聽 command-line input 和網路封包請求。實作 Fisher-Yates Shuffle Algorithm 並以統計方法驗證亂度。
- 三月份學習回顧 (2024/04/05) : 我們也實作了使用者層級的排程器,一開始我利用 setjmp() / longjmp() 進行動態 goto 的方式將不同的 AI 演算法實作與棋盤畫面更新等不同任務嘗試包裝成 coroutine ,但無法正確地將監聽鍵盤事件的任務包裝成 coroutine ,只能透過密集的函式呼叫。之後我將排程器實作改為利用 Linux Signal 與 user context 來實作 user-level context switch ,進一步完成使用者層級的可中斷排程器,並實作 Round-robin 排程策略,成功將各式函式包裝成 coroutine 。過程當中我學習到真實系統中 process 、 thread 、 coroutine 的實作區別,並非完全像過往作業系統課堂所教的,從這裡我們也開始延伸探討並行程式設計。
- 四月份學習回顧 (2024/05/23) : 將作業三利用定點數運算實作的 Monte Carlo Tree Search 演算法實作在 kernel space 當中,其中還要運用到 linux kernel 的 CMWQ (Concurrency-Manage Workqueue) 使得這種運算量較大的工作得以被排程利用不同的 kernel thread 運作,其中釐清並解決 softirq 相關內容是最為困難的一步。
- 五月份學習回顧 (2024/06/04) : 期末專題也開始著手進行,預計會是參與 scx 開發並且嘗試優化當中的負載平衡機制,目前已經瞭解了該專案如何利用 eBPF 將系統的 CPU 排程器變成一個 可拔插 的元件,同時也學習 BPF 及其相關的 profiling tools 包括 BCC, bpftrace 等工具,讓我們在了解作業系統核心上不只是臆測,而是真的運用工具去觀察並量化當中的行為。
評分 : 此項目我為自己打 10 分,每個月我都有向實驗室指導教授寄信說明上個月的學習內容和狀況,
自我評量 (1 ~ 10)
- 方案 A : 8 + 0.3 * 9 = 10
- 方案 B : 1 + 9 = 10
- GEOMEAN = 9