訊號量工作原理

2021-06-28 00:02:07 字數 2293 閱讀 4561

一、核心相關檔案為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訊號量與互斥鎖的關係 訊號量的乙個特殊用...