目的: 檢驗學員對 bitwise, alignment, C 語言程式設計的認知
作答表單: 測驗 1-2 (針對 Linux 核心「設計」課程)
作答表單: 測驗 3-4 (針對 Linux 核心「實作」課程)
1
考慮一個 Tree sort 的實作,搭配 Red–black tree 作為排序所需的自我平衡樹,原始程式碼可見 treesort.c。部分程式碼已遮蔽,請補完程式碼,使其運作符合預期。
作答規範:
AAAA
: 利用〈你所不知道的 C 語言:記憶體管理、對齊及硬體特性〉提到利用 ABI 特性來「標示不用的節點」手段,以 bitwise 操作,對給定的引數 (r)
計算合法的記憶體地址 (記得要考慮 alignment)。BBBB
和 CCCC
: 運用〈你所不知道的 C 語言:數值系統篇〉和〈你所不知道的 C 語言: bitwise 操作〉,以 bitwise 操作分別設定紅黑數節點的顏色。DDDD
, EEEE
, HHHH
是 C 語言敘述FFFF
和 GGGG
則運用〈你所不知道的 C 語言: linked list 和非連續記憶體〉,是合法的 C 語言敘述r | 1
;
,並該依循 CONTRIBUTING.md 程式碼風格規範 (注意空白!),用最精簡的程式碼書寫延伸問題:
treesort.c
程式碼的缺失並改進treesort.c
實作手法,指出後者的改進空間並予以實作2
考慮一個使用 AVL tree 實作的 priority queue,部分程式碼如下:
其中 avltree.h
的程式碼可見 avltree.h。部分程式碼已遮蔽,請補完程式碼,使其運作符合預期。
作答規範:
IIII
, JJJJ
, KKKK
, LLLL
利用〈你所不知道的 C 語言:記憶體管理、對齊及硬體特性〉提到利用 ABI 特性來「標示不用的節點」手段,以 bitwise 操作,計算合法的記憶體地址 (記得要考慮 alignment)。MMMM
和 NNNN
為函式名稱r | 1
;
,並該依循 CONTRIBUTING.md 程式碼風格規範 (注意空白!),用最精簡的程式碼書寫延伸問題
見 commit b145425
rbtree.h
,探究是否可用後者替換,從而爭取到貢獻程式碼到 Linux 核心的機會3
Linear feedback shift register (LFSR) 是指給定前一狀態,將該輸出的線性函數作為輸入的移位暫存器,其應用包括 PRNG 場景。
LFSR 範例:
s[n+1] = s[n]*p[2] ^ s[n-1]*p[1] ^ s[n-2]*p[0]
考慮一個運用 LFSR 來產生隨機數,並使其均勻分佈於 64 位元無號整數的有效空間 (distribution of uniformly arbitrarily large uint64_t
)。參考執行輸出如下:
程式碼可參見 bucket_uniform.c (部分程式碼遮蔽):
log2_64
: 計算以 2 為底的 x 的對數 (logarithm of x to the base b),且下取整函數 (floor)bucket_number
: 在指定區間內,使產生的 LFSR 數值得以均勻分佈請補上程式碼,使程式碼的執行結果符合參考輸出。作答規範:
AAAA
, BBBB
, CCCC
, DDDD
, EEEE
, FFFF
, GGGG
, HHHH
皆為大於或等於 0
的整數IIII
和 JJJJ
是 mask111
或 mask011
延伸問題:
git log
和 grep
找出 LFSR 的應用案例lab0-c
提供類似的實作 log2_lshift16.h,解釋其原理並嘗試改進其效能4
已知輸入必為大於 0
的數值 (即 x > 0
),以下程式碼可計算 ,也就是 ceil 和 log2 的組合並轉型為整數:
請補完,使其行為符合預期。作答規範:
KKKK
應以最簡潔的形式撰寫,且符合作業一排版規範 (近似 Linux 核心程式碼排版風格)KKKK
為表示式,限制使用 ^
, &
, |
, <<
, >
> 這幾個運算子,可能會出現常數KKKK
不該包含小括號 (即 (
和 )
)r
, shift
, x
KKKK
不可包含 ,
和 ;
這樣的分隔符號 (separator)延伸問題:
x = 0
的狀況,並仍是 branchless善用 lxr 和
git log