讀寫訊號量(todo)

2021-09-21 15:50:59 字數 1366 閱讀 5132

讀寫訊號量的相關api有:

declare_rwsem(name)

該巨集宣告乙個讀寫訊號量name並對其進行初始化。

void init_rwsem(struct rw_semaphore *sem);

該函式對讀寫訊號量sem進行初始化。

void down_read(struct rw_semaphore *sem);

讀者呼叫該函式來得到讀寫訊號量sem。該函式會導致呼叫者睡眠,因此只能在程序上下文使用。

int down_read_trylock(struct rw_semaphore *sem);

該函式類似於down_read,只是它不會導致呼叫者睡眠。它盡力得到讀寫訊號量sem,如果能夠立即得到,它就得到該讀寫訊號量,並且返回1,否則表示不能立刻得到該訊號量,返回0。因此,它也可以在中斷上下文使用。

void down_write(struct rw_semaphore *sem);

寫者使用該函式來得到讀寫訊號量sem,它也會導致呼叫者睡眠,因此只能在程序上下文使用。

int down_write_trylock(struct rw_semaphore *sem);

該函式類似於down_write,只是它不會導致呼叫者睡眠。該函式盡力得到讀寫訊號量,如果能夠立刻獲得,就獲得該讀寫訊號量並且返回1,否則表示無法立刻獲得,返回0。它可以在中斷上下文使用。

void up_read(struct rw_semaphore *sem);

讀者使用該函式釋放讀寫訊號量sem。它與down_read或down_read_trylock配對使用。如果down_read_trylock返回0,不需要呼叫up_read來釋放讀寫訊號量,因為根本就沒有獲得訊號量。

void up_write(struct rw_semaphore *sem);

寫者呼叫該函式釋放訊號量sem。它與down_write或down_write_trylock配對使用。如果down_write_trylock返回0,不需要呼叫up_write,因為返回0表示沒有獲得該讀寫訊號量。

void downgrade_write(struct rw_semaphore *sem);

該函式用於把寫者降級為讀者,這有時是必要的。因為寫者是排他性的,因此在寫者保持讀寫訊號量期間,任何讀者或寫者都將無法訪問該讀寫訊號量保護的共享資源,對於那些當前條件下不需要寫訪問的寫者,降級為讀者將,使得等待訪問的讀者能夠立刻訪問,從而增加了併發性,提高了效率。

讀寫訊號量適於在讀多寫少的情況下使用,在linux核心中對程序的記憶體映像描述結構的訪問就使用了讀寫訊號量進行保護。

究竟什麼時候使用自旋鎖什麼時候使用訊號量,下面給出建議的方案

當對低開銷、短期、中斷上下文加鎖,優先考慮自旋鎖;當對長期、持有鎖需要休眠的任務,優先考慮訊號量。

Linux同步 讀寫訊號量

以下內容 訊號量 一,訊號量和自旋鎖的區別 訊號量與自旋鎖有一定的區別,訊號量在無法得到資源時,核心執行緒處於睡眠阻塞狀態,而自旋鎖處於忙等待狀態。因此,如果資源被占用時間很短時,使用自旋鎖較好,因為它可節約排程時間。如果資源被占用的時間較長,使用訊號量較好。二,訊號量相關的api 訊號量的相關ap...

核心同步方法之讀寫訊號量

讀寫訊號量在核心中是由rw semaphore結構表示的 在中 the semaphore definition struct rw semaphore 靜態建立讀寫訊號量 define rwsem initializer name define declare rwsem name struct ...

核心態訊號量(todo)

void sema init struct semaphore sem,int val void init mutex struct semaphore sem 將sem的值置為1,表示資源空閒 void init mutex locked struct semaphore sem 將sem的值置為...