分享到plurk 分享到twitter 分享到facebook

yutingshih (施宇庭)

簡介

2024 Linux 核心實作 春季班 自我評量

成果發表和貢獻

評分標準:每個 non-trivial 貢獻得 2 分,教材勘誤每次得 0.5 分,各項貢獻得分加總後四捨五入,最高 10 分。

閱讀教材過程中有發現錯誤,並記錄在期末專題的筆記中以 warning 區塊標示,共計三處各得 0.5 分。新增和修改內容的部分四項各拿 2 分。

本項得分:\(\text{min}(10, \text{round}(0.5 + 0.5 + 0.5 + 2 + 2 + 2 + 2)) = 10\) 分。

作業/隨堂測驗

評分標準:下列每項作業 0 ~ 2.5 分,加總後四捨五入至整數位。

第一次作業使用 Linux linked list API 實現了佇列,並分析 merge sort 最佳及最差情況的時間複雜度,得 2 分。作業二僅做到部分題目的程式碼理解,並未作出改進,得 1.5 分,第五次作業進行了〈因為自動飲料機而延畢的那一年〉的閱讀、針對課程教材提問,以及期末專題的提案,得 2 分。

本項得分:\(\text{min}(10, \text{round}(2 + 1.5 + 2)) = 6\)

期末專題

《Concurrency Primer》校訂和範例撰寫:HackMD / GitHub / Slides / Video

由於過去未曾學習過 concurrency 相關議題,因此在這兩個月中,我從閱讀《並行與多執行緒程式設計》系列講座開始,逐步建立基礎知識,將我的認知與偶然在教材中發現的若干錯誤記錄於專題開發紀錄當中。

在第二個月,我開始閱讀專題指定材料,即 Russ Cox 所寫的 〈Hardware Memory Models〉和〈Programming Language Memory Models〉,消化後貢獻 sequential consistencyx86/ARM memory consistency models 至《並行與多執行緒程式設計》系列講座,以及貢獻 memory consistency models 至《Concurrency Primer》當中。

最後我自主閱讀了論文《Litmus Tests for Comparing Memory Consistency Models: How Long Do They Need to Be?》學習如何用數學語言描述程式的執行順序及 memory consistency model,並將 執行順序的數學描述 貢獻至《並行與多執行緒程式設計》系列講座,能夠在這麼短的時間內理解艱深的內容,理出自己的思考脈絡並做出貢獻,超出我最初的預期,因此在開發過程與成果產出這個項目我給自己滿分 10 分。

本項得分:\(10\)

與授課教師的互動

  • 2024/05/09 15:30 一對一討論:討論專題方向
  • 2024/07/06 16:30 一對一討論:專題成果分享與教材修訂貢獻

我這學期在課堂上都沒有被點到過,第一次和老師互動是為了討論期末專題方向,在這次討論中除了確定專題方向外,我的收穫和啟發如下:

  • 老師針對我在第五次作業 assessment 中提出的問題進行解惑,並指出我在課堂的投入有待加強,額外多花了時間幫我「補課」,原本預約半個小時的 office hour 直接延長到了一個小時,從 read-modify-write 和 test-and-set 等 atomic 相關概念,一直到 reference count 的應用,並舉實例:Facebook 的「倒讚」功能曾因為並行程式實作的缺陷,而導致有貼文的讚數變成負值的狀況,藉此說明並行程式的重要性。我沒有想到老師竟然會這麼有耐心,原本因為作業進度跟不太上而處於半放棄狀態的我受到了激勵,重新對自己有了期待,因此在接下來的專題更加認真,扎實打穩基礎,最後也確實做出實際的成果。
  • 此外在對談的過程中老師不斷糾正我說話的方式,太過客氣、模稜兩可都無助於溝通,以往我並沒有意識到自己講話會有這樣的毛病,但作為工程師,最重要的是溝通,不只書寫要精確,連說話也是。

