- 論壇徽章:
- 0
|
內(nèi)核中使用的信號(hào)量用于共享資源的同步訪問(wèn)。有down(),up()兩種類型的操作。down()用于獲取資源,而up()是釋放資源。一個(gè)任務(wù)想通過(guò)調(diào)用down()獲取資源,而代表該資源的信號(hào)量表示“沒(méi)有可用資源”的時(shí)候,進(jìn)程轉(zhuǎn)入等待狀態(tài),直到占有資源的進(jìn)程調(diào)用up()釋放資源后才能被喚醒。進(jìn)程的等待與喚醒通過(guò)等待隊(duì)列實(shí)現(xiàn)(
http://blog.chinaunix.net/u1/35101/showart_485204.html
)。1. 普通信號(hào)量:數(shù)據(jù)結(jié)構(gòu):struct semaphore { atomic_t count; int sleepers; wait_queue_head_t wait;#if WAITQUEUE_DEBUG long __magic;#endif};信號(hào)量的狀態(tài)變遷 某資源有兩個(gè)實(shí)例可用,因此初始化count為2。現(xiàn)有6個(gè)任務(wù)需要獲取該資源實(shí)例,其狀態(tài)變遷過(guò)程如下:-----------------------------------------------------------------------------------步驟 任務(wù)(進(jìn)程) 操作 count sleepers 等待隊(duì)列 描述00 initialize sema_init(sem, 2) 2 0 (NONE)01 T1 down(sem) 1 0 (NONE) T1獲得一個(gè)資源實(shí)例02 T2 down(sem) 0 0 (NONE) T2獲得一個(gè)資源實(shí)例03 T2 up(sem) 1 0 (NONE) T2釋放一個(gè)資源實(shí)例04 T3 down(sem) 0 0 (NONE) T3獲得一個(gè)資源實(shí)例05 T4 down(sem) -1 1 (T4) T4等待06 T5 down(sem) -1 1 (T4,T5) T5等待T07 T1 up(sem) -1 1 (T5) T1釋放一個(gè)資源實(shí)例 T4獲得一個(gè)資源實(shí)例08 T6 down(sem) -1 1 (T5,T6) T6等待09 T4 up(sem) -1 1 (T6) T4釋放一個(gè)資源實(shí)例 T5獲得一個(gè)資源實(shí)例10 T3 up(sem) 0 0 (NONE) T3釋放一個(gè)資源實(shí)例 T6獲得一個(gè)資源實(shí)例11 T5 up(sem) 1 0 (NONE) T5釋放一個(gè)資源實(shí)例12 T6 up(sem) 2 0 (NONE) T6釋放一個(gè)資源實(shí)例----------------------------------------------------------------------------------- 在等待隊(duì)列中的任務(wù)數(shù)大于一的情況下,up()實(shí)際上會(huì)導(dǎo)致兩次wake_up()操作。第一次是up()使sem->count自增后,sem->count-----------------------------------------------------------------------------------步驟 任務(wù) 操作 count sleepers 等待隊(duì)列00 -1 1 (T1,T2...)01 Tup count++ 0 1 (T1,T2...)02 Tup __up() --> wake_up(T1) 0 1 (T1,T2...)03 T1 修改count,sleepers的值 0 0 (T1,T2...)04 T1 T1出隊(duì) 0 0 (T2...)05 T1 __down() --> wake_up(T2) 0 0 (T2...)06 T1 從__down()返回 0 0 (T2...)07 T2 修改count,sleepers的值 -1 1 (T2...)08 T2 schedule() -1 1 (T2...)----------------------------------------------------------------------------------- 因此,up()釋放一個(gè)資源實(shí)例,并且喚醒一個(gè)等待進(jìn)程。若此時(shí)還有其它進(jìn)程處于等待狀態(tài)的,__down()返回前的wake_up()會(huì)暫時(shí)地喚醒等待進(jìn)程,將count、sleepers再調(diào)整為(-1,1),表示暫時(shí)無(wú)足夠資源提供,然后又進(jìn)入等待狀態(tài)。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u1/35101/showart_488287.html |
|