日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux spinlock mutex semaphore

發布時間:2024/4/15 linux 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。