簡介 訪問共用資源的代碼區域稱作臨界區。自旋鎖(spinlock)和互斥體(mutex,mutual exclusion 的縮寫)是保護內核臨界區的兩種基本機制。我們逐個分析。 自旋鎖 自旋鎖可以確保在同時只有一個線程進入臨界區。其它想進入臨界區的線程必須不停地原地打轉,直到第一個線程釋放自旋鎖。註 ...
簡介
訪問共用資源的代碼區域稱作臨界區。自旋鎖(spinlock)和互斥體(mutex,mutual exclusion 的縮寫)是保護內核臨界區的兩種基本機制。我們逐個分析。
自旋鎖
自旋鎖可以確保在同時只有一個線程進入臨界區。其它想進入臨界區的線程必須不停地原地打轉,直到第一個線程釋放自旋鎖。註意:這裡所說的線程不是內核線程,而是執行的線程。
下麵的例子演示了自旋鎖的基本用法
互斥體
與自旋鎖不同的是,互斥體在進入一個被占用的臨界區之前不會原地打轉,而是使當前線程進入睡眠狀態。如果要等待的時間較長,互斥體比自旋鎖更合適,因為自旋鎖會消耗 CPU 資源,在使用互斥體的場合,多於兩次進程切換時間都可被認為是長時間。因此一個互斥體會引起本線程睡眠。而當其被喚醒時,它需要被切換回來。
因此,在很多情況下,決定使用自旋鎖還是互斥體相對來說很容易:
(1) 如果臨界區需要睡眠,只能使用互斥體,因為在獲得自旋鎖後進行調度、搶占以及在等待隊列上睡眠都是非法的;
(2) 由於互斥體會在面臨競爭的情況下將當前線程置於睡眠狀態,因此,在中斷處理函數中,只能使用自自旋鎖。