版本 c60f3874f7ae35f0f1fe167020dee0a96a34e2f5
Changes from c60f3874f7ae35f0f1fe167020dee0a96a34e2f5 to 541b1fdd922abfc6434e6107f94512e28eb2de51
yellow951321(黃致豪)
------------------
**Information:**
- 成功大學 資訊工程學系110級
Github: https://github.com/yellow951321
2021 linux 核心設計 春季班 自我評量
================================
期末專題:
- quiz3 - SSO/CoW [hackmd](https://hackmd.io/i24l0X5wQLmE1U4a0myROg?view)
學期回顧
================================
a) 知道 x - y < 0 敘述為何不能寫為 x < y 嗎? (CS:APP 第 2 章)
由課程講義的 [CS:APP 第 2 章重點提示和練習](https://hackmd.io/@sysprog/CSAPP-ch2) 可知道,當有號數和無號數在做比較時,有號數負會被轉換成 2 補數,反而正值大於負值。但 x - y 則不會發生此錯誤,因此可能會造成前者和後者的結果不同的情況。
b) 知道 C 語言規格書如何解釋 ptr++ 和 *ptr++ 行為的差異嗎?
在 ISO/IEC 9899 中提到
* ISO/IEC 9899:1999 [6.5.6-8] Additive operators
> When an expression that has integer type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object, and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integer expression.
因此,前者是對地址做運算。而後者 *ptr 會是 arithmetic type ,對裡面的數值做運算。
h) 知道如何寫出時間複雜度和空間複雜度皆為 O(1) 的 abs64 嗎?(沒有分支) 這樣的 abs64 又可用於真實世界哪邊?
`#define abs(num) (((num >> 63) ^ num) - (num >> 63))`
* 假如為負數,則取 2 補數 (toggle num - 1),正數則不必做動作。
* num >> 63 在 num 小於 1 時會是 -1 也就是 111..111 ,和 num 做 ^ 運算後 會得到 num 的 toggle 。而在 num 大於等於 0 時則會是 0 , 0 ^ num = num。
* 因此在 num 小於 0 時 abs(num) = num ^ -1 + 1 也就是 num 的互補數。 num 大於 0 時則不會影響到。
現實中,駭客可以透過執行時間來猜測出機密資訊。因此,盡量將執行時間一致可以減少這一部分的資安問題。
p) 知道 locality of reference 嗎?請以本學期教材或作業的程式碼,說明 locality 對於 cache 的影響
在 [CS:APP 第 6 章重點提示](https://hackmd.io/@sysprog/CSAPP-ch6?type=view),提到由於, spatial locality 的特性,當我們在 reference 一份資料的時候容易會 reference。因此在實作 cache 時, cache 的大小以及內容可以很大程度上影響到程式的運作速度。
自我評量 (1 ~ 10) Self-assessment
=================================
起初的最一開始的 lab0 就給了我很大的震撼, lab0 本身對我來說還是可以應付的難度,但是在延伸問題以及用來做效能分析的種種工具對我來說很陌生。尤其是延伸問題,延伸問題大多數是要對現有的程式碼做改進或者是探討其中的機制的優點和缺點,這類沒有標準答案的問題對我來說就跟噩夢一樣,至少讓我自己認識到了我在這方面的不足,希望我能夠加強起來。除此之外,上課內容裡也不斷重複提到一些我早就已經聽過的概念,在 c 語言上,例如 linked-list, bit-wise,以及並行程式。而在理論科目上也提到了之前 os 曾經教過的排程相關議題。但是,同樣的議題在這堂課的補充教材裡,對我來說卻是陌生的。讓我知道自己曾經學習的目的單單只是為了考試而背起來,沒有完整的將這些知識連結起來成為自己的東西。在落後的前提下,我卻沒有花上足夠時間追上別人的腳步。在期末專題上,我至少在瀏覽完大家的貢獻後統整成一份共筆希望能夠對這堂課有所貢獻。
這堂課我給自己 6 分,給至少有參與課堂到最後的我的基本分。