極簡學習信號量

參考

《王道-操縱系統》

概述

信號量機制用於解決同步和互斥的問題,它通過兩個原語 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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章