chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

linux內(nèi)核中對(duì)信號(hào)量的DOWN操作方式

書生途 ? 來源:書生途 ? 作者:書生途 ? 2022-05-11 15:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

DOWN操作:linux內(nèi)核中,對(duì)信號(hào)量的DOWN操作有如下幾種:

void down(struct semaphore *sem); //不可中斷
int down_interruptible(struct semaphore *sem);//可中斷
int down_killable(struct semaphore *sem);//睡眠的進(jìn)程可以因?yàn)槭艿街旅盘?hào)而被喚醒,中斷獲取信號(hào)量的操作。
int down_trylock(struct semaphore *sem);//試圖獲取信號(hào)量,若無法獲得則直接返回1而不睡眠。返回0則 表示獲取到了信號(hào)量
int down_timeout(struct semaphore *sem,long jiffies);//表示睡眠時(shí)間是有限制的,如果在jiffies指明的時(shí)間到期時(shí)仍然無法獲得信號(hào)量,則將返回錯(cuò)誤碼。

在以上四種函數(shù)中,驅(qū)動(dòng)程序使用的最頻繁的就是down_interruptible函數(shù),以下將對(duì)該函數(shù)進(jìn)行分析。

down_interruptible函數(shù)的定義如下:

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;
}

函數(shù)分析:函數(shù)首先通過spin_lock_irqsave的調(diào)用來保證對(duì)sem->count操作的原子性。如果count>0,表示當(dāng)前進(jìn)程可以獲得信號(hào)量,將count的值減1然后退出。如果count不大于0,表明當(dāng)前進(jìn)程無法獲取信號(hào)量,則調(diào)用__down_interruptible,后者會(huì)繼續(xù)調(diào)用__down_common。

__down_common 函數(shù)定義如下:

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;
}

函數(shù)分析:在__down_common函數(shù)數(shù)執(zhí)行了以下操作。

(1)將當(dāng)前進(jìn)程放到信號(hào)量成員變量wait_list所管理的隊(duì)列中。

(2)在一個(gè)for循環(huán)中把當(dāng)前的進(jìn)程狀態(tài)這是為TASK_INTERRUPTIBLE,在調(diào)用schedule_timeout使當(dāng)前進(jìn)程進(jìn)入睡眠狀態(tài),函數(shù)將停留在schedule_timeout調(diào)用上,知道再次被調(diào)度執(zhí)行。

(3) 當(dāng)該進(jìn)程再一次被調(diào)度時(shí),按原因執(zhí)行相應(yīng)的操作:如果waiter.up不為0說明進(jìn)程被該信號(hào)量的up操作所喚醒,進(jìn)程可以獲得信號(hào)量。如果進(jìn)程是因?yàn)楸挥脩艨臻g的信號(hào)所中斷或超時(shí)信號(hào)所引起的喚醒,則返回相應(yīng)的錯(cuò)誤代碼。

UP操作:LINUX內(nèi)核只提供了一個(gè)up函數(shù)

up函數(shù)定義如下:

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);
}

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

