1.訊號量(semaphore)
為了達到訊號量的預期效果,可把訊號量看做具有整數值得變數,在它之上定義三個操作:
1) 乙個訊號量可以初始化為乙個非負數
2) semwait操作使訊號量減1(國內的教材將該操作稱為p)。如果變成負數,那麼執行semwait的程序被阻塞,並被移入阻塞佇列。否則該程序繼續執行
3) semsignal操作使訊號量加1(國內的教材將該操作稱為v)。如果值小於或者等於零,則被semwait阻塞的某乙個程序解除阻塞。
對於訊號量的值(x)可以這樣理解:初值為n表示最多可以有n個程序同時進入臨界區;若x>=0表示還可以允許最多x個程序進入臨界區;x<0表示有x個程序在阻塞佇列中。
看一下訊號量的c語言描述:
struct semaphore
;void semwait(semaphore s)
}void semsignal(semaphore s)
}struct binary_semaphore
value;
queuetype queue;
};void semwaitb(binary_semaphore s)
}void semsignalb(semaphore s)
}
與二元訊號量相關的乙個概念是互斥量(mutex)。兩者的關鍵區別在於為互斥量加鎖(設定其值為0)的程序和為互斥量解鎖(設定其值為1)的程序必須是同乙個程序。相比之下可能由某個程序對二元訊號量進行加鎖操作,而由另乙個程序為其解鎖。
下面是訊號量解決互斥問題的c語言描述。
const int n = /*程序數*/;
semaphore s = 1;
void p(int i)
}void main()
2.訊號量的實現
訊號量的操作必須是原子操作,可以用硬體方法實現,另外也可以用軟體方法實現。下面列出兩種硬體實現方法,當然禁用中斷的方法只能在單處理器中實現。只是為了實現互斥,因為問題的本質就是互斥。在這個互斥操作中,程序是可以被搶占的,但是其依然占有臨界區,因為訊號量值的改變,要到程序離開臨界區之後才變化。
semwait(s)
s.flag = 0;
}semsignal(s)
s.flag = 0;
}semwait(s)
else
允許中斷;
}semsignal(s)
允許中斷;
}
併發的互斥與訊號量
併發 互斥與訊號量 一 關鍵術語 1原子操作 乙個或多個指令的序列,對外是不可分的 即沒有其他程序可以看到其中間狀態或者中斷此操作。2.臨界區 critical section 是一段 在這段 中程序將訪問資源 只能有乙個程序在此段 中執行。3.互斥 mutual exclusion 當乙個程序在臨...
互斥量與訊號量(互斥與同步)
互斥量 mutex 互斥量表現互斥現象的資料結構,也被當作二元訊號燈。乙個互斥基本上是乙個多工敏感的二元訊號,它能用作同步多工的行為,它常用作保護從中斷來的臨界段 並且在共享同步使用的資源。mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以mutex主要的作用是用於互斥。mutex物件的值,只...
訊號量 互斥量
lonelycatcher if only as first.來自 訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法...