and型信號量
『壹』 什麼是記錄型信號量
所謂記錄型信號量就是信號量是一個結構體的數據結構。其定義為:
Typedef struct{
int value;
struct process_control_block *list;
}semaphore;
該數據專結構中只有屬兩個分量,一個是一個整形變數value,表示某類資源可利用的數量;另一個是一個指針,是因該資源而被阻塞的進程構成的阻塞隊列的首指針。
『貳』 信號量機制
《Operating Systems Design and Implementation》中Andrew S. Tanenbaum對信號量的描述和以前看過的教材有區別。但其核心思想是類似的。
以前的書上(包括網上不少帖子)是這么敘述的:
―――――――――――――――――――――――――――――――――――――
信號量S是一個整數,S大於等於零時代表可供並發進程使用的資源實體數,但S小於零時則表示正在等待使用臨界區的進程數。
Dijkstra同時提出了對信號量操作的PV原語。
P原語操作的動作是:
(1)S減1;
(2)若S減1後仍大於或等於零,則進程繼續執行;
(3)若S減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。
V原語操作的動作是:
(1)S加1;
(2)若相加結果大於零,則進程繼續執行;
(3)若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。
PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執行期間不允許有中斷的發生。
―――――――――――――――――――――――――――――――――――――
說明:要保證PV是原子操作,對於操作系統,只須在操作過程中關中斷即可。
Andrew S. Tanenbaum對信號量的定義有所不同,其PV操作也有區別。
―――――――――――――――――――――――――――――――――――――
信號量是一個整數,其值不小於0。它表示被積累下來的喚醒操作數。
P原語操作的動作是:
(1) 檢查S是否大於0。
(2) 若S>0,則S = S – 1;否則,執行P操作的進程將睡眠,並且此時P操作並未結束。
V原語操作的動作是:
(1)S = S + 1。
(2)如果一個或多個進程在該信號量上睡眠,無法完成先前的P操作,則有系統選擇其中一個並允許它完成P操作。
――――――――――――――――――――――――――――――――――――――
Andrew S. Tanenbaum的觀點認為:當S = 0時,P操作不會馬上結束。其作用(S = S – 1)必須在該進程被喚醒後才能實現。
兩種定義的區別是:
前者定義的PV操作都不會阻塞,而後者中P操作可能被阻塞。
前者的S的初值一般大於0,而後者中,S通常初值為0。
『叄』 信號量機制可以總結為三個要素,應該是哪些
《Operating Systems Design and Implementation》中Andrew S. Tanenbaum對信號量的描述和以前看過的教材有區別。但其核心思想是類似的。
以前的書上(包括網上不少帖子)是這么敘述的:
―――――――――――――――――――――――――――――――――――――
信號量S是一個整數,S大於等於零時代表可供並發進程使用的資源實體數,但S小於零時則表示正在等待使用臨界區的進程數。
Dijkstra同時提出了對信號量操作的PV原語。
P原語操作的動作是:
(1)S減1;
(2)若S減1後仍大於或等於零,則進程繼續執行;
(3)若S減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。
V原語操作的動作是:
(1)S加1;
(2)若相加結果大於零,則進程繼續執行;
(3)若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。
PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執行期間不允許有中斷的發生。
―――――――――――――――――――――――――――――――――――――
說明:要保證PV是原子操作,對於操作系統,只須在操作過程中關中斷即可。
Andrew S. Tanenbaum對信號量的定義有所不同,其PV操作也有區別。
―――――――――――――――――――――――――――――――――――――
信號量是一個整數,其值不小於0。它表示被積累下來的喚醒操作數。
P原語操作的動作是:
(1) 檢查S是否大於0。
(2) 若S>0,則S = S – 1;否則,執行P操作的進程將睡眠,並且此時P操作並未結束。
V原語操作的動作是:
(1)S = S + 1。
(2)如果一個或多個進程在該信號量上睡眠,無法完成先前的P操作,則有系統選擇其中一個並允許它完成P操作。
『肆』 什麼是信號量機制
信號量機制
目錄
1摘要
2基本信息
(2)若S減1後仍大於或等於零,則進程繼續執行; 信號量機制分 信號量集的定義:
基本信息
提出時間
1965年
1965年,荷蘭學者Dijkstra提出了利用信號量機制解決進程同步問題,信號量正式成為有效的進程同步工具,現在信號量機制被廣泛的用於單處理機和多處理機系統以及計算機網路中。
信號量S是一個整數,S大於等於零時代表可供並發進程使用的資源實體數,但S小於零時則表示正在等待使用臨界區的進程數。
Dijkstra同時提出了對信號量操作的PV原語。
P原語操作的動作是:
(1)S減1;
(2)若S減1後仍大於或等於零,則進程繼續執行;
(3)若S減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。
V原語操作的動作是:
(1)S加1;
(2)若相加結果大於零,則進程繼續執行;
(3)若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。
PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語行期間不允許有中斷的發生。
信號量機制分 整型信號量機制、記錄型信號量機制、and型信號量機制、信號量集。
整型信號量是一種最簡單的信號量,主要用於解決並發程序互斥訪問臨界資源問題。
記號信號量在整型信號量的舉出上進行了改進,讓不能進入臨界區的進程「讓權等待」,即進程狀態有運行轉換為阻塞狀態,進程進入阻塞隊列中等待。
AND型信號量集是將進程在運行中所需要的臨界資源全部一次性分配給進程,等進程用完後再全部一次釋放。
信號量集的定義:
1.用s1、s2、...sn分別表示有n類裂解資源信號量;
2.用d1、d2、...dn分別表示進程需要的每類臨界資源個數;
3.用t1、t2、...tn分別表示每類臨界資源分給進程的下限值;
『伍』 利用AND型信號量解決哲學家進餐問題,要windows下的C/C++的完整源代碼程序。(五個哲學家五隻筷子)
// 哲學家進餐問題
#define WIN32_LEAN_AND_MEAN
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
(LPVOID);
#define PHILOSOPERS 5
HANDLE chop_sticks[PHILOSOPERS];
HANDLE threads[PHILOSOPERS];
intmain(int argc,char** argv)
{
for(inti=0;i<DESKTOPHORZRES;++i)
chop_sticks[i]=CreateMutex(NULL,FALSE,NULL);
for(inti=0;i<PHILOSOPERS;++i)
threads[i]=CreateThread(NULL,
0,
PhilosoperThreadFunc,
(PVOID)i,
0,
NULL);
WaitForMultipleObjects(PHILOSOPERS,threads,TRUE,INFINITE);
returnEXIT_SUCCESS;
}
DWORD WINAPI PhilosoperThreadFunc(LPVOIDn)
{
inti=(int)n;
HANDLEmy_chop_sticks[2];
my_chop_sticks[0]=chop_sticks[i];
my_chop_sticks[1]=chop_sticks[(i-1>0)?i-1:PHILOSOPERS];
srand(GetTickCount());
while(1){
Sleep((rand()%8)*500+500);
printf("Philosopher #%d want to eat\n",i);
WaitForMultipleObjects(2,my_chop_sticks,TRUE,0);
printf("Philosopher #%d is eating\n",i);
ReleaseMutex(my_chop_sticks[0]);
ReleaseMutex(my_chop_sticks[1]);
printf("Philosopher #%d finished his dinner\n",i);
}
}
『陸』 15. 對於記錄型信號量,在執行一次P操作時,信號量的值應當 ;在執行V操作時,信號量的值應當 。 。
對於記錄型信號量,在執行一次P操作時,信號量的值應當 (C) ;在執行V操作時,信號量的值應當(B)
『柒』 什麼是AND信號量
AND型信號量是指同時需要多個資源且每種佔用一個資源時的信號量操作。即在一個專原語中申請整段屬代碼需要的多個臨界資源,要麼全部分配給它,要麼一個都不分配給它。以避免當一段處理代碼需要同時獲取兩個或多個臨界資源時,出現由於各進程等待其餘的臨界資源,變成死鎖的情況。
(7)and型信號量擴展閱讀:
在AND型信號量中時,各個信號的次序並不重要,雖然會影響進程歸人哪個阻塞隊列,但是因為是採取原子操作方式,對資源全部分配或不分配,所以總有進程獲得全部資源並在推進之後釋放資源,因此不會死鎖。
由於AND型信號量中一般信號在使用時的靈活性,因此通常並不成對使用Swait和Ssignal。為了避免死鎖可一起申請所有需要的資源,但不一起釋放。
『捌』 利用AND型信號量實現生產者-消費者問題的模擬
大哥,我讓人畫個圖都給100分阿,你這才40,一個大程序阿!!在加點,我給你做
『玖』 計算機操作系統 And型信號量問題
AND同步機制的基本思想是:將進程在整個運行過程中需要的所有資源,一次性全部地分配回給進程,答待進程使用完後再一起釋放。只要尚有一個資源未能分配給進程,其它所有可能為之分配的資源也不分配給它。
這樣做的目的是為了避免死鎖。
同時,And型信號量具有同步機制。
通俗的來講就是,把資源全部分配給進程,當前進程全部執行完畢後收回,清空等待隊列,然後喚醒所有進程,再度分配。
同步操作是And信號量的特性,沒有為什麼不能只喚醒第一個,因為它要同步,它要資源全部分配。