版本 d6f0e5658b2844ee7807fd40204340fb3b4e1f62
User/gyes00205
gyes00205(許嘉倫)
簡介:
- 成功大學 資訊工程學系110級
Github: gyes00205
2021 linux 核心設計 春季班 自我評量
(春季班)課堂作業
(春季班)期末專題
(春季班)學期回顧
知道 x - y < 0 敘述為何不能寫為 x < y 嗎? (CS:APP 第 2 章)
如果 x 為有號數, y 為無號數,在 x < y 的情況下, x 會轉換為無號數。
- x = -1, y = 0
- x - y < 0 為 True
- x < y 為 False ,因為此時的 x 會視為無號數相當於 \(2^{32} - 1\)
- x = -1, y = 0
知道如何寫出時間複雜度和空間複雜度皆為 O(1) 的 abs64 嗎?(沒有分支) 這樣的 abs64 又可用於真實世界哪邊?
這邊的位移方式採用 Arithmetic shift (算數位移) * 如果 x
為正數 >> 63
會得到 0x0000000000000000 => 0 * (x + mask) ^ mask
會等於 x
* 如果 x
為負數 >> 63
會得到 0xFFFFFFFFFFFFFFFF => -1 * (x + mask) ^ mask
相當於 ~(x - 1)
- 可以應用資訊安全領域(時序攻擊),如果有分支的話會導致執行時間的不一致
- 像是在輸入密碼時,如果錯誤密碼與正確密碼存在時間差,那麼駭客就可以從這時間差推測是第幾個字輸入錯誤。
本學期課程內容中,讓你印象最深刻、顛覆過往認知的部分是什麼?請舉例說明
最讓我印象深刻的部分是第一個禮拜所教的內容 pointer to pointer ,雖然在大一的時候就有學過,但那時聽不太懂,剛好作業的部分也沒有使用到,因此自己就草草帶過,沒想到在大四的時候又遇到這個問題。在 quiz1 有一個
list_free
function ,因為當時還不太了解 pointer to pointer 的使用時機,所以一開始寫的版本如下。static void list_free(node_t **list) { while (*list) { node_t *tmp = *list; list = &((*list)->next); free(tmp); } }
之後與老師一對一討論時提出這個問題,才得知原來只有在更改 linked list 的指標時, pointer to pointer 的技巧才有存在的必要,如果要釋放記憶體內容用一個 pointer 就好,解決方法如下
(春季班)所見所聞心得
這學期初老師上課有提到,每個禮拜至少花20小時的時間在這門課上,因為前幾個禮拜其他科目都還沒出作業,所以我確實有達到這項要求,但隨著時間的推移,其他科目陸續指派功課花在這門課的時間也越來越少,但最後還是選擇留下來,因為我認為 Linux 核心設計 這門課可以讓我了解到自己的不足,雖然已經讀到大四快畢業,但這時候才了解到 pointer to pointer 的使用方式與技巧。此外大三學過的作業系統概念到了這門課還是會反覆提起,有一次上課時老師走到我旁邊問我生產者消費者問題,但那時的我早已忘光光,因此回答不上來。
如果有人問我說在這門課有學到甚麼?那麼應該是 bitwise operation 的操作吧,像是沒有分支版本的abs以及判斷正數負數的方法,都是在這門課學到的,原本的想法可能就是用if-else來判斷正負數,沒想過可以用bitwise operation來達到沒有分支的版本。
(春季班)自我評量
這堂課我給自己 7 分。