# 2024q1 Homework5 (assessment) contributed by < [SHChang-Anderson](https://github.com/SHChang-Anderson) > ## 改進測驗題 * [第一週測驗題](https://hackmd.io/@ShchangAnderson/linux2024-homework2#%E7%AC%AC%E4%B8%80%E9%80%B1%E6%B8%AC%E9%A9%97%E9%A1%8C) * [第二週測驗題](https://hackmd.io/@ShchangAnderson/linux2024-homework2#%E7%AC%AC%E4%BA%8C%E9%80%B1%E6%B8%AC%E9%A9%97%E9%A1%8C) * [第三週測驗題](https://hackmd.io/@ShchangAnderson/linux2024-homework4#%E7%AC%AC%E4%B8%89%E9%80%B1%E6%B8%AC%E9%A9%97%E9%A1%8C) * [第四週測驗題](https://hackmd.io/@ShchangAnderson/linux2024-homework4#%E7%AC%AC%E5%9B%9B%E9%80%B1%E6%B8%AC%E9%A9%97%E9%A1%8C) ## 閱讀〈[因為自動飲料機而延畢的那一年](https://blog.opasschang.com/the-story-of-auto-beverage-machine-1/)〉 閱讀《因為自飲料機而延畢的那一年》後,讓我有些感觸。作者一開始提到: > 資訊工程系的學生不懂寫程式,機械工程系的學生不懂做機械。 這段話讓我一開始以為這正是臺灣學生所面臨的難題,他們在學校學到的東西大多是理論,缺乏實際操作的機會。然而,當我看到最後,作者提到了: > 飲料機的程式愷宏是寫不出來的,之所以能在一個月內完成,是因為我在大學期間就寫過好幾個網站了。愷宏能和工廠溝通、設計出可用的零件,是因為他在大一就在跑工廠做東西了。紘銘能輕易的設計出飲料機的電路,是因為他曾花了很多時間在電子電路課上頭,做了很多習題,纏著教授把每個疑惑都搞懂才罷休。 讀到這裡,我突然明白,大部分學生並不是缺乏實際操作的能力,而是缺乏**將所學應用於實際情境**的認知。這就像 Jserv 在課堂上經常提到的:為什麼不將你們學到的數學知識拿來用呢?同時,這也讓我想起了 [Steve Jobs 在史丹福大學的演講](https://youtu.be/UF8uR6Z6KLc)中提到的一段話:他在大學時曾旁聽書法課程,學會了如何在不同字母組合之之間調整間距,學到了書法的美感和精緻。十年後,當他設計第一台麥金塔電腦時,他把這些知識都應用了起來。如果他當初沒有選修那門課,麥金塔就不會有多種字體和等比例間距了。這也呼應了作者所說:**對於你來說真正重要的事物,往往會比你想像的早就出現在你的生活中。** 或許我對「實作」這件事想得太遠了,其實我們已經在過去接觸過許多技能,只是沒有將它們應用出來。就像 Jserv 老師在課堂上提到的,Linux 核心實際上是將許多大學的資訊科學必修課程的內容應用。可惜的是,學生們只關心分數,只在意研究所考試是否會出題,卻沒有想過這些知識如何應用於真實世界。這也是我最近幾週課程中領悟到的,我也希望能夠真正地將所學知識付諸實踐。 ## 研讀課程教材紀錄啟發 ### [中斷處理和現代架構考量](https://hackmd.io/@sysprog/linux-interrupt) * 在課程中提到 Workqueue 相較於 Tasklet 可以達成 sleep 的效果,想理解為何可以達到此效果。 > tasklet 建構在 softirq 之上 > skb (socket buffer) > irq (hard INT), softirq (deferrable) > "soft" -> software interupt, softirq -> 可排程 > (k)softirqd (per-CPU) > CMWQ 可指定 CPU mask * 在 [simrupt.c](https://github.com/sysprog21/simrupt/blob/main/simrupt.c) 程式碼中為何要利用 tasklet 將 workitem 放入 workqueue ? * 在 [simrupt.c](https://github.com/sysprog21/simrupt/blob/main/simrupt.c) 程式碼中 fast buffer 的作用為何,為何不直接將資料存於 kfifo 中 ? Kernel User /dev/simrupt 每秒出現一個字元 FIFO producer consumer * 使用 workqueue 時用 `queue_work();` 將工作放入,實際如何針對這些 soft irq 做排程? > CMWQ 有自己的 workqueue,且可對應到指定的 CPU ## 簡述想投入的專案 ### [rhashtable 及 Linux 核心記憶體管理研究](https://hackmd.io/@sysprog/linux2023-projects#rhashtable-%E5%8F%8A-Linux-%E6%A0%B8%E5%BF%83%E8%A8%98%E6%86%B6%E9%AB%94%E7%AE%A1%E7%90%86%E7%A0%94%E7%A9%B6) > [Relativistic hash tables, part 1: Algorithms](https://lwn.net/Articles/612021/) 事先理解 rhashtable ,參考過去共筆以及 [Relativistic hash tables, part 1: Algorithms](https://lwn.net/Articles/612021/) 了解 hashtable 的 resize 方式。 #### Table shrinking 若 hash table 中 buckets 數量過多,希望降低 buckets 數量使用 Table shrinking 的方式重新分配 hash table 。 * 第一步驟建立一個新的 hash table 並指向第一個 bucket 中鏈節串列的第一個節點。 * 接著將第一個 bucket 鏈結串列結尾指向下一個鏈結串列的開頭,值得注意的是這樣的作法避免在 resize 的過程中避免還在讀取的 readers 找不到節點的情況發生。 * 最後將舊的 hash table 指標指向新的 hash table ,這個時候舊的 hash table 尚不能回收,需要等待一個 [grace period](https://hackmd.io/@sysprog/linux-rcu#%E5%AF%AC%E9%99%90%E6%9C%9F) 避免尚為讀取完成的 readers 發生錯誤。 #### Table expansion 若 hash table 內 buckets 數量過少導致鏈結串列過長,搜尋效率低,需要將 buckets 內的節點分配到更多新的 buckets ,確保負載更均勻地分散在增加的 buckets 上,這樣可以提升 hash table 操作的效率。 * 首先建立一個新的 hash table ,並加入更多的 buckets 。使新的 hash table 中每一個 buckets 連接到對應的舊 node(指向具有匹配 index 的第一項)。 * 將 table 指標指向新的 hash table ,保留舊有的 hash table 避免本來的 reader 發生錯誤。 * 等待一個 [grace period](https://hackmd.io/@sysprog/linux-rcu#%E5%AF%AC%E9%99%90%E6%9C%9F) 過後執行 Unzip 操作。 ### [嵌入式向量圖形系統](https://www.facebook.com/groups/1531876370923589/?multi_permalinks=1579977659446793&ref=share&locale=zh_TW) --- TODO: 閱讀 rhashtable 及 Linux 核心記憶體管理研究 並紀錄問題 (嘗試執行程式) TODO: Ubuntu Linux 24.04 (搭配 Linux v6.8)