contributed by < nosba0957
>
在 /linux/kernel/module/main.c
中的 load_module
函式中可以找到 simplfy_symbols 函式的呼叫,在 simplify_symbols
內看到 case SHN_UNDEF:
內呼叫 resolve_symbol_wait
再呼叫到 resolve_symbol
。最後找到 find_symbol 函式,其中使用到 list_for_each_entry_rcu
。再深入查看可以在 find_exported_symbol_in_section 找到 bsearch
,在 include/linux/bsearch.h 可以看到 bsearch 的實作,也就是透過 binary search 找到 symbol。MODULE_LICENSE
的影響是若此核心模組宣告非為 GPL
,則其無法使用透過 EXPORT_SYMBOL_GPL
的 symbol。從 strace 中看到的系統呼叫有,mmap
,mprotect
,fstat
,fcntl
等。
在 simrupt.c 中有三個 mutex lock,read_lock, consumer_lock, producer_lock
。在 simrupt_work_func
中呼叫 fast_buf_get
的時候使用到 consumer_lock
,保護 fast_buf_get
中 ring->buf[tail]
和 ring->tail
的讀取。而 produce_lock
則是為了保護 produce_data
中,將值存入 rx_fifo
的操作。而 read_lock
是在 simrupt_read
中,也就是當這個核心模組被讀取時,用來保護 kfifo_to_user
這個函式執行。
lib/sort.c
在 Bottem-up heapsort 第一步驟要先建立 heap,bottom-up-reheap
總共執行 次,而 bottom-up-reheap
由三個函式組成。
leaf-search
首先是 leaf-search
。由於 heap 插入時會先將節點新增在 array 的最後方,所以 heap 必為 complete binary tree,除了最後一層沒有填滿以外,其他層都是填滿的。並且最後一層要先從左側插入。所以分析比較次數時先分析 perfect binary tree。此 binary tree 共有 層(從第 層 ~ 第 層)。第 層找到 special leaf 所需要的比較次數為 次。第 層需要 次。而第 層有 1 個節點,第 層有 個節點。而前面提到 bottom-up-reheap
會執行 次,所以 leaf-search
會從 第 個節點執行到第 個節點。所以要總和所有比較次數
接下來計算沒有填滿節點的最後一層。若該層只有 1 個節點,則對其親代節點的比較次數沒有影響。如左下圖,即使 special path 選擇到 2,也只有走到 4 這一個結果。若是有 2 個節點,如右下圖,則會讓 9
和 10
的親代節點多 1 次比較次數。
設第 層有 個節點,計算此 個節點在 worst-case 會新增多少比較次數。此 個節點的親代共 個節點會受影響,再上一層(第 層)有 節點也會多 1 次比較次數。所以將受影響的節點次數相加
所以 worst-case 情況,比較次數為 perfect binary tree 的比較次數加上最後一層新增的 個節點在 worst-case 情況的次數。
接下來是新增此 個節點時,情況是 best-case 的比較次數。best-case 的情況是在根節點到最後一個節點的路徑上,路徑中的節點進行 leaf-search
時直接指向右節點,會少一次比較次數。這條路徑上共有 個節點。所以 best-case 的比較次數為
最後論文總結 best-case 和 worst-case 的比較次數相近。所以以 表示。
buttom-up-search
分析 heapsort 和 bottom-up search 的比較次數。heapsort 每次 comparison 時,要先比較其底下的 2 個子節點,選出小的子節點(min-heap)後再將自己和那個子節點比,所以需要 2 次比較次數。 用來描述 special path 路徑上的節點,總長度為 且不包含 root。設 為 root,此處的 是我們要找到 。
heapsort | |||
buttom-up search |
用 表示 heapsort 比較次數的一半, 表示 buttom-up search 的比較次數。因為 buttom-up reheap 會執行 次, buttom-up search 也會執行 次。所以目標是算出 buttom-up search 的比較次數。 這三個隨機變數,代表 的總和。所以現在目標是要計算 。
為了計算 ,論文提供 heapsort 在 heap creation phase 的平均比較次數為 ,平均 interchange 次數為 。並且論文中推算出 。但我想不出 是如何計算的。
接下來假設 是呼叫 bottom-up search 時情況為 的呼叫次數。而 則為情況是 的呼叫次數。
接下來計算其中 , 的情況為 ,所以分成兩部分討論。首先 表示要執行到根節點。若某 subtree 有 r 個節點,則根節點的機率為 。允許 的誤差,從 perfect binary tree 的倒數第 2 層(第 層)來看,約有 個子樹,每個子樹有 3 個節點。再往上一層(第 層),約有 個子樹,每個子樹有 7 個節點。所以可以推算當有 個子樹,每個子樹會有 個節點。所以根節點的機率為 。計算 中 的部分,,其中
接下來計算 中 的部分。在原版 heapsort 的 reheap 中,比較次數為 ,interchange 次數為 ,special object 的子代節點數量為 。可以用算式 表示。interchange 的係數為 2 是因為 reheap 要先比較該節點的兩個子節點的數值大小,再比較該節點和其子節點中數值小的節點,才會進行 interchange。而 s 是因為 的情況下,reheap 會一直往下直到葉節點,所以比較次數和 special path 的最後一組子代節點有關。接下來透過隨機變數 代表 的總和。而 在前面論文有直接提供。
要計算 中 ,也就是要計算 special object 在葉節點的期望值。所以透過 來計算 的期望值,也就是 special object 沒有子代節點的情況。 有三種可能性,。其中 的情況如下圖, 的情況表示 special object 為 5 號節點,且 reheap 的節點在 的路徑上才會發生,共 次。當 夠大時可以忽略。
所以計算 ,而 。 為 和 的機率。
而 則為 ,所以 。接下來可以計算 中 的部分,也就是
總和 ,計算出 ,再帶回計算
所以可以總結出在 heap creation phase 的 buttom-up reheap 的比較次數為