參考
《王道-操縱系統》
概述
信號量機制用於解決同步和互斥的問題,它通過兩個原語 wait 和 signal 實現,也可以表示爲 p,v。其中 wait 是申請資源,signal 是釋放資源。
整型信號量
整型信號量是將信號量定義爲整型 S
wait(S)
{
// 如果資源數小於 0 則陷入忙等
while(S<=0);
S=S-1;
}
signal(S)
{
S=S+1;
}
可以看到,整型信號量並未遵循讓權等待,而是會出現忙等的情況
記錄型信號量
所謂記錄型,就是信號量採用結構體的方式進行定義,相比於整型信號量,其優勢在於不會陷入忙等狀態,因爲在信號量中,設置了等待隊列
typedef struct
{
int value;
struct process *L;
}semaphor;
void wait(semaphor S)
{
S.value--;
if(S.value<0)
{
add this process to S.L;
// block 原語,用於進行自我阻塞
block(S.L);
}
}
void signal(semaphor S)
{
S.value++;
// 如果資源被釋放了,而就緒隊列中還有其他等待進程
// 則喚醒其他等待進程
if(S.value<=0)
{
remove a process P from S.L;
wakeup(P);
}
}
利用信號量實現同步
P2程序的 y 語句需要 P1程序的 x 語句執行完後,才能啓用,這裏使用 S 來確定程序執行順序的問題
semaphor S=0;
P1()
{
x;
v(S);
}
P2()
{
P(S);
y;
}
信號量實現互斥
使用互斥量完成對臨界區的互斥訪問
semaphor S=1;
P1()
{
P(S);
進入臨界區;
V(S);
}
P2()
{
P(S);
進入臨界區;
V(S);
}