Bernstein條件是指並發進程的無關性是進程與時間無關的一個充分條件,這一條件在1966年首先由Bernstein提出。
Bernstein條件就是講兩個過程如果有數據衝突(Data hazard),那么就沒法並行執行。比如過程A生成數據d,而過程B需要輸入數據d,那么B就需要A的輸入,他們就沒法並行執行(寫後讀問題,RAW)。如果二者會影響後續過程需要的數據,尤其是該數據和他們執行的順序很有關係,那么他們同樣也不能並行執行(寫後寫問題, WAW)。
例如:p1:y=z+y;p2: z=x+z,假設x=1,y=2,z=3
如果先運行p1,則最後的結果是x=1,y=5,z=4;如果先運行p2,則x=1,y=6,z=4。兩次的結果不一樣,即程式不可再現,所以p1,p2不能並行的執行。
借用上面的例子,p1:y=z+y,那么p1的讀集為 R(p1)={z,y},p1的寫集為 W(p1)={y}。
對進程S1、S2,Bernstein條件要求R(S1)∩W(S2)∪W(S1)∩R(S2)∪W(S1)∩W(S2)={}。
則,Bernstein條件的一般形式為:
定義R(pi)={a1,a2,a3,...an};
W(pi)={b1,b2,b3,...bn};
在以上兩個集合元素間滿足以下3條關係:
(1) R(p1) ∩ W(p2) = ∅
(2) R(p2) ∩ W(p1) = ∅
(3) W(p1) ∩ W(p2) = ∅
就稱p1,p2這兩個語句(或程式段)滿足Bernstein條件。
需要注意的是,雖然滿足了Bernstein條件後就可以保證程式運行的結果可再現性,但是在實際程式設計中,Bernstein條件是無法實現的。所以,解決多道程式並發中的資源互斥問題,不是通過程式本身來檢驗,而是通過另一種作業系統層面的設計思路來保證,這就是進程。