---
tags: linux2023
---
# 2023q1 Homework1 (quiz1)
contributed by < [paintako](https://github.com/Paintako) >
> [題目](https://hackmd.io/@sysprog/linux2023-quiz1)
## 開發環境
```shell
$ gcc --version
gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 43 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: AuthenticAMD
Model name: AMD Ryzen 7 1700 Eight-Core Processor
CPU family: 23
Model: 1
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 1
Stepping: 1
Frequency boost: enabled
CPU max MHz: 3000.0000
CPU min MHz: 1550.0000
BogoMIPS: 5987.96
```
## 測驗一
:::warning
不用列出上述答案項目,專注於程式碼和背後的原理。
:notes: jserv
>好的了解
:::
- [ ] 解釋程式碼運作原理
取 list 中第一個 entry 作為 `pivot`, 並且移除它
使用 `list_for_each_safe` 迭代, 需要注意的是, 並且用 `itm` 作為當前節點, 如果此點小於 `pivot` , 將此點移到 `list_less` 最後, 反之移到 `list_greater` 中
分成左右兩邊後 ( `list_less` 以及 `list_greater` ), 遞迴的下去呼叫 `list_sort`,
再將 pivot 加回串列中,並用 `list_splice` 將 `list_less` 加到 `head` 後, `pivot` 之前再執行 `list_splice_tail` 將 `list_greater` 加回結尾完成排序。
- [ ] 改進方案
`pivot` 挑選問題, 如果原本節點內的排列方式是由大到小, 那此方法的複雜度: $O(n^2)$
若要改善此問題, 那每次挑 `pivot` 時可隨機挑選而不是挑固定位置
**延伸問題**
- [ ] 針對 [Quick sort](https://en.wikipedia.org/wiki/Quicksort) 提出程式碼的改進方案並實作
- [ ] 引入 hybrid sort 策略並在 Linux 核心風格的 circular doubly-linked list 實作,需要量化性能表現並探討不同資料集 (data set) 的影響
- [ ] ==BONUS==: 嘗試對 Linux 核心提出排序程式碼改進的貢獻
## 測驗二
- [ ] 改進方案
與其直接宣告一個 `MAX_DEPTH 512` 大小的陣列, 不如在需要增加 `stack top` 時在 malloc 一塊新的空間給其使用 ( in heap memory) , 這樣可以避免 `stack memory` 一大塊空間被佔住, 但需要在程式結束前自己手動 `free`, 原本的作法離開 function 時系統就會自動回收掉 `list_head stack[MAX_DEPTH]` 所佔用的記憶體