contributed by < SHChang-Anderson >
閱讀《因為自飲料機而延畢的那一年》後,讓我有些感觸。作者一開始提到:
資訊工程系的學生不懂寫程式,機械工程系的學生不懂做機械。
這段話讓我一開始以為這正是臺灣學生所面臨的難題,他們在學校學到的東西大多是理論,缺乏實際操作的機會。然而,當我看到最後,作者提到了:
飲料機的程式愷宏是寫不出來的,之所以能在一個月內完成,是因為我在大學期間就寫過好幾個網站了。愷宏能和工廠溝通、設計出可用的零件,是因為他在大一就在跑工廠做東西了。紘銘能輕易的設計出飲料機的電路,是因為他曾花了很多時間在電子電路課上頭,做了很多習題,纏著教授把每個疑惑都搞懂才罷休。
讀到這裡,我突然明白,大部分學生並不是缺乏實際操作的能力,而是缺乏將所學應用於實際情境的認知。這就像 Jserv 在課堂上經常提到的:為什麼不將你們學到的數學知識拿來用呢?同時,這也讓我想起了 Steve Jobs 在史丹福大學的演講中提到的一段話:他在大學時曾旁聽書法課程,學會了如何在不同字母組合之之間調整間距,學到了書法的美感和精緻。十年後,當他設計第一台麥金塔電腦時,他把這些知識都應用了起來。如果他當初沒有選修那門課,麥金塔就不會有多種字體和等比例間距了。這也呼應了作者所說:對於你來說真正重要的事物,往往會比你想像的早就出現在你的生活中。
或許我對「實作」這件事想得太遠了,其實我們已經在過去接觸過許多技能,只是沒有將它們應用出來。就像 Jserv 老師在課堂上提到的,Linux 核心實際上是將許多大學的資訊科學必修課程的內容應用。可惜的是,學生們只關心分數,只在意研究所考試是否會出題,卻沒有想過這些知識如何應用於真實世界。這也是我最近幾週課程中領悟到的,我也希望能夠真正地將所學知識付諸實踐。
tasklet 建構在 softirq 之上
skb (socket buffer)
irq (hard INT), softirq (deferrable)
"soft" -> software interupt, softirq -> 可排程
(k)softirqd (per-CPU)
CMWQ 可指定 CPU mask
在 simrupt.c 程式碼中為何要利用 tasklet 將 workitem 放入 workqueue ?
在 simrupt.c 程式碼中 fast buffer 的作用為何,為何不直接將資料存於 kfifo 中 ?
Kernel User
/dev/simrupt
每秒出現一個字元
FIFO
producer consumer
使用 workqueue 時用 queue_work();
將工作放入,實際如何針對這些 soft irq 做排程?
CMWQ 有自己的 workqueue,且可對應到指定的 CPU
事先理解 rhashtable ,參考過去共筆以及 Relativistic hash tables, part 1: Algorithms 了解 hashtable 的 resize 方式。
若 hash table 中 buckets 數量過多,希望降低 buckets 數量使用 Table shrinking 的方式重新分配 hash table 。
第一步驟建立一個新的 hash table 並指向第一個 bucket 中鏈節串列的第一個節點。
接著將第一個 bucket 鏈結串列結尾指向下一個鏈結串列的開頭,值得注意的是這樣的作法避免在 resize 的過程中避免還在讀取的 readers 找不到節點的情況發生。
最後將舊的 hash table 指標指向新的 hash table ,這個時候舊的 hash table 尚不能回收,需要等待一個 grace period 避免尚為讀取完成的 readers 發生錯誤。
若 hash table 內 buckets 數量過少導致鏈結串列過長,搜尋效率低,需要將 buckets 內的節點分配到更多新的 buckets ,確保負載更均勻地分散在增加的 buckets 上,這樣可以提升 hash table 操作的效率。
首先建立一個新的 hash table ,並加入更多的 buckets 。使新的 hash table 中每一個 buckets 連接到對應的舊 node(指向具有匹配 index 的第一項)。
將 table 指標指向新的 hash table ,保留舊有的 hash table 避免本來的 reader 發生錯誤。
等待一個 grace period 過後執行 Unzip 操作。
TODO: 閱讀 rhashtable 及 Linux 核心記憶體管理研究 並紀錄問題 (嘗試執行程式)
TODO: Ubuntu Linux 24.04 (搭配 Linux v6.8)