--- title: lorian0738 (許嘉芸) categories: User ... 簡介 ==== - 國立成功大學 資訊工程所 111 級 (2022 ~ 現在) - 國立清華大學 科技管理學院學士班 22 級 (2018 ~ 2022) * GitHub: [`lorian0738`](https://github.com/lorian0738) * HackMD: [`lorian0738`](https://hackmd.io/@lorian0738) # 2023 Linux 核心實作 自我評量 ## 作業共筆 * lab0-c: [GitHub](https://github.com/lorian0738/lab0-c) / [HackMD](https://hackmd.io/@lorian0738/linux2023q1-lab0) * fibdrv: [GitHub](https://github.com/lorian0738/fibdrv) / [HackMD](https://hackmd.io/@lorian0738/linux2023q1-fibdrv) * assessment: [HackMD](https://hackmd.io/@lorian0738/linux2023q1-assessment) ## 測驗共筆 * quiz2: [HackMD](https://hackmd.io/@lorian0738/linux2023-quiz2) * quiz3: [HackMD](https://hackmd.io/@lorian0738/linux2023-quiz3) * quiz4: [HackMD](https://hackmd.io/@lorian0738/linux2023-quiz4) ## 期末專題 * Linux 核心專題: 〈每位程式開發者都該有的記憶體知識〉校訂: [GitHub](https://github.com/lorian0738/cpumemory-zhtw) / [HackMD](https://hackmd.io/@sysprog/Sk6wB3FS2) ### 一對一討論時間 2023年5月1日 (星期一) ⋅ 下午1:30 – 下午2:00 問題: 1. O(1) scheduler -> CFS 的演化,著重在哪些議題? O(1) 互動效率低,背景行程吞吐量低。 CFS 注重公平性 (fairness),也就是每個任務使用 CPU 的時間要公平,過去O(1) scheduler 保證優先權高的先執行,但如此一來低優先權的行程無法保證在長時間可以執行到。 CFS 引進了 virtual runtime 的概念,讓優先權高的行程其虛擬時間過得比較慢,然後選擇 vruntime 最低的行程,讓搶佔不像 O(1) 是固定值,而是變動的值。 CFS 也包含了 sleeper fairness 的概念, 以確保當前無法運行的任務(例如在等 I/O )在需要時可以獲得相當份量的 CPU。 2. 阿貝爾群對於 IEEE 754 floating point 的影響? 要設計一種計算機編碼,對於加法而言,要實現阿貝爾群,需要符合交換律:需要有 0,且有反元素,使相加等於 0。這樣無論做多少次操作,結果都會落於該群之中,才能在任何情況下 (包括超出範圍) 得到一個「能自圓其說地正確」的結果。 IEEE754 floating point 中,正規化之下,Exponent 的值減去 127 為浮點數表示中 2 的次方,但如此一來就會沒有 0,因此特別定義 Exponent 和 Franction 同時為 0 時,其數值為 0。 而大部分單精度浮點數都有反元素,只要改變第一個 bit 的數值即為他的反元素。 但也有例外,NaN 沒有反元素,無關第一個 bit 為 1 還是 0,都是 NaN,且 NaN 加任何數都是 NaN。 floating point 因為是利用 sign x exponent x fraction 來表達,在越大的數之間雖然存在的整數比較多,但也只能表示和較小的數之間一樣多的值,例如 32-bit 的 floating point,1 和 2 之間可以表達 2^23 個數,4 和 8 之間也只能表達 2^23 個數,導致在做運算的時候無法精確表達數值。IEEE 754 除了有不同 format 的 floating point,也定義了一些規則:rounding mode、required operations、exception handling,讓輸出結果盡量相同。 ## 修課心得 這堂課和以前修過的課真的非常不一樣,有著大量的教材讓我們去看、大量的作業和測驗,也看到了很多神人同學,雖然知道按照自己的步調有學到東西就很好了,但在過去什麼課和作業都會想「完成」的習慣之下,這樣沒有盡頭的任務讓我有時會產生逃避的心理,發現看了很久還是沒辦法把一個內容學會的時候更是很灰心。而老師真的很用心,除了準備了這麼多的教材、和每位學員一對一討論,還分配了不同的期末專題給大家,也是和以前修課完全不一樣的體驗。 在這堂課也感受到資訊變化之快。以前就常聽人說,想讀資工要有持續學習的動力,那時天真地認為,一路以來求學過程中都願意好好地學就足夠了,但在這堂課發現,以前那種學習都是在別人整理好的系統下慢慢學,學完就認為學會了,但是資訊學科卻不是如此,別人整理好的系統性資料在我們閱讀的時候可能就已經不是正確的最新知識了,更何況還有語言的差異,當有人翻譯好的時候,可能又已經更落伍了。 這在期末專題的時候感觸尤深,原本想要慢慢地仔細地讀懂書中的所有內容,卻發現學習速率不對勁,一定趕不上期限。好不容易把第二章讀完決定先來改裡面的內容,但卻在找現代科技發展時感到眼花撩亂,不同公司有不同做法、不同考量,需要理解哪個才是最新的、哪裡的說法才是正確的,在不熟悉的情況下是個很大的挑戰。 不過這些經驗也讓我學習放下所謂「完美主義」--做不完就不願意做的壞習慣,世界的奧妙如此之龐大,本來就不會有全知的一天,應該要正視自己的不足、學多少算多少,不要逃避學習。 ## 自我評量 (1 ~ 10) 我給我自己 8 分。 作業中第一次用了 GitHub,學到了要如何把自己的程式碼發布上去,也在期末專題第一次發了 PR,雖然 commit message 寫得還不是很好,但至少有這個經驗了,未來需要用到的時機應該會很多;也讓我看到 了 Linux 的奧妙、其中程式碼的優美,Linux 中用到了大量的巨集真的是一個非常方便優雅的寫法,有些加減乘除的問題用 bitwise 操作就可以輕鬆解決也讓我開了眼界,雖然還有許多跟不上、不足的地方,但至少踏入一點點 Linux 的世界了。 其實對於自己作業考試和期末都沒有很滿意,雖然花了不少時間但完成的還是很少,尤其期末專題和原本預期完成的差好多。但在不缺學分的情況下,還是要給修到最後沒有退選的自己一點鼓勵,原本想過要旁聽,但這樣投入的時間肯定會更少,還好堅持下來了。不過除了用修課壓力轉為動力之外,希望暑假我也能繼續閱讀這門課的材料,繼續修正期末專題。