Linux內核互斥鎖--mutex


一、定義:
/linux/include/linux/mutex.h
 
二、作用及訪問規則:
互斥鎖主要用於實現內核中的互斥訪問功能。內核互斥鎖是在原子 API 之上實現的,但這對於內核用戶是不可見的。
對它的訪問必須遵循一些規則:同一時間只能有一個任務持有互斥鎖,而且只有這個任務可以對互斥鎖進行解鎖。互斥鎖不能進行遞歸鎖定或解鎖。一個互斥鎖對象必須通過其API初始化,而不能使用memset或復制初始化。一個任務在持有互斥鎖的時候是不能結束的。互斥鎖所使用的內存區域是不能被釋放的。使用中的互斥鎖是不能被重新初始化的。並且互斥鎖不能用於中斷上下文。
    互斥鎖比當前的內核信號量選項更快,並且更加緊湊。
 
三、各字段詳解:
1、atomic_t count;  //指示互斥鎖的狀態: 
     1:沒有上鎖,可以獲得;
     0:被鎖定,不能獲得。
     負數:被鎖定,且可能在該鎖上有等待進程 ,初始化為沒有上鎖。 
2、spinlock_t wait_lock;   //等待獲取互斥鎖中使用的自旋鎖。在獲取互斥鎖的過程中,操作會在自旋鎖的保護中進行。初始化為為鎖定。 
3、struct list_head wait_list;  //等待互斥鎖的進程隊列。
 
四、操作
1、定義並初始化:
struct mutex mutex;
mutex_init(&mutex);
 
      直接定義互斥鎖mutex並初始化為未鎖定,即count為1,wait_lock為未上鎖,等待隊列wait_list為空。
 
2、獲取互斥鎖:
(1)代碼:linux/kernel/mutex.c
void inline fastcall __sched mutex_lock(struct mutex *lock);    //獲取互斥鎖。
    實際上是先給count做自減操作,然后使用本身的自旋鎖進入臨界區操作。首先取得count的值,在將count置為-1,判斷如果原來count的置為1,也即互斥鎖可以獲得,則直接獲取,跳出。否則進入循環反復測試互斥鎖的狀態。在循環中,也是先取得互斥鎖原來的狀態,在將其之為-1,判斷如果可以獲取(等於1),則退出循環,否則設置當前進程的狀態為不可中斷狀態,解鎖自身的自旋鎖,進入睡眠狀態,待被在調度喚醒時,再獲得自身的自旋鎖,進入新一次的查詢其自身狀態(該互斥鎖的狀態)的循環。
 
(2)具體參見linux/kernel/mutex.c
int fastcall __sched mutex_lock_interruptible(struct mutex *lock);
和mutex_lock()一樣,也是獲取互斥鎖。在獲得了互斥鎖或進入睡眠直到獲得互斥鎖之后會返回0。如果在等待獲取鎖的時候進入睡眠狀態收到一個信號(被信號打斷睡眠),則返回_EINIR。
 
(3)具體參見linux/kernel/mutex.c
int fastcall __sched mutex_trylock(struct mutex *lock);
試圖獲取互斥鎖,如果成功獲取則返回1,否則返回0,不等待。
 
3、釋放互斥鎖:
具體參見linux/kernel/mutex.c
void fastcall mutex_unlock(struct mutex *lock);
釋放被當前進程獲取的互斥鎖。該函數不能用在中斷上下文中,而且不允許去釋放一個沒有上鎖的互斥鎖。
 
五、使用形式:
struct mutex mutex;
mutex_init(&mutex); /*定義*/
...
mutex_lock(&mutex); /*獲取互斥鎖*/
... /*臨界資源*/
mutex_unlock(&mutex); /*釋放互斥鎖*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM