亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

自旋鎖和互斥鎖區(qū)別 --- 經(jīng)典

オリジナル 2016-11-07 16:02:00 1107
サマリー:POSIX threads(簡(jiǎn)稱Pthreads)是在多核平臺(tái)上進(jìn)行并行編程的一套常用的API。線程同步(Thread Synchronization)是并行編程中非常重要的通訊手段,其中最典型的應(yīng)用就是用Pthreads提供的鎖機(jī)制(lock)來(lái)對(duì)多個(gè)線程之間共 享的臨界區(qū)(Critical Section)進(jìn)行保護(hù)(另一種常用的同步機(jī)制是barrier)。Pthreads提供了多種鎖機(jī)制:Mu

POSIX threads(簡(jiǎn)稱Pthreads)是在多核平臺(tái)上進(jìn)行并行編程的一套常用的API。線程同步(Thread Synchronization)是并行編程中非常重要的通訊手段,其中最典型的應(yīng)用就是用Pthreads提供的鎖機(jī)制(lock)來(lái)對(duì)多個(gè)線程之間共 享的臨界區(qū)(Critical Section)進(jìn)行保護(hù)(另一種常用的同步機(jī)制是barrier)。

Pthreads提供了多種鎖機(jī)制:

Mutex(互斥量):pthread_mutex_***

Spin lock(自旋鎖):pthread_spin_***

Condition Variable(條件變量):pthread_con_***

Read/Write lock(讀寫鎖):pthread_rwlock_***

Pthreads提供的Mutex鎖操作相關(guān)的API主要有:

pthread_mutex_lock (pthread_mutex_t *mutex);

pthread_mutex_trylock (pthread_mutex_t *mutex);

pthread_mutex_unlock (pthread_mutex_t *mutex);

Pthreads提供的與Spin Lock鎖操作相關(guān)的API主要有:

pthread_spin_lock (pthread_spinlock_t *lock);

pthread_spin_trylock (pthread_spinlock_t *lock);

pthread_spin_unlock (pthread_spinlock_t *lock);

從實(shí)現(xiàn)原理上來(lái)講,Mutex屬于sleep-waiting類型的鎖。例如在一個(gè)雙核的機(jī)器上有兩個(gè)線程(線程A和線程B),它們分別運(yùn)行在Core0和 Core1上。假設(shè)線程A想要通過(guò)pthread_mutex_lock操作去得到一個(gè)臨界區(qū)的鎖,而此時(shí)這個(gè)鎖正被線程B所持有,那么線程A就會(huì)被阻塞 (blocking),Core0 會(huì)在此時(shí)進(jìn)行上下文切換(Context Switch)將線程A置于等待隊(duì)列中,此時(shí)Core0就可以運(yùn)行其他的任務(wù)(例如另一個(gè)線程C)而不必進(jìn)行忙等待。而Spin lock則不然,它屬于busy-waiting類型的鎖,如果線程A是使用pthread_spin_lock操作去請(qǐng)求鎖,那么線程A就會(huì)一直在 Core0上進(jìn)行忙等待并不停的進(jìn)行鎖請(qǐng)求,直到得到這個(gè)鎖為止。

自旋鎖(Spin lock)

自旋鎖與互斥鎖有點(diǎn)類似,只是自旋鎖不會(huì)引起調(diào)用者睡眠,如果自旋鎖已經(jīng)被別的執(zhí)行單元保持,調(diào)用者就一直循環(huán)在那里看是 否該自旋鎖的保持者已經(jīng)釋放了鎖,”自旋”一詞就是因此而得名。其作用是為了解決某項(xiàng)資源的互斥使用。因?yàn)樽孕i不會(huì)引起調(diào)用者睡眠,所以自旋鎖的效率遠(yuǎn) 高于互斥鎖。雖然它的效率比互斥鎖高,但是它也有些不足之處:

自旋鎖一直占用CPU,他在未獲得鎖的情況下,一直運(yùn)行--自旋,所以占用著CPU,如果不能在很短的時(shí) 間內(nèi)獲得鎖,這無(wú)疑會(huì)使CPU效率降低。

在用自旋鎖時(shí)有可能造成死鎖,當(dāng)遞歸調(diào)用時(shí)有可能造成死鎖,調(diào)用有些其他函數(shù)也可能造成死鎖,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我們要慎重使用自旋鎖,自旋鎖只有在內(nèi)核可搶占式或SMP的情況下才真正需要,在單CPU且不可搶占式的內(nèi)核下,自旋鎖的操作為空操作。自旋鎖適用于鎖使用者保持鎖時(shí)間比較短的情況下。

