Linux核心的同步機制(2)(轉)

gugu99發表於2007-08-10
Linux核心的同步機制(2)(轉)[@more@]

  四、讀寫訊號量(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章