--- title: Han1018 (謝宗翰) categories: User ... # 簡介 * 國立陽明交通大學 智慧與綠能產學研究所 * GitHub: [`Han1018`](https://github.com/Han1018) # 2024 Linux 核心實作 春季班 自我評量 ## 1. 成果發表和貢獻 * 複習[你所不知道的 C 語言:記憶體管理、對齊及硬體特性](https://hackmd.io/@sysprog/c-prog/%2Fs%2FBkuMDQ9K7)篇時,注意到一些中英之間沒有空白字元便增添上去,詳見 hackmd 版本紀錄。 * [課堂簡記互動](https://hackmd.io/7svssG2MQpe9ozE_IRRZdg?view#han1018) 中提出同學間的共同疑惑 kernel space 的 GDB 方式,得到老師 KDB / UML 的解答後。後續便整理 kHTTPd 開源專案安裝至 UML 的方法於專題開發紀錄中。 kHTTPd 開源專案參考資料修訂,改善 [Paintako](https://hackmd.io/@sysprog/BkSW8Z2Bn) 同學的專案開發紀錄,使語意更通順。 * 引入 CMWQ 章節:「在 kernal kmalloc 一塊空間,再把 work 給丟進 CMWQ 中」。改為:「在 kernal kmalloc 分配一段空間給 http_request 結構體,再把 work 放入至 CMWQ 中。」 * MIME 型態章節:調整「MIME 是由主要型態(type) ... 如下: type/subtype;parameter=value」段落,修正多餘換行。 * 讀取檔案內容章節:「帶來的額外 IO 開銷」,改為「帶來的額外 I/O 開銷」 在這個項目,我給自己的評分為 **4** 分。 ## 2. 作業/隨堂測驗 * 2024q1 Homework1 (lab0):[GitHub](https://github.com/Han1018/lab0-c) / [HackMD](https://hackmd.io/@zRlFO_buT66gBhkP4gN7vg/linux2024-homework1) * 2024q1 Homework2 (quiz1+2):[HackMD](https://hackmd.io/@zRlFO_buT66gBhkP4gN7vg/linux2024-homework2) * 2024q1 Homework3 (ttt):2024q1 Homework1 (lab0):[GitHub](https://github.com/Han1018/lab0-c) * 2024q1 Homework5 (assessment):[HackMD](https://hackmd.io/@zRlFO_buT66gBhkP4gN7vg/linux2024-homework5) * 2024q1 Homework6 (integration):[HackMD](https://hackmd.io/@zRlFO_buT66gBhkP4gN7vg/linux2024-homework6) 在課程中的作業與測驗中學到了非常多的東西,首先是各種工具的使用,如 Valgrind、Perf、Ftrace 和 Git 等。在作業一和作業三中,使用 Valgrind 分析記憶體問題,排除了 qtest 實作的記憶體錯誤。為了檢驗實作的 merge sort 效果,在作業中使用到 Perf 工具,測量排序百萬個節點所需的 cycles、instructions 及執行時間,並比較了 merge sort 與 Linux 核心的 list_sort 的差異。 Ftrace 則被用來觀察 kernel space 程式的效能瓶頸。在期末專題中,使用 Ftrace 發現到某些特定 function 有著異常高的執行時間,透過觀察並使用快取機制進行改進後,系統吞吐量提升了兩倍以上(詳見期末專題開發紀錄)。 此外,作業中學習到 Linux 核心鏈結串列的實作,並利用此知識開發和改進核心模組,還有 bitwise 操作、並行處理機制和檢驗複雜度的方法。在學習檢驗複雜度方法時,通過閱讀論文《Dude, is my code constant time?》和使用其檢測工具 [dudect](https://github.com/oreparaz/dudect),修正了作業 lab0-c 中使用 Student's t-distribution 檢驗時間複雜度的缺陷,去除了在小樣本估計未知標準差時可能出現的極端值。 在期末專題中,大量使用了並行處理機制,如 atomic、spinlock,並實作了 lock-free 機制中的 RCU,用於維護放置快取內容的雜湊表。通過引入 CMWQ 改善了創建 kthread 時的成本,改善吞吐量約 1.5 倍。 在這個項目,我給自己的評分為 **7** 分。 從作業中學習到許多的工具和知識,作業五後參與狀況便並不理想,可改進的空間還非常多。 ## 3. 期末專題 * Linux 核心專題: 高性能網頁伺服器:[GitHub](https://github.com/Han1018/khttpd) / [HackMD](https://hackmd.io/@sysprog/HkyNQeJrR) 課程專題聚焦於提升 kernel mode 網頁伺服器的吞吐量。專題中增添了 kernel 模組的目錄顯示功能,並透過 Ftrace 定位效能瓶頸進行改善,過程中使用了 Ftrace、CMWQ、RCU 和網路通訊機制。透過 CMWQ、content cache 改善了吞吐量,與現行網站相比在特定使用情境下吞吐量有大幅的優勢。 在這個項目,我給自己的評分為 **10** 分。 專題開發過程中學習並運用了並行處理機制保護 critical section,並且使用了 Ftrace 定位出效能瓶頸區域並予以改善,實際開發了 kernel module 並使用 CMWQ 改善原先實作建立 kthread 時的時間成本。 ## 4. 與授課教師的互動 - 第一次互動:2024年3月8日 23:09 粉專私訊,私訊簡述「看完前三週教材考試時依舊無法取得及格分數」和老師討論學習方法。 - 第二次互動:2024年3月28日 20:17 粉專私訊,私訊簡述「剛作答完這週考試,有兩題跟我的想法不太一樣」和老師討論 - 第三次互動:2024年5月6日 15:00 一對一討論 - 第四次互動:2024年5月10日 21:46 粉專私訊,私訊簡述「如何讓 khttpd 在 UML GDB 的程式裡中斷」和老師討論 學期初時每次考試並沒有取得及格的分數,意識到自己對於教材的熟練程度不夠,尤其是 bitwise 操作章節。透過和老師的互動給的一點雞湯「你只是還不熟悉我的授課風格,繼續參加測驗就好,本月底若還是看不到改善,我們再來討論」之後便重新複習 bitwise 操作。把 bitwise 章節中的練習題全部練習過一遍,與實驗室同學在考試後 trace 測驗題的程式 (e.g., 開平方根、ilog2 計算以 2 為底的對數等題目)。隨著檢討次數上升,慢慢也跟上了考試節奏,後續的考試也取得幾次滿分的成績。 與授課老師的一對一討論後也發現自己對網路伺服器流程並不熟悉,如果要做核心模式的網頁伺服器作為期末專題應該閱讀更多教材。因此在討論後重新複習 TCP 3-way handshake、網頁伺服器流程、並行程式設計等教材,最後期末專題中也運用到教材內的內容改善吞吐量。 在這個項目,我給自己的評分為 **10** 分。 雖然一開始表現不及理想狀態,但隨著老師指出問題後便開始著手複習教材和檢討測驗內容,隨著多次練習後便跟上了課程的節奏、也順利開發了核心模組。 ## 5. 所見所聞所感,務必提及閱讀〈因為自動飲料機而延畢的那一年〉和回顧自身在本課程的投入狀況 「你不能現在就放棄,要是現在就放棄的話,你這輩子日後遇到這種等級的困難,就只會想逃避而已 –- Jserv」是我自己這學期經常提醒自己的一段話。實驗室的計畫需要穩定的產出每週三咪,加上另外兩門修課和這門課程,讓我這學期每天的生活都在不斷的被進度追著跑,已經記不起上次睡滿八小時和休息是什麼時候了。因此我知道時間有限,必須聚焦在我缺的內容以及我預期學會的內容。 首先是我缺的內容,藉由前六週的課程、作業、測驗,補齊 C 語言記憶體管理、對齊及硬體特性、bitwise 操作等 C 語言特性和操作。接著我預期這堂課的收穫是聚焦在核心模組開發和並行程式開發,因此反覆複習了並行處理機制系列教材,並於專題中實作核心模組及運用教材中提及到的 lock-free RCU 機制、spinlock、atomic、CMWQ 等內容。此外也額外使用到諸多工具來輔助觀察程式,如 Ftrace、Valgrind、Perf 等。 除了學習到的內容,我收穫到的內容是內化於內心的事。首先是心法-查閱第一手資料,翻閱官方說明文件/論文,才能得到最精準/即時的知識,如果是科普也至少要 wikipedia 等級/相關權威性網站,並且要略過 csdn xd。接著,注意用詞遣字,使用台灣的資訊科技詞彙,並且注重中英或符號間的空格。最後是 commit message,已經養成習慣的使用 git commit -a,標體大寫並且少於 70 字。這些不僅是課程內容也影響到我做研究、撰寫開發紀錄的過程。 在這個項目,我給自己的評分為 **9** 分。 我聚焦在我欠缺的基礎上和並行程式設計,前六週重新學習了 C 語言的各方面的知識,並且在期末專題中實作核心模組開發並且實際使用並且改善並行程式。 ## 6. 每月發給實驗室指導教授的學習回顧 二月份學習回顧 * 寄信日期:2024/02/29 PM1:32 * 信件內容簡述:主要與指導教授分享作業進度、教材中學習到的 Git 操作、commit message 規範、linux/list.h 中的鏈結串列使用方法。 三月份學習回顧 * 寄信日期:2024/04/01 PM10:01 * 信件內容簡述:主要與指導教授分享課程進度,包括數值系統、BITWISE 操作、系統層面的記憶體管理對其及硬體的特性,以及閱讀 〈DUDE, IS MY CODE CONSTANT TIME?〉論文後的心得及對實驗室的效益。 四月份學習回顧 * 寄信日期:2024/05/11 PM4:16 * 信件內容簡述:主要與指導教授分享並行處理機制包括 atomic 指令、memory ordering、lock-free 程式設計等。 五月份學習回顧 * 寄信日期:2024/06/23 PM2:27 * 信件內容簡述:主要與指導教授分享學校另一門課的 FTL SSD 專題,描述用課程中學習到的並行處理機制解決 SSD 中的 critical section 資料錯誤問題。 我每個月都有發回顧信,且在信件只要討論到課程相關主題,也都有附上對應的鍊結供指導教授參閱,並沒有任何隱瞞。 在這個項目,我給自己評分為 **10** 分。 ## 7.使用GEOMEAN 來計算上述 (1) 到 (6) 各項的幾何平均 *GEOMEAN = $(4*7*10*10*9*10)^{1/6}$ = 7.94 方案 B: 1 + floor(GEOMEAN) = 1 + 7 = 8