要防止一個結構被多個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掉之前,先把CPU的flag值先存進去,等到要回復時再還原。
沒有留言:
張貼留言