__up()函數(shù)定義如下:

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);
}

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

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

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11576

    瀏覽量

    216632
  • down
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    9994
  • 信號(hào)量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    8706
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux下進(jìn)程通訊之信號(hào)量

    ?信號(hào)量集,就是由多個(gè)信號(hào)量組成的一個(gè)數(shù)組。 作為一個(gè)整體, 信號(hào)量集中所有的信號(hào)量使用同一個(gè)等待隊(duì)列。 Linux
    的頭像 發(fā)表于 08-19 19:55 ?2818次閱讀
    <b class='flag-5'>Linux</b>下進(jìn)程通訊之<b class='flag-5'>信號(hào)量</b>集

    FreeRTOS信號(hào)量使用教程

    信號(hào)量操作系統(tǒng)重要的一部分,信號(hào)量一般用來進(jìn)行資源管理和任務(wù)同步, FreeRTOS中信號(hào)量又分為二值
    的頭像 發(fā)表于 12-19 09:22 ?4059次閱讀
    FreeRTOS<b class='flag-5'>信號(hào)量</b>使用教程

    芯靈思SinlinxA33開發(fā)板的Linux內(nèi)核信號(hào)量學(xué)習(xí)

    被喚醒,轉(zhuǎn)入步驟(1)。    (4) 當(dāng)進(jìn)程不再使用一個(gè)信號(hào)量控制的資源時(shí),信號(hào)量值加1。如果此時(shí)有進(jìn)程正在睡眠等待此信號(hào)量,則喚醒此進(jìn)程。     維護(hù)信號(hào)量狀態(tài)的是
    發(fā)表于 02-20 15:50

    芯靈思SinlinxA64開發(fā)板 Linux內(nèi)核信號(hào)量學(xué)習(xí)

    等待此信號(hào)量,則喚醒此進(jìn)程。     維護(hù)信號(hào)量狀態(tài)的是Linux內(nèi)核操作系統(tǒng)而不是用戶進(jìn)程。我們可以從頭文件/usr/src/
    發(fā)表于 03-15 16:10

    LINUX內(nèi)核學(xué)習(xí)指南:構(gòu)建系統(tǒng)、信號(hào)量設(shè)計(jì)、GPIO操作函數(shù)

    控制路徑可以睡眠。我們從 LINUX內(nèi)核信號(hào)量最直觀的設(shè)計(jì)/實(shí)現(xiàn)出發(fā),通過一步步改進(jìn),揭示完整的信號(hào)量設(shè)計(jì)/實(shí)現(xiàn),然后探討在不同平臺(tái)上通用的信號(hào)量
    發(fā)表于 07-08 14:45

    Linux操作系統(tǒng)信號(hào)量機(jī)制的實(shí)時(shí)化改造

    為了提高Linux操作系統(tǒng)的實(shí)時(shí)性,研究了Linux操作系統(tǒng)System V信號(hào)量機(jī)制在內(nèi)核
    發(fā)表于 06-25 16:41 ?18次下載

    你了解Linux 各類信號(hào)量

    內(nèi)核信號(hào)量與用戶信號(hào)量,用戶信號(hào)量分為POXIS信號(hào)量和SYSTEMV信號(hào)量,POXIS
    發(fā)表于 05-04 17:19 ?2735次閱讀
    你了解<b class='flag-5'>Linux</b> 各類<b class='flag-5'>信號(hào)量</b>?

    信號(hào)量和自旋鎖

    。??? Linux 使用的同步機(jī)制可以說從2.0到2.6以來不斷發(fā)展完善。從最初的原子操作,到后來的信號(hào)量,從大內(nèi)核鎖到今天的自旋鎖。這些同步機(jī)制的發(fā)展伴隨
    發(fā)表于 04-02 14:43 ?965次閱讀

    Linux IPC System V 信號(hào)量

    ?(Linux-specific)返回和IPC_INFO一樣的信息,除了以下方面:semusz成員返回當(dāng)前系統(tǒng)存在的信號(hào)量集的數(shù)目,semaem返回系統(tǒng)中所有信號(hào)量集中的
    發(fā)表于 04-02 14:46 ?517次閱讀

    Linux 多線程信號(hào)量同步

    直到系統(tǒng)將資源分配給該進(jìn)程(進(jìn)入等待隊(duì)列,一直等到資源輪到該進(jìn)程)。V操作:如果在該信號(hào)量的等待隊(duì)列中有進(jìn)程在等待資源,則喚醒一個(gè)阻塞進(jìn)程;如果沒有進(jìn)程等待它,則釋放一個(gè)資源(即信號(hào)量值加1)。模型
    發(fā)表于 04-02 14:47 ?571次閱讀

    華為物聯(lián)網(wǎng)操作系統(tǒng) LiteOS內(nèi)核教程04-信號(hào)量

    1. LiteOS內(nèi)核信號(hào)量 1.1.信號(hào)量 在多任務(wù)操作系統(tǒng),不同的任務(wù)之間需要同步運(yùn)行,信號(hào)量
    發(fā)表于 03-12 17:06 ?2098次閱讀

    Linux信號(hào)量(2):POSIX 信號(hào)量

    存儲(chǔ))置于可選部分。在 SUSv4 之前,POSIX 信號(hào)量接口已經(jīng)被包含在信號(hào)量選項(xiàng)。在 SUSv4 ,這些接口被移至了基本規(guī)范,而
    的頭像 發(fā)表于 10-29 17:34 ?1078次閱讀

    LINUX內(nèi)核信號(hào)量設(shè)計(jì)與實(shí)現(xiàn)

    控制路徑可以睡眠。我們從 LINUX內(nèi)核信號(hào)量最直觀的設(shè)計(jì)/實(shí)現(xiàn)出發(fā),通過一步步改進(jìn),揭示在x86平臺(tái)上完整的信號(hào)量設(shè)計(jì)/實(shí)現(xiàn),然后探討在不同平臺(tái)上通用的
    發(fā)表于 01-14 16:55 ?18次下載

    LINUX內(nèi)核信號(hào)量設(shè)計(jì)與實(shí)現(xiàn)

    控制路徑可以睡眠。我們從 LINUX內(nèi)核信號(hào)量最直觀的設(shè)計(jì)/實(shí)現(xiàn)出發(fā),通過一步步改進(jìn),揭示在x86平臺(tái)上完整的信號(hào)量設(shè)計(jì)/實(shí)現(xiàn),然后探討在不同平臺(tái)上通用的
    發(fā)表于 01-14 16:55 ?5次下載

    FreeRTOS的二值信號(hào)量

    FreeRTOS信號(hào)量是一種任務(wù)間通信的方式,信號(hào)量包括:二值信號(hào)量、互斥信號(hào)量、計(jì)數(shù)
    的頭像 發(fā)表于 02-10 15:07 ?2123次閱讀