---
tags: lab0-c, linux2023
---
# 2023q1 Homework1 (quiz1)
contributed by < `EdwardCKC` >
## [測驗 `1`](https://hackmd.io/@sysprog/linux2023-quiz1#%E6%B8%AC%E9%A9%97-1)
問題: `struct list_head head` and `struct list_head *head` 之間分別是?
我的理解:一個是 struct 一個是 pointer
延伸問題:但為什麼要用在這裡,它的在優缺點又是什麼?
```
struct list_head list_less, list_greater;
INIT_LIST_HEAD(&list_less);
INIT_LIST_HEAD(&list_greater);
```
* 解釋上述程式碼運作原理
* 針對 Quick sort 提出上述程式碼的改進方案並實作
* 引入上述的 hybrid sort 策略並在 Linux 核心風格的 circular doubly-linked list 實作,需要量化性能表現並探討不同資料集 (data set) 的影響
* BONUS: 嘗試對 Linux 核心提出排序程式碼改進的貢獻
### 運作原理
`list_first_entry (ptr, type, member)`
從 [Arguments](https://www.kernel.org/doc/html/latest/core-api/kernel-api.html#c.list_first_entry) 得知 AAA 是要放 struct 的 type,而 BBB 是要放 list_head 的名稱
``` cpp
struct item *pivot = list_first_entry(head, AAA, BBB);
list_del(&pivot->list);
```
因為`pivot` 是 `struct item` 所以 AAA 是 ```struct item```
```cpp!
struct item {
uint16_t i;
struct list_head list;
};
```
根據 `struct item` BBB 是 `list`
```cpp
CCC (itm, is, head, list) {
if (cmpint(&itm->i, &pivot->i) < 0)
DDD (&itm->list, &list_less);
else
EEE (&itm->list, &list_greater);
};
```
因為要走訪list,所以一定是 list_for_each_entry ,還有因為有4個參數,所以 `CCC` 是 `list_for_each_entry_safe`
cmpint 後就是根據條件式分別移動到 `list_less` / `list_greater` 所以 DDD 和 EEE 可能是 `list_move` / `list_move_tail`
之後問了ChatGPT哪個會比較好
問: I guest DDD and EEE are list_move or list_move_tail, but I don't know which is better
答: It depends on the specific use case and requirements of the program. If preserving the order of the original list is not important, then **list_move_tail may be a better choice as it adds elements to the end of the new list, which can improve performance in some cases.** On the other hand, if the order of the original list needs to be preserved, then list_move may be a better choice. Ultimately, the choice between these functions should be based on the specific needs of the program and the performance characteristics of the data structures being used.
這裡因為後面會做 `list_sort` 所以 DDD 和 `EEE` 會選 `list_move_tail`
最後 `FFF` 是 `list_splice_tail` 因為是正序排序,所以是串接 `list_less` 的尾端,整合成完整的 sorted list
## [測驗 `2`](https://hackmd.io/@sysprog/linux2023-quiz1#%E6%B8%AC%E9%A9%97-2)
## [測驗 `3`](https://hackmd.io/@sysprog/linux2023-quiz1#%E6%B8%AC%E9%A9%97-3)
`XOR_COMP` function 是將2個 pointer 做 XOR 運算 所以 `LLLL` 是 `(uintptr_t) a ^ (uintptr_t) b`