contributed by < teresasa0731
>
Multiple GCC Versions on Ubuntu
原本的 gcc 是 11.4.0 版本,無法編譯ksort,故先安裝 gcc-12。
安裝參考
insmod
後,Linux 核心模組的符號 (symbol) 如何被 Linux 核心找到 (使用 List API)、MODULE_LICENSE
巨集指定的授權條款又對核心有什麼影響 (GPL 與否對於可用的符號列表有關),以及藉由 strace 追蹤 Linux 核心的掛載,涉及哪些系統呼叫和子系統?
〈Linux 核心模組運作原理〉列出的程式碼較舊,歡迎編輯頁面,更新到 Linux v6.1 以上。
參照 2021 年的筆記。歡迎貢獻 LKMPG!
搭配閱讀〈並行和多執行緒程式設計〉
搭配閱讀《Demystifying the Linux CPU Scheduler》
xoroshiro128+
的原理 (對照〈Scrambled Linear Pseudorandom Number Generators〉論文),並利用 ksort 提供的 xoro
核心模組,比較 Linux 核心內建的 /dev/random
及 /dev/urandom
的速度,說明 xoroshiro128+
是否有速度的優勢?其弱點又是什麼?
搭配閱讀: 不亂的「亂數」
在linux kernel 中有提供 workqueue 的機制用來存放工作項目,以下探討舊的 workqueue 存在什麼問題以至於需要引入 CMWQ ?以及新的 CMWQ 怎麼實現呼叫功能 & 與舊的系統相容。
在非同步執行環境中會定義 work,相應處理的線程稱之 worker,並以 workqueue 來儲存工作項目。根據原本 wq 設計,單線程 (single-thread, ST) wq 在整個系統中只有一個工作線程;多線程(multi-thread, MT)在每一個 CPU 都有一個工作線程,前者會有 deadlock 問題,後者則是隨著 CPU 核心增加而創建大量工作線程,進一步導致 PID 空間浪費。
CMWQ 重新設計 wq 實作方式:
CMWQ 提出 worker pool (類似一種 thread pool),在系統中存在 worker pools 不與特定 wq 相關連而是所有 wq 共享,並根據 flag 交付該 work 給 某個 worker pool。
When a work item is queued to a workqueue, the target worker-pool is determined according to the queue parameters and workqueue attributes and appended on the shared worklist of the worker-pool. For example, unless specifically overridden, a work item of a bound workqueue will be queued on the worklist of either normal or highpri worker-pool that is associated to the CPU the issuer is running on.
根據linux 程式碼 /include/linux/workqueue.h可以看到在 struct workqueue_attrs
定義了 wq 的屬性,其中有 cpumask_var_t cpumask
來限定 work 分配到的 CPU
Work items in this workqueue are affine to these CPUs and not allowed to execute on other CPUs. A pool serving a workqueue must have the same @cpumask.
此處提及使用此遮罩可以限定在與工作提交相同的 CPU 上執行,也就是說在同一 wq 的資源持必須有相同 @cpumask,避免工作在 CPU 間遷移,盡可能使用 CPU 快取的區域局部性。而在 /kernel/workqueue.c 則透過 workqueue_init_early()
函式來進行初始化的設定,包含 記憶體分配、cpumasks 和 idr。
在 ksort/sort_impl.c 中引入了 linux/workqueue.h
。根據 qsort_algo()
邏輯,可以看到當元素數量小於 7 時會使用 Insertion Sort:
元素數目大於 7 時則改用 Quick Sort 排序:
而若是沒有發生交換,即swap_cnt == 0
,則切換回插入排序;若是交換次數超過閾值 r = 1 + n / 4
則會跳入並行處理區間 nevermind:
若是分區後左右子陣列都大於 100 ,此時會分配新的 qsort
結構給左子陣列並加入 wq 並行處理