PREEMPT_RT
效能分析和改進PREEMPT_RT
首先將中斷處理轉化為核心執行緒,保證它不再佔用任意 context,這保證即便中斷被即時行程搶佔,也不會連累無辜地被它佔用核心堆疊的行程,再者,將一般行程使用的 spinlock 改為可以睡眠的 mutex (所謂的 sleeping spinlock),如此可保證喚醒即時行程後,立即執行該即時行程。PREEMPT_RT
部分的成果已整合進 Linux 核心主幹,不過仍有若干效能議題需要釐清和改進。
探討 Linux 排程器內部設計,並尋求貢獻程式碼到 Linux 核心的機會
研讀《Demystifying the Linux CPU Scheduler》並改進書中論述和實驗
Project C 提供 BMQ (Bit Map Queue),著重於降低高互動性任務 (例如 Linux 桌面應用程式) 的排程延遲 (scheduling latency)。本專案嘗試量化 BMQ 表現,並探討其內部原理,過程中也會比較 BORE 一類的排程器改進方案。
vwifi 是個程式碼約五百行,具體而微的 WiFi 裝置驅動程式,採用 cfg80211 框架。目前 vwifi 支援 scan, connect, disconnect 等 cfg80211 的介面操作,並得以正確處理 Tx/Rx 封包。
Linux 核心儘管已有大量開發者投入,但仍存在改進空間,例如第 8 週隨堂測驗展示 memchr
的實作可藉由 SWAR 技巧予以改進,初步可帶來 4 倍效能提升。這當然是可對 Linux 核心貢獻的機會。
lib/sort.c
解釋 Linux 核心的 lib/sort.c
現有的 bottom-up heap sort 實作,並尋求效能改進,例如 hybrid quick sort 的引入
為了探索 Linux VFS (virtual file system) 介面及檔案系統實作機制,我們從無到有撰寫一個運作於 Linux 核心模式中的精簡檔案系統,原始程式碼約一千餘行,支援基本的檔案和目錄處理,同時也考慮到權限和並行處理的議題。
vcam 是個針對 Linux 核心開發的虛擬攝影機裝置,全部程式碼僅 1 千 5 百行,從而可理解 V4L2 (video fro Linux APIs, version 2) 的使用和 Linux 多媒體架構。開發一個虛擬的攝影機裝置除了理解 Linux 核心設計外,也有資訊安全的幫助,例如你可以安插相關程式碼,紀錄有哪些應用程式偷偷啟動攝影機,但過程中又不會揭露真正的隱私。
/dev/mem
研究編撰 Linux 核心的 /dev/mem 裝置,強化 eBPF, crash 等工具的運用,目標是「成為電腦的主人」 —— 想改哪段記憶體就動手變更
mimalloc 是 Microsoft Research 主導的開放原始碼專案,旨在提出更輕量且更有效率的記憶體管理器 (即 malloc/free 等函式) 的實作。
探討從無到有打造 Linux 平台的高效能網頁伺服器,涵蓋是否該將伺服器實作於 Linux 核心內部、並行處理、I/O 模型、epoll、Reactor pattern,和 Web 伺服器在事件驅動架構的考量。
cserv 展現 event-driven, non-blocking I/O Multiplexing (主要是 epoll), shared memory, processor affinity, coroutine, context switch, UNIX signal, dynamic linking, circular buffer, hash table, red-black tree, atomic operations 等議題的實際應用
擴充 kHTTPd,使其具備現代網頁伺服器的經典特色,並運用 Linux 核心的機制,例如使用 RCU 管理 HTTP 連線
NVIDIA 以 GPL/MIT 授權發布針對 Linux 核心的 GPU 模組原始程式碼: open-gpu-kernel-modules
simrupt
研究和改進simrupt 專案名稱由 simulate 和 interrupt 二個單字組合而來
以 socket-acceleration-with-ebpf 為基礎,實作 Transparent Proxy
kvm-host
的改進KVM 可將 Linux 核心轉為 type-2 hypervisor,結合硬體的虛擬化支援,使得 host machine 上可以執行多個獨立的虛擬環境,稱為 guest 或者 virtual machine。由於 KVM 直接提供 CPU 和記憶體的虛擬化,guest os 的 CPU 指令不需要額外經過軟體的 decode,而是直接交給硬體進行處理,因此可以有效的提高運行速度。而結合軟體 (例如 KVM 搭配 QEMU) 模擬 CPU 和記憶體以外的裝置後,guest OS 便可以被完整地支援在 host OS 上載入並執行。kvm-host 則是建構在 KVM 基礎上的虛擬機器實作,可載入 Linux 核心和相關應用程式。
本文翻譯自 Ulrich Drepper 於 2007 年撰寫的論文《What Every Programmer Should Know About Memory》(版次: 1.0)
檢視〈Concurrency Primer〉草稿並記錄閱讀過程中的疑惑,嘗試用 C11 Atomics 改寫原有程式碼,並確保在 QEMU/Arm 正確運作。
研讀 Linux-Kernel Memory Ordering: Help Arrives At Last! (錄影要看完!對應的投影片) 和 Memory barriers in C,提供對應的解說,並重現實驗 (例如使用 diy7)
Linux 核心提供一套 Resizable, Scalable, Concurrent Hash Table,名為 rhashtable
(見 include/linux/rhashtable.h 及 lib/rhashtable.c),描述於論文〈Resizable, Scalable, Concurrent Hash Tables via Relativistic Programming〉。摘譯 LWN 文章,並佐以原論文,描述 rhashtable 何以落實高效的並行雜湊表,搭配撰寫 Linux 核心模組作為試驗
rv32emu 是針對 RISC-V 32 位元指令集開發的精簡高效模擬器,本任務是引入 JIT 編譯器,以加速 RV32 指令的執行。
完成 fibdrv 指定要求和進行附加事項 (在一對一討論時約定)
對比 sysprog21/bignum 和自己撰寫的大數運算,同樣在求 Fibonacci 數,分析運算速度、記憶體開銷,和潛在的錯誤,並解釋何以有這些落差。研讀 sysprog21/bignum,落實原始程式碼中標注的待做事項。
以第 10 週測驗題給定的程式碼為基礎,實作類似 POSIX Thread 的套件
實作有效的並行鏈結串列,並整合 Hazard Pointer 和 RCU 作為資源釋放機制
以第 11 週測驗題第二題的程式碼為基礎,實作有效的並行鏈結串列,並搭配第 13 週測驗題第一題的記憶體管理 (以 mmap 系統呼叫實作) 程式,儘量降低 lock contention。
以第 9 週測驗題第二題和第 11 週測驗題給定的程式碼為基礎,探討 lock-based vs. lock-free Multiple Producer-Consumer 的設計和實作議題
理解 lfring 並改進該實作
探討 threaded-logger 的實作,分析其中 reader-writer 議題,包含 atomics 和 fute 的使用,思索後續的改進
改進 第 1 週測驗題 並彙整其他學員的成果
改進 第 2 週測驗題 並彙整其他學員的成果
改進 第 3 週測驗題 並彙整其他學員的成果
改進 第 4 週測驗題第四題、彙整其他學員的成果,並且擴充為通用的 coroutine
完成 第 5 週測驗題第二題的延伸題目,著重於 Hazard Pointer 和 RCU 的比較 (在同一程式碼基礎上,個別實作二者來量化比較效率/特性)
改進 第 6 週測驗題第一題 (user-level threads),搭配第 10 週測驗題的實作,打造一套高效率的使用者層級的執行緒函式庫,比照 uThreads (及其後繼專案 libfibre) 進行網頁伺服器情境的效能評估
改進 第 6 週測驗題第二題 (lock-free hashtable)、彙整其他學員的成果,和進行附加事項 (在一對一討論時約定)
(C)
進行 第 8 週測驗題第三題的延伸問題
進行 第 9 週測驗題第一題的延伸問題
進行 第 12 週測驗題第二題的延伸問題。過程中參照第 13 週測驗題第一/二題,嘗試開發出高效的 ring buffer。
延展 第 14 週測驗題第二題的封包捕捉程式 (使用 Packet MMAP),使其具備類似 Packet Sniffer 的功能
改進並彙整其他學員的成果