測驗 2 中
QUEUE_STRUCT
的 struct member 後面多 padding 用意為何?
使每個 struct member 都佔一個 cacheline 的大小,若是將每個 member 緊湊的擺在同個 cacheline 大小的空間內,每次一有變更就要發一次 cache invalidate 的 bradcast 給所有不共享 cache 的 CPU,cache invalidate broadcast 是很高的成本 (試想有上百個 CPU),如此 cache 也形同虛設,因為每次都在 invalidate
測驗 2 中 第 202 行為何要
pos & queue->cell_mask
而非pos % cell_count - 1
?
因為 producer and consumer problem 的可存取空間會改變,所以 mask size 要當成一個結構體成為儲存,讓它可以變動,並用 bitwise and 來達到 mod 的效果
移植原本在 usersapce 的大數運算到 Linux 核心模組時,遇到記憶體管理的問題。策略
EXPECT(bn_init(1), 1);
的程式碼來檢驗個別操作的正確性,不用肉眼比對十進位輸出MALLOC
,甚至加入對應的檢查和錯誤訊息realloc
的使用: realloc 若失敗,如何釋放記憶體printk
和對應的 level,見 Message logging with printkkrealloc 可能對執行時間帶來嚴重影響,改進策略:
1
: 分析巨集函式 GENMASK
在 linux 核心原始碼的實作及考量1
: 分析輸出的組合語言3
: 使用 gnu extension 改寫,並分析效能提升quiz11 的 mpmc_init
為何要檢查 queue 的記憶體地址是否對齊 16 B ?
https://en.wikipedia.org/wiki/False_sharing
ABA 問題和 mpmc
如何改進 mpmc 的測試
dequeue()
中的 batch_size
是做什麼的?以及什麼時候會回傳 SPSC_Q_EMPTY
?SPSC_Q_FULL
、SPSC_Q_EMPTY
等狀況?ktcp
如何確認 CMWQ 是否正確將任務分配至不同執行緒
CMWQ 如何選擇將任務派發至特定 CPU?
kecho 要如何處理大於 BUF_SIZE
的封包?
ktcp
處理超過 buf_size 大小資料