自旋鎖的用法如下:

首先定義:spinlock_t x;

然后初始化:spin_lock_init(spinlock_t *x);   //自旋鎖在真正使用前必須先初始化

在2.6.11內(nèi)核中將定義和初始化合并為一個(gè)宏:DEFINE_SPINLOCK(x)

獲得自旋鎖:spin_lock(x);   //只有在獲得鎖的情況下才返回,否則一直“自旋”spin_trylock(x);  //如立即獲得鎖則返回真,否則立即返回假

釋放鎖:spin_unlock(x);

結(jié)合以上有以下代碼段:

spinlock_t lock;        //定義一個(gè)自旋鎖
    spin_lock_init(&lock);
    spin_lock(&lock);    
    .......        //臨界區(qū)
    spin_unlock(&lock);   //釋放鎖

還有一些其他用法:

spin_is_locked(x)
//  該宏用于判斷自旋鎖x是否已經(jīng)被某執(zhí)行單元保持(即被鎖),如果是,   返回真,否則返回假。
spin_unlock_wait(x)
//  該宏用于等待自旋鎖x變得沒(méi)有被任何執(zhí)行單元保持,如果沒(méi)有任何執(zhí)行單元保持該自旋鎖,該宏立即返回,否將循環(huán)    在那里,直到該自旋鎖被保持者釋放。
spin_lock_irqsave(lock, flags)
//  該宏獲得自旋鎖的同時(shí)把標(biāo)志寄存器的值保存到變量flags中并失效本地中斷。相當(dāng)于:spin_lock()+local_irq_save()
spin_unlock_irqrestore(lock, flags)
//  該宏釋放自旋鎖lock的同時(shí),也恢復(fù)標(biāo)志寄存器的值為變量flags保存的//值。它與spin_lock_irqsave配對(duì)使用。相當(dāng)于:spin_unlock()+local_irq_restore()
spin_lock_irq(lock)
//該宏類似于spin_lock_irqsave,只是該宏不保存標(biāo)志寄存器的值。相當(dāng)于:spin_lock()+local_irq_disable()
spin_unlock_irq(lock)
//該宏釋放自旋鎖lock的同時(shí),也使能本地中斷。它與spin_lock_irq配對(duì)應(yīng)用。相當(dāng)于: spin_unlock()+local_irq+enable()
spin_lock_bh(lock)
//  該宏在得到自旋鎖的同時(shí)失效本地軟中斷。相當(dāng)于:spin_lock()+local_bh_disable()
spin_unlock_bh(lock)
//該宏釋放自旋鎖lock的同時(shí),也使能本地的軟中斷。它與spin_lock_bh配對(duì)使用。相當(dāng)于:spin_unlock()+local_bh_enable()
spin_trylock_irqsave(lock, flags)
//該宏如果獲得自旋鎖lock,它也將保存標(biāo)志寄存器的值到變量flags中,并且失效本地中斷,如果沒(méi)有獲得鎖,它什么也不做。因此如果能夠立即 獲得鎖,它等同于spin_lock_irqsave,如果不能獲得鎖,它等同于spin_trylock。如果該宏獲得自旋鎖lock,那需要 使用spin_unlock_irqrestore來(lái)釋放。
spin_trylock_irq(lock)
//該宏類似于spin_trylock_irqsave,只是該宏不保存標(biāo)志寄存器。如果該宏獲得自旋鎖lock,需要使用spin_unlock_irq來(lái)釋放。
spin_trylock_bh(lock)
//  該宏如果獲得了自旋鎖,它也將失效本地軟中斷。如果得不到鎖,它什么也不做。因此,如果得到了鎖,它等同于spin_lock_bh,如果得 不到鎖,它等同于spin_trylock。如果該宏得到了自旋鎖,需要使用spin_unlock_bh來(lái)釋放。
spin_can_lock(lock)
//  該宏用于判斷自旋鎖lock是否能夠被鎖,它實(shí)際是spin_is_locked取反。如果lock沒(méi)有被鎖,它返回真,否則,返回 假。該宏在2.6.11中第一次被定義,在先前的內(nèi)核中并沒(méi)有該宏。

自旋鎖的獲得和釋放有多種方法,要根據(jù)場(chǎng)合選擇,可以去http://soft.yesky.com/os/lin/10/2303010_4.shtml看看,介紹了很多關(guān)于自旋鎖的使用知識(shí)。本文引用了很多上面的知識(shí)。


手記を発表する

人気のある見(jiàn)出し語(yǔ)