Linux核心的同步機制(2)(轉)
四、讀寫訊號量(rw_semaphore)
讀寫訊號量對訪問者進行了細分,或者為讀者,或者為寫者,讀者在保持讀寫訊號量期間只能對該讀寫訊號量保護的共享資源進行讀訪問,如果一個任務除了需要讀,可能還需要寫,那麼它必須被歸類為寫者,它在對共享資源訪問之前必須先獲得寫者身份,寫者在發現自己不需要寫訪問的情況下可以降級為讀者。讀寫訊號量同時擁有的讀者數不受限制,也就說可以有任意多個讀者同時擁有一個讀寫訊號量。
如果一個讀寫訊號量當前沒有被寫者擁有並且也沒有寫者等待讀者釋放訊號量,那麼任何讀者都可以成功獲得該讀寫訊號量;否則,讀者必須被掛起直到寫者釋放該訊號量。如果一個讀寫訊號量當前沒有被讀者或寫者擁有並且也沒有寫者等待該訊號量,那麼一個寫者可以成功獲得該讀寫訊號量,否則寫者將被掛起,直到沒有任何訪問者。因此,寫者是排他性的,獨佔性的。
讀寫訊號量有兩種實現,一種是通用的,不依賴於硬體架構,因此,增加新的架構不需要重新實現它,但缺點是效能低,獲得和釋放讀寫訊號量的開銷大;另一種是架構相關的,因此效能高,獲取和釋放讀寫訊號量的開銷小,但增加新的架構需要重新實現。在核心配置時,可以透過選項去控制使用哪一種實現。
讀寫訊號量的相關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。它可以在中斷上下文使用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-940135/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux核心的同步機制(1)(轉)Linux
- Linux 核心同步機制Linux
- linux核心級同步機制--futexLinux
- 核心同步機制 RCU
- Linux核心同步機制之(五):Read Write spin lock【轉】Linux
- 【轉】linux非同步io機制Linux非同步
- linux核心IDR機制詳解【轉】Linux
- Linux2.6 核心的 Initrd 機制解析(1)(轉貼好文)Linux
- Linux2.6 核心的 Initrd 機制解析(4)(轉貼好文)Linux
- linux 核心 RCU機制詳解Linux
- Linux的安全機制(轉)Linux
- Linux核心之 核心同步Linux
- 核心中各種同步機制(自旋鎖大核心鎖順序鎖等)
- Linux 核心 tasklet 機制和工作佇列Linux佇列
- Linux核心機制—smp_hotplug_threadLinuxthread
- Dubbo的微核心機制
- 詳解Linux 2.6核心新檔案系統變化機制(轉)Linux
- Linux 核心通知鏈機制的原理及實現Linux
- 響應式流的核心機制——背壓機制
- Unix/BSD/Linux的口令機制初探(轉)Linux
- Javascript非同步機制JavaScript非同步
- 同步機制比較
- Java核心反射機制Java反射
- 深入剖析setState同步非同步機制非同步
- 核心中的排程與同步(轉)
- 進擊JavaScript核心 --- (2)函式和預解析機制JavaScript函式
- Js非同步機制的實現JS非同步
- Linux核心同步,程式,執行緒同步薦Linux執行緒
- 解析Java的多執行緒機制(2)(轉)Java執行緒
- JS執行機制--同步與非同步JS非同步
- Web3與Web2的同步機制經驗總結Web
- 執行緒同步機制執行緒
- Flutter 非同步機制:microtaskFlutter非同步
- redis主從同步機制Redis主從同步
- MySQL 5.7半同步機制MySql
- mysql主從同步機制MySql主從同步
- Java 同步機制淺談Java
- 【原創】xenomai+linux雙核心下的時鐘管理機制AILinux