linux spinlock mutex semaphore
信號(hào)量在內(nèi)核中的定義如下:
struct?semaphore?{raw_spinlock_t lock;///自旋鎖unsigned?int count;///count=1時(shí)可進(jìn)行互斥操作struct?list_head wait_list; };信號(hào)量的初始化:
sem_init(&sem,val);///var代表信號(hào)量的初始值
獲取信號(hào)量:
down(&sem);若此時(shí)信號(hào)量為0,則該進(jìn)程會(huì)會(huì)處于睡眠狀態(tài),因此該函數(shù)不可用于中斷上下文中。
接下來分析一下獲取信號(hào)量的源碼:
static?noinline?void?__sched?__down(struct?semaphore?*sem) {__down_common(sem,?TASK_UNINTERRUPTIBLE,?MAX_SCHEDULE_TIMEOUT); } static?inline?int?__sched?__down_common(struct?semaphore?*sem,?long?state,long?timeout) {struct?task_struct?*task?=?current;struct?semaphore_waiter?waiter;list_add_tail(&waiter.list,?&sem->wait_list);waiter.task?=?task;waiter.up?=?0; ///死循環(huán)for?(;;)?{///如果當(dāng)前進(jìn)程被信號(hào)喚醒,則退出if?(signal_pending_state(state,?task))goto?interrupted;///如果進(jìn)程的等待時(shí)間超時(shí),則退出if?(timeout?<=?0)goto?timed_out;__set_task_state(task,?state);raw_spin_unlock_irq(&sem->lock);///在等待隊(duì)列中等待調(diào)度。timeout?=?schedule_timeout(timeout);raw_spin_lock_irq(&sem->lock);///如果調(diào)度是由信號(hào)量的釋放而喚醒的,則返回0if?(waiter.up)return?0;}...... }釋放信號(hào)量
up(&sem);
互斥信號(hào)量:
struct?mutex?{/*?1:?unlocked,?0:?locked,?negative:?locked,?possible?waiters?*/atomic_t count;spinlock_t wait_lock;struct?list_head wait_list;...... };互斥信號(hào)量的初始化:
init_mutex(&sem);
同樣作為同步操作,mutex、spinlock、semaphore有如下差異:
1、mutex的count初始化為1,而semaphore則初始化為0
2、mutex的使用者必須為同一線程,即必須成對(duì)使用,而semaphore可以由不同的線程執(zhí)行P.V操作。
3、進(jìn)程在獲取不到信號(hào)量的時(shí)候執(zhí)行的是sleep操作,而進(jìn)程在獲取不到自旋鎖的時(shí)候執(zhí)行的是忙等待操作。因此,不難看出,如果需要保護(hù)的臨界區(qū)比較小,鎖的持有時(shí)間比較短的情況下,通常使用spinlock。這樣可以不需要對(duì)等待鎖的進(jìn)程執(zhí)行睡眠/喚醒操作,大大節(jié)省了cpu時(shí)間。因此,spinlock通常作為多處理器之間的同步操作。
轉(zhuǎn)載于:https://blog.51cto.com/4989715/1417027
總結(jié)
以上是生活随笔為你收集整理的linux spinlock mutex semaphore的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV cvReleaseImag
- 下一篇: linux-impdp的使用