一、併發的原理
1、競爭條件發生在當多個進程或者線程在讀寫數據時,其最終結果依賴於多個進程的指令執行順序。
2、臨界資源:兩個或更多的進程需要訪問的不可共享的資源。
3、臨界區:使用臨界資源的那一部分代碼。
4、互斥
互斥產生的兩個問題:死鎖、飢餓(如三個進程P1、P2、P3,訪問權輪流授予P1,P2,而P3無法訪問資源)
二、信號量
1、基本原理:爲了在進程之間發信號,定義一個稱爲信號量的特殊變量,進程傳送信號使用 semSignal(s),進程接收信號使用semWait(s)
2、定義:信號量是一個具有整數值的變量,在它之上定義三個原子操作:
- 一個信號量可以初始化成非負數。
- semWait 操作使信號量減1。如果值<0,則執行semWait 的進程被阻塞,否則進程繼續執行。—— 讓進程進入阻塞隊列
- semSignal 操作使信號量加1。如果值 <=0(說明現在有進程正被阻塞),則被semWait 操作阻塞的進程將被解除。—— 將一個進程從阻塞隊列放到就緒隊列
信號量原語的定義
struct semaphone{
int count;
queueType queue;
}
void semWait(semaphore s)
{
s.count--;
if(s.count < 0)
{
place this process in s.queue;
block this process;
}
}
void semSignal(semaphore s)
{
s.count ++;
if(s.count <= 0)
{
remove a process P from s.queue;
place process P on ready list;
}
}
3、信號量的應用
- 互斥:每個進程在進入臨界區之前執行semWait (s)
- 生產者/消費者問題: