linux spinlock mutex semaphore
生活随笔
收集整理的這篇文章主要介紹了
linux spinlock mutex semaphore
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
信號量在內核中的定義如下:
struct?semaphore?{raw_spinlock_t lock;///自旋鎖unsigned?int count;///count=1時可進行互斥操作struct?list_head wait_list; };信號量的初始化:
sem_init(&sem,val);///var代表信號量的初始值
獲取信號量:
down(&sem);若此時信號量為0,則該進程會會處于睡眠狀態,因此該函數不可用于中斷上下文中。
接下來分析一下獲取信號量的源碼:
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; ///死循環for?(;;)?{///如果當前進程被信號喚醒,則退出if?(signal_pending_state(state,?task))goto?interrupted;///如果進程的等待時間超時,則退出if?(timeout?<=?0)goto?timed_out;__set_task_state(task,?state);raw_spin_unlock_irq(&sem->lock);///在等待隊列中等待調度。timeout?=?schedule_timeout(timeout);raw_spin_lock_irq(&sem->lock);///如果調度是由信號量的釋放而喚醒的,則返回0if?(waiter.up)return?0;}...... }釋放信號量
up(&sem);
互斥信號量:
struct?mutex?{/*?1:?unlocked,?0:?locked,?negative:?locked,?possible?waiters?*/atomic_t count;spinlock_t wait_lock;struct?list_head wait_list;...... };互斥信號量的初始化:
init_mutex(&sem);
同樣作為同步操作,mutex、spinlock、semaphore有如下差異:
1、mutex的count初始化為1,而semaphore則初始化為0
2、mutex的使用者必須為同一線程,即必須成對使用,而semaphore可以由不同的線程執行P.V操作。
3、進程在獲取不到信號量的時候執行的是sleep操作,而進程在獲取不到自旋鎖的時候執行的是忙等待操作。因此,不難看出,如果需要保護的臨界區比較小,鎖的持有時間比較短的情況下,通常使用spinlock。這樣可以不需要對等待鎖的進程執行睡眠/喚醒操作,大大節省了cpu時間。因此,spinlock通常作為多處理器之間的同步操作。
轉載于:https://blog.51cto.com/4989715/1417027
總結
以上是生活随笔為你收集整理的linux spinlock mutex semaphore的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV cvReleaseImag
- 下一篇: php Imagick()扩展,实现将原