線性一致性
編輯在并發編程中,如果一個操作(或一組操作)由有序的調用和響應事件(事件)列表組成,則該操作(或一組操作)是可線性化的,可以通過添加響應事件來擴展該列表,例如:
- 擴展列表可以重新表示為順序歷史記錄(可序列化)。
- 該順序歷史記錄是原始未擴展列表的子集。
非正式地,這意味著未修改的事件列表是可線性化的,當且僅當它的調用是可序列化的,但串行調度的一些響應尚未返回。
在并發系統中,進程可以同時訪問一個共享對象。 因為多個進程正在訪問一個對象,所以可能會出現這樣一種情況,即當一個進程正在訪問該對象時,另一個進程會更改其內容。 使系統可線性化是解決此問題的一種方法。 在可線性化的系統中,盡管操作在共享對象上重疊,但每個操作似乎都是瞬時發生的。 線性一致性是一個強正確性條件,它限制了當一個對象被多個進程同時訪問時可能的輸出。 它是一種安全屬性,可確保操作不會以意外或不可預測的方式完成。 如果一個系統是可線性化的,它允許程序員對系統進行推理。
線性化的歷史
編輯線性一致性是 Herlihy 和 Wing 在 1987 年作為一致性模型首次引入的。它包含了對原子的更多限制性定義,例如原子操作是不能(或不會)被并發操作中斷的操作,而并發操作通常是模糊的 當一個操作被認為開始和結束時。
一個原子對象可以從它的順序定義中立即和完整地理解,作為一組并行運行的操作,它們似乎總是一個接一個地發生; 不會出現不一致。 具體來說,線性化保證系統的不變量被所有操作觀察到并保持不變:如果所有操作單獨保持不變量,那么整個系統都會保持不變。
線性化的定義
編輯并發系統由一組通過共享數據結構或對象進行通信的進程組成。 線性一致在這些并發系統中很重要,在這些系統中,對象可能同時被多個進程訪問,并且程序員需要能夠推理出預期的結果。 并發系統的執行會產生歷史記錄,即已完成操作的有序序列。
歷史記錄是由一組線程或進程對對象進行的一系列調用和響應。 可以將調用視為操作的開始,而響應是該操作的結束信號。 函數的每次調用都會有一個后續響應。 這可用于對對象的任何使用進行建模。 例如,假設兩個線程 A 和 B 都試圖獲取一個鎖,如果它已經被占用則退出。 這將被建模為兩個線程都調用鎖定操作,然后兩個線程都收到響應,一個成功,一個失敗。
順序歷史記錄是所有調用都有立即響應的歷史記錄; 即調用和響應被認為是即時發生的。 順序歷史應該很容易推理,因為它沒有真正的并發性; 前面的例子不是連續的,因此很難推理。 這就是線性化的用武之地。
如果已完成的操作存在線性順序 σ {\\displaystyle \\sigma } ,則歷史是可線性化的,這樣:
- 對于 σ {\\displaystyle \\sigma } 中每個完成的操作,該操作在執行中返回的結果與如果每個操作按 σ {\\displaystyle \\sigma 的順序一個接一個地完成時操作返回的結果相同 } .
- 如果操作 op1 在 op2 開始(調用)之前完成(獲得響應),則 op1 在 σ {\\displaystyle \\sigma } 中先于 op2。
換一種說法:
- 它的調用和響應可以重新排序以產生連續的歷史記錄;
- 根據對象的順序定義,順序歷史是正確的;
- 如果響應先于原始歷史記錄中的調用,則在順序重新排序中它仍必須先于它。
(請注意,這里的前兩個要點與可串行化相匹配:操作似乎按某種順序發生。這是線性化所獨有的最后一點,因此是 Herlihy 和 Wing 的主要貢獻。)
讓我們看一下對上面的鎖定示例重新排序的兩種方法。
將 B 的調用重新排序在 A 的響應下方會產生順序歷史記錄。 這很容易推理,因為所有操作現在都以明顯的順序進行。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/195969/