進程同步是一種解決共享資料並發存取問題的技術,該問題可能導致資料不一致。協作進程是指可以影響其他進程或受其他進程影響,進而導致進程資料不一致的進程,因此需要進程同步來確保資料的一致性。
下面給出的是特定進程P1的關鍵部分的結構
#有以下三個要求:必須滿足關鍵部分
作業系統中常用兩種方法來處理關鍵部分。
搶佔式核心 - 搶佔式核心允許進程在進程被搶佔時被搶佔。在核心模式下運作。
非搶佔式核心 - 非搶佔式核心不允許在核心模式下執行的行程被搶佔。
Peterson 的解決方案是針對臨界區問題的基於經典的軟體解決方案。它僅限於在其關鍵部分和剩餘部分之間交替執行的兩個進程。 Peterson 的部分要求在兩個行程之間共用兩個資料項,也就是
這裡,變數turn表示輪到誰進入臨界區,flag陣列表示進程是否準備好進入臨界區。
如果turn == i,則表示進程Pi被允許進入其臨界區。
如果flag[j]為TRUE,則表示進程j已準備好進入其臨界區
如下是Peterson方案中進程P的結構
彼得森解決方案保留了所有三個條件-
已實作使用兩種類型的指令-
Test 和Set ()是解決同步問題的硬體方案。其中,有一個由多個進程共享的共享變量,稱為 Lock,它可以具有 0 和 1 中的一個值,其中 1 表示獲得鎖,0 表示釋放鎖。
每當流程嘗試進入他們需要的臨界區來查詢鎖的值。如果lock的值為1,那麼他們必須等待,直到lock的值不會變成0。
下面給出的是TestAndSet()的互斥實作
是訊號量是一種同步工具,用於克服TestAndSet() 和Swap() 指令產生的問題。信號量S 是一個整數變量,可以透過wait() 和signal() 這兩個標準原子操作來存取
wait() 函數:
wait(S) { While S <= 0 ; // no operation S--; }
Signal()函數的功能:
signal(S) { S++; }
當一個行程正在修改訊號量的值時,其他行程不能同時操作相同的訊號量值。
下面給出了使用信號量的互斥實現
#作業系統使用兩種類型的信號量,它們是:
計數信號量 - 這種類型的信號量的值可以在無限制的域內變化
##二進位信號量 - 這種類型的信號量的值可以在0和1之間變化。它們也被稱為互斥鎖。作業系統使用它來解決多個進程中的臨界區問題。
以上是C/C++中的行程同步的詳細內容。更多資訊請關注PHP中文網其他相關文章!