女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux內核中對信號量的DOWN操作方式

書生途 ? 來源:書生途 ? 作者:書生途 ? 2022-05-11 15:41 ? 次閱讀

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) 有著很重要的作用。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11459

    瀏覽量

    212778
  • down
    +關注

    關注

    0

    文章

    5

    瀏覽量

    9943
  • 信號量
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8499
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Linux下進程通訊之信號量

    ?信號量集,就是由多個信號量組成的一個數組。 作為一個整體, 信號量集中所有的信號量使用同一個等待隊列。 Linux
    的頭像 發表于 08-19 19:55 ?2386次閱讀
    <b class='flag-5'>Linux</b>下進程通訊之<b class='flag-5'>信號量</b>集

    FreeRTOS信號量使用教程

    信號量操作系統重要的一部分,信號量一般用來進行資源管理和任務同步, FreeRTOS中信號量又分為二值
    的頭像 發表于 12-19 09:22 ?3744次閱讀
    FreeRTOS<b class='flag-5'>信號量</b>使用教程

    芯靈思SinlinxA33開發板的Linux內核信號量學習

    被喚醒,轉入步驟(1)。    (4) 當進程不再使用一個信號量控制的資源時,信號量值加1。如果此時有進程正在睡眠等待此信號量,則喚醒此進程。     維護信號量狀態的是
    發表于 02-20 15:50

    芯靈思SinlinxA64開發板 Linux內核信號量學習

    等待此信號量,則喚醒此進程。     維護信號量狀態的是Linux內核操作系統而不是用戶進程。我們可以從頭文件/usr/src/
    發表于 03-15 16:10

    LINUX內核學習指南:構建系統、信號量設計、GPIO操作函數

    控制路徑可以睡眠。我們從 LINUX內核信號量最直觀的設計/實現出發,通過一步步改進,揭示完整的信號量設計/實現,然后探討在不同平臺上通用的信號量
    發表于 07-08 14:45

    Linux操作系統信號量機制的實時化改造

    為了提高Linux操作系統的實時性,研究了Linux操作系統System V信號量機制在內核
    發表于 06-25 16:41 ?18次下載

    你了解Linux 各類信號量

    內核信號量與用戶信號量,用戶信號量分為POXIS信號量和SYSTEMV信號量,POXIS
    發表于 05-04 17:19 ?2643次閱讀
    你了解<b class='flag-5'>Linux</b> 各類<b class='flag-5'>信號量</b>?

    信號量和自旋鎖

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

    Linux IPC System V 信號量

    ?(Linux-specific)返回和IPC_INFO一樣的信息,除了以下方面:semusz成員返回當前系統存在的信號量集的數目,semaem返回系統中所有信號量集中的
    發表于 04-02 14:46 ?405次閱讀

    Linux 多線程信號量同步

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

    華為物聯網操作系統 LiteOS內核教程04-信號量

    1. LiteOS內核信號量 1.1.信號量 在多任務操作系統,不同的任務之間需要同步運行,信號量
    發表于 03-12 17:06 ?1879次閱讀

    Linux信號量(2):POSIX 信號量

    存儲)置于可選部分。在 SUSv4 之前,POSIX 信號量接口已經被包含在信號量選項。在 SUSv4 ,這些接口被移至了基本規范,而
    的頭像 發表于 10-29 17:34 ?891次閱讀

    LINUX內核信號量設計與實現

    控制路徑可以睡眠。我們從 LINUX內核信號量最直觀的設計/實現出發,通過一步步改進,揭示在x86平臺上完整的信號量設計/實現,然后探討在不同平臺上通用的
    發表于 01-14 16:55 ?18次下載

    LINUX內核信號量設計與實現

    控制路徑可以睡眠。我們從 LINUX內核信號量最直觀的設計/實現出發,通過一步步改進,揭示在x86平臺上完整的信號量設計/實現,然后探討在不同平臺上通用的
    發表于 01-14 16:55 ?5次下載

    FreeRTOS的二值信號量

    FreeRTOS信號量是一種任務間通信的方式信號量包括:二值信號量、互斥信號量、計數
    的頭像 發表于 02-10 15:07 ?1698次閱讀