互斥與同步(一)

一、併發的原理

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)
  • 生產者/消費者問題:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章