執行人: JeffBla
回顧並行和多執行緒程式設計教材,探究 Linux 核心的同步處理機制,理解其原理、重新實作,並量化分析。
研讀以下材料、紀錄問題和提出對應教材的改進
搭配 union 在組合語言的地方(第 13 行)雖然只有改 slock 的話 owner 會被更新 lockval(0) + (1 << TICKET_SHIFT)(4)。
然而 next 的值卻不被改變,因為原先 lockval 就是來自 slock 也就是 [next|owner] 。而現在雖然只改變 lockval 但因為等待 lock 的數量不會多到這個情況,所以會變動到的只有 owner。
被更新的是 next
在超過三個 cpu 使用時(owner and successors)會退化成 MCS lock
Q: where is the node->count used?
inet_unhash 解法為避免在別的處理器執行,其中的舉例為
避免這種情況的發生,例如藉由外部的機制或者工具,對行程和處理器進行綁定,從而避免行程在多個處理器間來回。
另一種可行方法:利用 workqueue
或 smp_call_function_single
,從 sk->sk_hashcpu
拿到當初插入時的 CPU,然後再安排一個工作到那顆 CPU 上去執行真正的 inet_unhash
。
公式錯誤,應為
比照從 CPU cache coherence 談 Linux spinlock 可擴展能力議題,設計數學分析 (機率統計/排隊理論) 來量化 Linux 核心的 qspinlock (建構於 MCS lock 之上)
根據 Non-scalable locks are dangerous
其各穩定階段的機率為
然而 MCS 消彌 CPU cache coherence,因此 service rate 就從 變成 其 為移交 lock 給下一個,下個 CPU 所做的 cache coherence。
也就是
for
如此一來,可以求出等待核心的期望值
qspinlock 結合 wild spinlock 與 MCS lock 因此其穩定階段的機率為將兩者機率合併的 conditional function
參照 Futex 驗證和評估和實作輕量級的 Mutex Lock,重現相關實驗、理解 futex 的驗證,並探討以 futex 為基礎的 lock 提升方案