內核競爭與互斥的實現(信號量&鎖)

1.內核中信號量的使用

    a.信號量對應的頭文件:

        <asm/semaphore.h>

    b.定義信號量:                 

        struct semaphore sem;

    c.初始化信號量:

        void sema_init(struct semaphore *sem, int val)  // 將信號量sem值設置爲val

        void init_MUTEX(struct semaphore *sem)  // 初始化一下互斥鎖,並把sem設置爲1

        void init_MUTEX_LOCKED(struct semaphore *sem)  // 初始化一下互斥鎖,並把sem設置爲0

        DECLARE_MUTEX(name) // 定義一個名字爲name的信號量,並初始化爲1

        DECLARE_MUTEX_LOCKED(name) // 定義一個名字爲name的信號量,並初始化爲0

    d.獲取信號量:

       void down(struct semaphore *sem)  // 該函數將sem減1.如果減1後爲非負數時

                                                                     // 會直接返回;如果爲負否則調用者被掛起

       void down_interruptible(struct semaphore *sem)  // 獲取信號量失敗時,TASK_INTERRUPTIBLE睡眠

                                                                      // 返回值:0 -> 實信號喚醒; -EINTR -> 被中斷喚醒

       void down_killable(struct semaphore *sem)  // 獲取信號量失敗時,TASK_KILLABLE睡眠

    e.釋放信號量:

       void up(struct semaphore *sem) // 把sem的值加1.可喚醒等待該信號的任務

        

2.內核中自旋鎖的使用

    a.定義自旋鎖: 

       void spin_lock_init(x)      // 該宏用於初始化自旋鎖x

    b.獲取自旋鎖: 

       int spin_lock(x)                // 獲取鎖x.成功則立即返回,否則一直等待

       int spin_trylock(x)            // 獲取鎖x.立即返回.返回真-獲取成功;返回假-失敗

    c.釋放自旋鎖: 

       void spin_unlock(x)        // 與spin_lock()或者spin_trylock成對使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章