contributed by < st9540808
>
有一些操作只能用 macro 實作像是 list_for_each
,需要展開成 for 才能支援這種循序走訪。
一般的 function call,caller 需要把引數放到 stack 中,新增一段新的 stack,並在回傳時收回,macro 沒有這些操作的成本
參考: x86 calling convention
v4.20.13 kernel/sched/sched.h, line 228
struct rq
是 linux 中的 runqueue,裡面有兩個成員struct cfs_rq cfs
CFS 的排程器和struct rt_rq rt
即時排程器的 runqueue,即時任務總共有 100 個優先級 (0-99),所以在struct rt_rq rt
中有一個struct rt_prio_array
的實體active
,對應的 runnable 及時任務會被放在相對應優先級的 runqueue 中
列出 Linux 核心版本並 解說
只有列出結構體,不能算是解說,而要廣泛提及針對該結構體做了哪些 linked list 操作,又考量點為何
queue_t
和 list_ele_t
的定義是從 lab0 引入,在兩者中都加入 struct list_head
,以便最終能夠支援 qtest
merge sort 需要兩個輔助的函式以便實作 list_merge_sort()
,兩個函式的說明如下:
get_middle()
: 回傳一個 list 中,位於中間節點的位址list_merge()
: 合併兩個已排序的 listget_middle()
使用兩個指標 fast slow
來走訪 list,fast
一次會前進 2 個節點,slow
一次會前進 1 個。
參考: Floyd Cycle Detection Algorithm
list_merge()
將兩個已排序好的 list lhs rhs
合併在一起並傳給 head
,因為排序對象是字串,排序完要變成字典序,所以用 strcmp()
比較兩個字串在字典中的順序,
list_merge_sort()
合併排序的主演算法,全部使用 list_*
的操作
left
,右邊的在 q
list_merge_sort(&left); list_merge_sort(q);
q
merge sort 與 quick sort 的效能比較,資料來自 dict 的 cities.txt ,內含九萬多筆城市的字串,並分別對 30000、60000、90000 筆資料做排序,比較兩種演算法對亂序資料的排序效能。
可以看到 quick sort 比起 merge sort 有比較好的效能表現,但如果排序資料是已經排序好的,就會出現 worst case 的時間複雜度。
list_merge()
需要插入 n 個節點,每次比較都要呼叫 strcmp()
,但因為測試資料中字串的最大長度是固定的,所以每次比較需要 。 list_merge_sort()
的時間複雜度可以用以下遞迴式表示:
用 master theorem 可以解以上式子,得到