在期末專題進行到一個階段,有具體產出後,我向老師預約了第二次 office hour,討論教材修訂的貢獻如何獲得採納,內容簡記如下:

  • concurrency-primer 的修訂
    • 關於 memory orders 的介紹,應該著重於其動機,也就是為了確保多執行緒程式在現代處理器和編譯器各種的最佳化下仍能有正確的執行結果,而非教科書式的講解 memory order 的定義
    • memory consistency model 目前已經對 sequential consistency、x86-TSO、ARM memory model 做了說明,需要再加上 relaxed model 的描述和範例,以及 C11 所提供的各項對應操作
  • 實驗討論
    • 除了教材的修訂以外,我也嘗試自行做了一些實驗來應用所學,探討不同 memory order 對於程式效能的影響,但結果不如我所預期,老師點出我實驗設計的方式有問題,一是未考慮到 cache 的影響,二是採用的 timer 的精度不足,應改採用以下方式:
      • cache flushing: clflush
      • high resolution timers (HRT): clock_gettime

這次討論我發現自己比起兩個月前的自己進步許多,能夠和老師有更多技術上的實質討論,而非只是被動接收老師給的資訊;在口語表達方面,我也特別注意誠實表達,避免閃閃躲躲,在整個討論中沒有讓老師再次糾正相同的問題。

除了和老師的一對一討論之外,我也有認真參與課堂討論,例如在 2024-03-19 的課堂討論中老師問到 merge sort 最佳和最差狀況的複雜度,以及如何確保測試有涵蓋到演算法的最差狀況,除了課堂上有認真跟著思考,回家後我也自己仔細推導 merge sort 效能分析 算出最佳和最差狀況的時間複雜度,並參考其他人的做法嘗試建構能夠涵蓋到最差狀況的測試程式,讓我體驗到即便是一個小小的排序程式,都能夠有這麼多討論和改進的空間,同時也欽佩課堂上的同學靈活的思考,能夠提出這麼多元的解法。

本項得分:\(10\)

所見所聞所感

在閱讀〈因為自動飲料機而延畢的那一年〉,裡面提到:「你最大的問題在太害怕失敗了,既然都已經決定要延畢做飲料機了,那就要好好做,才不會辜負當初自己的期望。」這句話讓我很有共鳴,一直以來我都有個壞習慣,對於困難的目標,很常會下意識告訴自己不可能完成,進而失去動力想躺平,原因就是在於太害怕失敗,回顧自身在本課程的投入狀況,和班上很多同學相比並不算突出,仔細觀察那些時常被老師讚賞的同學,我發現一個很大的差別,就是他們專注於學習本身,因此能夠不斷有突破和成長,與其擔心一些還沒發生的事情而陷入內耗,不如起身行動,畢竟「既然都已經決定要修 Linux 了,那就要好好做,才不會辜負當初自己的期望。」 在認知到自己的瓶頸後,我開始試圖改善這樣的困境,例如在 2024-05-23 的直播課 KVM: Linux 虛擬化基礎建設中開始跟著做筆記,而非只是聽過就忘,在執行期末專題時,專注在學習上,好好把基礎打穩,不要被前半學期表現不佳的自己所影響,最後也確實得到了好的成果,正如同老師從第一堂課就一直不斷提到的「誠實面對自己」是翻身的第一步,這是我在這堂課上最大的收穫。

本項得分:\(10\)

研究生學習回顧

評分標準:每封符合課程規定的學習回顧信件得 2.5 分,加總後四捨五入。

  • 四月學習回顧 (2024/05/05):簡述在 lab0-c 學到 Linux 風格的 list API、學習閱讀 C 語言規格書等第一手資料、活用 Git 進行程式碼開發並於實驗室推廣
  • 五月學習回顧 (2024/06/30):分享在並行程式設計的學習心得、期末專題嘗試貢獻《並行與多執行緒程式設計》和《Concurrency Primer》,以及未來可能對實驗室的幫助

這個項目要求整學期總共要寄出四封學習回顧信件,我只有兩次學習回顧信件符合標準 (準時寄出且有副本給授課教師),因此只拿一半的分數。

本項得分:\(\text{round}(2.5 + 2.5) = 5\)

自我評量 (1 ~ 10)

方案 B:\(1 + \lfloor \sqrt[5]{10 \times 6 \times 10 \times 10 \times 10 \times 5} \rfloor = 9\)