2009年6月18日 星期四

spinlock

要防止一個結構被多個process同時存取有多種方法,而spinlock就是其中的一種;要防止被多process同時存取,最簡單的方法大概是把中斷都disable掉,不過這作法會讓系統效能大跌,如果在多處理器的情況下,甚至還得把每個處理器的中斷都disable掉,才能夠確保沒有多process同時存取的可能,不過如此一來,付出的代價就過高了,這種情形下,像spinlock這種方法就顯的相對實用,因為它不會把所有的CPU中斷都停掉。spinlock說直接點就是在資源被釋放前不斷的去做空循環檢查,內部由組合語言寫成。

使用例:

linux中最常被使用的是spin lock irqsave和與其相對應的spin unlock irqrestore

使用法為:

spinlock_t xxx lock = SPIN_LOCK_UNLOCKED;

unsigned long flags;

spin lock irqsave (&xxx lock, flags);

/*critical section*/

….

spin unlock irqrestore (&xxx lock, flags);

以上動作就能把critical section內的資料保護住,確保無論是讀還是寫,能存取到要保護的資料的總共只會有一個人,宣告unsigned long flags的用途在於讓目標CPU的中斷disable掉之前,先把CPUflag值先存進去,等到要回復時再還原。

沒有留言:

張貼留言