首頁  >  文章  >  後端開發  >  C/C++中的行程同步

C/C++中的行程同步

王林
王林轉載
2023-09-16 11:09:071565瀏覽

進程同步是一種解決共享資料並發存取問題的技術,該問題可能導致資料不一致。協作進程是指可以影響其他進程或受其他進程影響,進而導致進程資料不一致的進程,因此需要進程同步來確保資料的一致性。

臨界區問題

每個行程都有一個保留的程式碼段,稱為關鍵部分。在這一節中,進程可以更改公共變數、更新表、寫入檔案等。關於臨界區需要注意的關鍵一點是,當一個進程在其臨界區中執行時,其他進程不能在其臨界區中執行。每個進程在進入其關鍵部分之前都必須請求許可,實現此請求的程式碼部分是入口部分,程式碼的結尾是退出部分,剩下的程式碼是 #剩餘部分。

下面給出的是特定進程P1的關鍵部分的結構

C/C++中的行程同步

#有以下三個要求:必須滿足關鍵部分

  • 互斥 - 如果一個進程假設P1 在其關鍵部分中執行,而不是任何其他進程假設P2 無法在其臨界區執行。
  • 進度 - 如果沒有進程在其臨界區執行,並且有進程想要進入其臨界區臨界區,那麼只有那些不在剩餘部分執行的進程可以請求進入臨界區,並且選擇可以無限期延後。
  • 有界等待 - 在有界等待中,在進程發出進入其臨界區的請求之後以及該請求被批准之前,進程可以進入其臨界區的次數是有限制的。

作業系統中常用兩種方法來處理關鍵部分。

搶佔式核心 - 搶佔式核心允許進程在進程被搶佔時被搶佔。在核心模式下運作。

非搶佔式核心 - 非搶佔式核心不允許在核心模式下執行的行程被搶佔。

Peterson 的解決方案

Peterson 的解決方案是針對臨界區問題的基於經典的軟體解決方案。它僅限於在其關鍵部分和剩餘部分之間交替執行的兩個進程。 Peterson 的部分要求在兩個行程之間共用兩個資料項,也就是

  • Intturn;
  • Boolean flag[2];

這裡,變數turn表示輪到誰進入臨界區,flag陣列表示進程是否準備好進入臨界區。

如果turn == i,則表示進程Pi被允許進入其臨界區。

如果flag[j]為TRUE,則表示進程j已準備好進入其臨界區

如下是Peterson方案中進程P的結構

C/C++中的行程同步

彼得森解決方案保留了所有三個條件-

  • 互相排斥 − 一次只有一個進程可以訪問臨界區。
  • 進度 − 臨界區外的進程不會阻止其他進程進入臨界區。
  • 有界等待 - 每個進程都有機會進入其臨界區,而無需無限期地等待。

同步硬體

已實作使用兩種類型的指令-

  • #Test 和Set()
  • swap()

Test 和Set ()是解決同步問題的硬體方案。其中,有一個由多個進程共享的共享變量,稱為 Lock,它可以具有 0 和 1 中的一個值,其中 1 表示獲得鎖,0 表示釋放鎖。

每當流程嘗試進入他們需要的臨界區來查詢鎖的值。如果lock的值為1,那麼他們必須等待,直到lock的值不會變成0。

下面給出的是TestAndSet()的互斥實作

C/C++中的行程同步

信號量

是訊號量是一種同步工具,用於克服TestAndSet() 和Swap() 指令產生的問題。信號量S 是一個整數變量,可以透過wait() 和signal() 這兩個標準原子操作來存取

wait() 函數:

wait(S) {
   While S <= 0
   ; // no operation
   S--;
}

Signal()函數的功能:

signal(S) {
   S++;
}

當一個行程正在修改訊號量的值時,其他行程不能同時操作相同的訊號量值。

下面給出了使用信號量的互斥實現

C/C++中的行程同步

#作業系統使用兩種類型的信號量,它們是:

計數信號量 - 這種類型的信號量的值可以在無限制的域內變化

##二進位信號量 - 這種類型的信號量的值可以在0和1之間變化。它們也被稱為互斥鎖。作業系統使用它來解決多個進程中的臨界區問題。

以上是C/C++中的行程同步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除