contributed by < TonyLinX
>
make test
的最後一個 Testing case 目前還尚未通過,這部份應該可以透過 perf 來找到問題。
這個 Testing case 是在測試 q_insert_tail
, q_insert_head
, q_remove_tail
, and q_remove_head
的 time complexity 是否為 constant。 很神奇的是,我每次執行的結果不同,有時會通過有時不會通過。
為何需要指標的指標
以這段程式來說,我們期望透過 func
去將 ptrA
變成指向到 B
,但只用指標是作不到這件事情,ptrA
還是指向 A
,原因就在於我們改動的東西是 ptrA
複製出來的值,並非是真正的去改善 ptrA
,所以為了改變一個指標的內容,我們需要使用指標的指標去 ptrA
的位址跟改它的內容。
理解 Linux 風格的鏈節串列是如何實做的,以及 list_head
的使用方式。
作業是我最有印象的部份,之前剛見到這些 code 的時候,又長又有一堆我不熟悉的 bit-wise 操作,第一次看的時候我完全看不懂,又沒有耐心把之前的老師的教材給看完,導致這個難度的問題,我就放棄了。不過,就在某一天,我突然想通了,我好好的把第一章跟第二章的教材給讀完,我發現題目突然沒有當初想像的那麽困難,我發現這種難度的問題我再也不會感到挫折放棄,反而是可以定下心來,把問題解完。
bitwise 操作
你可能沒想過的 Memory
data alignment(資料對齊)
data alignment 指的是資料在記憶體中的位址必須是某個 2 的冪次方(如 1、2、4、8)的倍數。這樣做是為了讓 CPU 存取資料更有效率。例如,int 通常要求 4 byte 對齊,代表它的位址要能被 4 整除;double 要 8 byte 對齊,位址要能被 8 整除。為何要這樣做呢?
因為 CPU 擷取資料不會只抓取 1 byte,現在的電腦都是 32 位於或 64 位於都可以一次讀取 32 bit 或 64 bit 的資料。假設某個變數的型態為 int,若 CPU 每次都只抓取 1 byte,就必須要抓 4 次,效率低落,於是 CPU 通常一次擷取 4 或 8 byte ,並依序存取。
Bit Fields
Bit Field 是 struct 成員的一種特殊語法,允許你指定該成員只佔用幾個 bit。
以下面的程式來說,unsigned int
是 4 bytes,但我們可能不需要那麽多,或許只要 2 bits 而已,那就可以透過 bit fields 來減少記憶體的浪費。
理解 Linux 風格的 hash 如何實做的
**pprev
)?*pprev
只能指向 NULL,所以說當你要移除第一個 hlist_node 時,就要特殊處理。為了解決這個特殊例子,才需要指標的指標 (**pprev
)。每個節點的 pprev
指向「指向這個節點的那個指標」(可能是 bucket 的 first
,也可能是前一個節點的 next
),這樣的設計可以讓我們在刪除任何節點時,直接把前一個節點(或 bucket head)指向它的指標,改為指向下一個節點,然後再把下一個節點的 pprev
一起更新,確保鏈結完整,無需額外尋找上一個節點的位置。corr
來記錄上一次加法產生的浮點誤差,並在下一次計算中調整輸入值以補償這些誤差,使得總和更精確。我比較的對象是剛學習這堂課的自己。剛開始接觸這門課時,我其實沒有足夠的耐心去完整閱讀教材,總是急於進展,結果反而陷入挫折感當中。那時候的我一度感到迷惘,也逐漸對自己失去了信心。
不過現在我想通了。這幾天,我重新靜下心來,把老師提供的教材從頭到尾仔細看了一遍。我意識到自己雖然已經落後了幾週的進度,但我並不打算放棄。相反地,我希望能在剩下的幾週中,全力以赴彌補過去的不足。
我也開始思考一個期末專案的方向,想要做一個與 Linux kernel 有關的專案,嘗試解決一個真實存在的問題。
從這個故事中,我學到了一件非常重要的事——知識就是力量。光有熱情與努力,並不足以讓事情真正推動起來。這個故事也讓我回想起大學時,和朋友們一起進行的各種計畫。那時候,我們常因為不熟悉其他領域的知識,導致許多問題處理起來格外吃力。久而久之,這些困難逐漸消磨了大家的熱情,最終許多計畫都不了了之。對我而言,裡面有一句話特別深刻、也非常受用:
「Jserv 說:你不能現在就放棄。要是現在就放棄的話,將來遇到這種等級的困難時,你只會選擇逃避。」好友 F 補充道:「而且你會一輩子被他笑。」
我正在修習 Linux 這門課,坦白說,心態常常崩潰。我常常想:為什麼這個世界進步得這麼快?為什麼我都不知道這些事?是不是我真的能力太差?雖然我不是從很有名的大學推甄到成功大學,但在我原本的學校中,我的表現其實一直不差。那為什麼我和這堂課的同學差距這麼大?這種無力感與挫折感一天天加重,讓我開始害怕去接觸這門課的知識。我甚至不知道自己該怎麼辦才好。不過,看完這篇文章後,我重新找回了一些信心。也讓我想起老師常說的一句話:「誠實面對自己」。即便自己的程度真的不夠好,只要願意正視問題、勇敢補足不足,那就不需要感到可恥。反正缺什麼,就補什麼。
我自己上網查了部分主流公司,每間公司都有開放出與 Linux kernel develope 的職缺,曾經也在成大的 seminar 上詢問某科技公司的講者,也告訴我會有 linux kernel 開發經驗是非常不錯的,因為有許多人都還不會與 kernel 溝通,所以在這堂課的期末專題,我想開發關於 linux kernel 相關的專案。
我自己感興趣的專案就是: kxo, 並行程式設計, 虛擬化和容器化, 檔案系統
閱讀內容: