2010年2月1日 星期一

Linux Synchronization - 1

以下列出 Kernel 的同步機制:

1. Per-CPU variables
將 Kernel 中的變數宣告成 per-CPU 的陣列型式,每一個 CPU 都有屬於自己的變數空間,不會和其他的CPU共用。

2. Atomic operations
讓存取記憶體的指令能夠完整的執行完成,不會被中斷或其他的 CPU 指令所打斷。

3. Memory barriers
利用一些 Macro 安插於某段程式中,確保程式能如預期的順序來執行。

4. Spin lock
以 lock 的方法來保護特定資源只能被一個程序使用,其他欲使用該資源的程序會進入 "忙碌迴圈" 等待資源被釋放為止。

5. Semaphore
類似 Spin lock 的保護方法,但待等特定資源的行程會進入休眠狀態,也就是要讓出 CPU 使用權,因此不可用於中斷處理函式。

6. Seqlock
類似 Spin lock 的原理,將 lock 分為 reader 及 writer 兩種,分別用來保護資源被謮與寫的動作。而 writer 有高於 reader 的優先權,亦即同時發生讀、寫同一資源時,寫的動作會優先執行。

7. Local interrupt disabling
利用關閉目前 CPU 的中斷處理函式來保護程序不會被其他中斷所打斷,但是在多 CPU 的機器上不能使其他 CPU 關閉中斷。

8. Local softirq disabling
利用停止延遲執行的中斷處理函式(例如 Bottom Half),來保護特定資源不會被其他的延遲執行的中斷處理函式所存取,而且此種方式不會關閉中斷。

9. Read-Copy Update (RCU)
利用指標的資料結構,當某指標發生被寫的動作時,將該指標複製一份(例如拷貝指標所指向的記憶體),然後對複本進行存取。完成寫的動作後,再更新該指標成為修改過的複本(例如將原來的指標改成複製後的記憶體位址)。

下表列出如何使用同步機制來保護 Kernel data structure:

沒有留言: