一、核心相關檔案為include/linux/semaphore.h和kernel/semaphore.c
二、主要結構體:
struct semaphore ;
結構體成員變數解讀:
1、lock主要用於保護count和wait_list鍊錶的訪問;
2、count記錄訊號量等待程序的計數;
3、wait_list用於記錄等待訊號量的程序,串成乙個鍊錶來統一管理;
三、相關介面
1、初始化介面
static inline void sema_init(struct semaphore *sem, int val)
介面主要完成互斥鎖、訊號量計數初始值、煉表頭結點的初始化操作;
2、down訊號量介面
獲取訊號量介面總共有五個:
extern void down(struct semaphore *sem);
extern int __must_check down_interruptible(struct semaphore *sem);
extern int __must_check down_killable(struct semaphore *sem);
extern int __must_check down_trylock(struct semaphore *sem);
extern int __must_check down_timeout(struct semaphore *sem, long jiffies);
1)down介面核心已不建議使用,按照核心發展趨勢,將會逐步取消掉此介面;
2)down訊號量介面,一般都建議使用down_interruptible,此介面將會把當前任務狀態設定為task_interruptible,意味著一旦滿足條件,任務將會在設定的超時時間到來之前被排程;
3)down_killable:可被殺死地獲取訊號量。如果睡眠被致命訊號中斷,返回錯誤-eintr;
4)down_trylock:此介面上來就去獲取訊號量,不會設定超時時間,不做任何等待,獲取到就返回0,獲取不到就返回1;
5)down_timeout:如果上來就獲取到訊號量,則直接返回,獲取不到則睡眠等待設定的超時時間時長;
這五個介面,除了down_trylock,最終都呼叫了__down_common這個介面,只不過傳入的引數不同而已
static noinline void __sched __down(struct semaphore *sem)
static noinline int __sched __down_interruptible(struct semaphore *sem)
static noinline int __sched __down_killable(struct semaphore *sem)
static noinline int __sched __down_timeout(struct semaphore *sem, long jiffies)
我們可以看一下__down_common這個介面:首先會把當前程序掛接到訊號量的wait_list鍊錶中,然後會通過schedule_timeout排程其他程序,當前任務掛起;
struct semaphore_waiter ;
static inline int __sched __down_common(struct semaphore *sem, long state,
long timeout)
timed_out:
list_del(&waiter.list);
return -etime;
interrupted:
list_del(&waiter.list);
return -eintr;
}
3、釋放訊號量介面:此介面主要做了以下工作,首先判斷當前訊號量的wait_list是否為空,如果為空,即沒有任何程序等待此訊號量,則直接sem->count++,否則,則把wait_list中第乙個節點摘除,通過wake_up_process放置到啟用任務佇列中,等待執行。
extern void up(struct semaphore *sem);
void up(struct semaphore *sem)
static noinline void __sched __up(struct semaphore *sem)
工作筆記 訊號量
訊號量用來各執行緒中通訊。我簡單的將訊號量想象成烽火台發出的煙,向遠處傳達訊號。嘗試將globvar增加20000次,乙個執行緒增加10000次。用訊號量來代替互斥鎖,使一次只有乙個執行緒對globvar變數進行操作。經過dev c 測試多次,其中5次中有一次錯誤的獲得19995 include i...
訊號量 二值訊號量
訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...
python訊號量 Python訊號量
python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...