進程同步中的信號量機制(一)

 進程同步---信號量機制


   一種非常有效的進程同步機制。


1.整型信號量

           整型信號量定義爲一個用於表示資源數目的整型量S,它與一般整形量不同,除初始化外,僅能通過兩個標準的原子操作wait(S)和signal(S)來訪問,分別被稱爲P、V操作。

可描述爲:

          wait(S):     while S<=0 do no=op;   //如果S<=0,就一直循環,不斷地進行測試

                             S:=S-1;  

         signal(S):   S:=S+1;

          wait(S)和signal(S)是兩個原子操作,因此,它們在執行時是不可中斷的。整型信號量機制並未遵循讓權等待準則,一直循環不會釋放處理機,進程處於“忙等”狀態。


2.記錄型信號量

        記錄型信號量機制中,信號量S中包含代表資源數目的整型變量value和進程鏈表指針L,L用於鏈接所有等待訪問此資源的進程。

        它包含的上述兩個數據項可描述爲:

        type semaphore=record

                                        value:integer;   //表示系統中某類資源的數目,又稱資源信號量。對它的每次wait操作,則進程請求一個單位的該類資源,系統中可分配的此資源減一。

                                        L:list of process;   //等待此資源的進程鏈表

                                        end

       相應地,wait(S)和signal(S)操作可描述爲:

       procedure wait(S)

                  var S:semaphore;

                  begin

                     S.value:=S.value-1;  //系統中可分配的此類資源減少一個

                     if S.value<0 then block(S.L);   //當資源信號量小於0,表示此類資源已分配完畢,此進程調用block原語,進行自我阻塞,放棄處理機,並插入到信號量鏈表S.L中。

                  end

      可見,此機制遵循了“讓權等待”準則。此時S.value的絕對值表示在該信號量鏈表中已阻塞進程的數目。

       procedure signal(S)

                  var S: semaphore;

                  begin

                        S.value:=S.value+1;    //表示進程釋放一個單位資源,使系統中可供分配的該類資源數目增加一個。

                        if S.value<=0 then wakeup(S.L);   //若value加1後仍是S.value<=0,表示在該信號量鏈表中,仍有等待該資源的進程被阻塞,故應調用wakeup原語,將S.L鏈表中 的第一個等待進程喚醒。

                  end

        如果S.value的初值爲1,表示只允許一個進程訪問臨界資源,此時的信號量轉化爲互斥信號量,用於進程互斥。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章