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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux 内核 up down,信号量机制中的DOWN操作与UP操作详解

發布時間:2024/7/19 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 内核 up down,信号量机制中的DOWN操作与UP操作详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DOWN操作:linux內核中,對信號量的DOWN操作有如下幾種:

void down(struct semaphore *sem); //不可中斷

int down_interruptible(struct semaphore *sem);//可中斷

int down_killable(struct semaphore *sem);//睡眠的進程可以因為受到致命信號而被喚醒,中斷獲取信號量的操作。

int down_trylock(struct semaphore *sem);//試圖獲取信號量,若無法獲得則直接返回1而不睡眠。返回0則 表示獲取到了信號量

int down_timeout(struct semaphore *sem,long jiffies);//表示睡眠時間是有限制的,如果在jiffies指明的時間到期時仍然無法獲得信號量,則將返回錯誤碼。

在以上四種函數中,驅動程序使用的最頻繁的就是down_interruptible函數,以下將對該函數進行分析。

down_interruptible函數的定義如下:

int down_interruptible(struct semaphore *sem)

{

unsigned long flags;

int result = 0;

spin_lock_irqsave(&sem->lock,flags);

if (likely(sem->count> 0))

sem->count--;

else

result =__down_interruptible(sem);

spin_unlock_irqrestore(&sem->lock,flags);

return result;

}

函數分析:函數首先通過spin_lock_irqsave的調用來保證對sem->count操作的原子性。如果count>0,表示當前進程可以獲得信號量,將count的值減1然后退出。如果count不大于0,表明當前進程無法獲取信號量,則調用__down_interruptible,后者會繼續調用__down_common。

__down_common 函數定義如下:

static inline int __sched __down_common(struct semaphore *sem, longstate,

longtimeout)

{

struct task_struct *task= current;

struct semaphore_waiterwaiter;

list_add_tail(&waiter.list,&sem->wait_list);

waiter.task = task;

waiter.up = 0;

for (;;) {

if(signal_pending_state(state, task))

gotointerrupted;

if (timeout <=0)

gototimed_out;

__set_task_state(task,state);

spin_unlock_irq(&sem->lock);

timeout =schedule_timeout(timeout);

spin_lock_irq(&sem->lock);

if (waiter.up)

return 0;

}

timed_out:

list_del(&waiter.list);

return -ETIME;

interrupted:

list_del(&waiter.list);

return -EINTR;

}

函數分析:在__down_common函數數執行了以下操作。

(1)將當前進程放到信號量成員變量wait_list所管理的隊列中。

(2)在一個for循環中把當前的進程狀態這是為TASK_INTERRUPTIBLE,在調用schedule_timeout使當前進程進入睡眠狀態,函數將停留在schedule_timeout調用上,知道再次被調度執行。

(3) 當該進程再一次被調度時,按原因執行相應的操作:如果waiter.up不為0說明進程被該信號量的up操作所喚醒,進程可以獲得信號量。如果進程是因為被用戶空間的信號所中斷或超時信號所引起的喚醒,則返回相應的錯誤代碼。

UP操作:LINUX內核只提供了一個up函數

up函數定義如下:

void up(struct semaphore *sem)

{

unsigned long flags;

spin_lock_irqsave(&sem->lock,flags);

if(likely(list_empty(&sem->wait_list)))

sem->count++;

else

__up(sem);

spin_unlock_irqrestore(&sem->lock,flags);

}

函數分析:如果sem的wait_list隊列為空,則表明沒有其他進程正在等待該信號量,那么只需要把sem的count加1即可。如果wait_list隊列不為空,則說明有其他進程正睡眠在wait_list上等待該信號,此時調用__up(sem)來喚醒進程:

__up()函數定義如下:

static noinline void __sched __up(struct semaphore *sem)

{

struct semaphore_waiter*waiter = list_first_entry(&sem->wait_list,

structsemaphore_waiter, list);

list_del(&waiter->list);

waiter->up = 1;

wake_up_process(waiter->task);

}

函數分析:在函數中,調用了wake_up_process來喚醒進程,這樣進程就從之前的__down_interruptible調用中的timeout=schedule_timeout(timeout)處醒來,wait-up=1, __down_interruptible返回0,進程獲得了信號量。

up()與down()函數之間的聯系:由上面對兩個函數的分析可以知道,__down_common函數中timeout=schedule_timeout(timeout) 有著很重要的作用。

原文:http://blog.csdn.net/fzubbsc/article/details/37737159

總結

以上是生活随笔為你收集整理的Linux 内核 up down,信号量机制中的DOWN操作与UP操作详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 男女视频免费 | 91精品国产aⅴ一区二区 | 青青青视频免费观看 | 大肉大捧一进一出好爽动态图 | 日韩电影在线观看中文字幕 | 69视频污| 欧美一区2区三区4区公司 | 欧美另类人妖 | 亚洲理论视频 | 午夜影院福利社 | 色八区| 国产一区黄色 | 日本手机看片 | 久草av在线播放 | 美女又爽又黄视频毛茸茸 | 88av在线| 国产午夜精品视频 | 人人干人人干人人干 | 日本高清有码视频 | 男女涩涩网站 | 成人高潮片 | 米奇色| 91av免费看| 欧美男人天堂 | 久久人人爽爽人人爽人人片av | 狠狠入 | 又黄又免费的视频 | 短视频在线观看 | 欧美日韩另类视频 | 国产人妻黑人一区二区三区 | 欧美视频在线观看视频 | 免费观看黄色的网站 | 黄色福利片 | 亚洲熟妇av一区二区三区 | 在线视频免费观看你懂的 | 亚洲另类色图 | 麻豆高清 | 国产乱淫a∨片免费观看 | 福利视频午夜 | 中文在线а√天堂官网 | 九一爱爱 | 日本人做受免费视频 | 国产美女久久久 | 五月婷婷激情小说 | 97福利| 亚洲人精品午夜射精日韩 | 中文字幕亚洲一区二区三区 | v8888av | 99热在线国产 | av在线免费播放网站 | 国产麻豆成人精品av | 亚洲国产精品国自产拍av | 黄色一级片免费看 | 播播成人网 | 三级亚洲欧美 | 欧洲av一区 | 综合xx网 | 免费黄色大片 | av免费观 | 亚洲国产精品久久人人爱 | 蜜臀aⅴ国产精品久久久国产老师 | 日本毛片在线观看 | 免费网站黄色 | 天堂av官网 | 国产乱人伦 | 国产制服91一区二区三区制服 | 九九色九九 | 亚洲成av人片在线观看 | 欧美两根一起进3p做受视频 | 尤物在线视频观看 | 久操精品视频 | 久久潮 | 欧美日韩一区二区三区四区 | 特黄a级片| 久久精品黄aa片一区二区三区 | 麻豆久久精品 | 男人的天堂在线视频 | 国产视频在线一区二区 | 爱爱综合网| 香蕉传媒 | a网站在线观看 | 日本肉体xxxx裸体xxx免费 | 精品视频久久久久久 | 韩国午夜av | 69热在线观看 | 国产亚洲视频一区 | 狠狠激情| 久久久久久久久久综合 | 韩国av网 | 后进极品美女白嫩翘臀 | 亚洲aaaaaaa | 免费成人福利视频 | 精品视频一区二区三区在线观看 | 成年人小视频在线观看 | 另类综合网 | 亚洲av永久无码精品一百度影院 | 欧美一区二区三区免费在线观看 | 天堂а在线中文在线新版 | 欧美国产日韩在线 |