在當前的計算領域中,交易性記憶(Transactional Memory)正在被視為一種具有潛力的技術,旨在簡化並行程式設計。交易性記憶試圖通過允許一組載入和儲存指令以原子方式執行,來消除傳統鎖的複雜性。這一概念類似於數據庫中的交易,用以控制並行計算中共享記憶體的訪問。
交易性記憶系統提供高層抽象,作為低層執行緒同步的替代方案,從而在並行系統中協調共享數據的並行讀寫。
在並行程式設計中,當多條執行緒試圖訪問共享資源時,必須進行同步。傳統的鎖同步機制往往採用悲觀的方式,這限制了在臨界區外的執行緒運行。因此,在低衝突的工作負載中,應用和釋放鎖所產生的額外開銷會影響系統的表現。
交易性記憶提供了樂觀的並行控制,允許執行緒在最小干擾的情況下並行運行。
交易性記憶的目的在於通過強制原子性、一致性和隔離性來透明支持標記為交易的代碼區域。當檢測到衝突時,一個交易將會恢復到其初始狀態,并重新執行直至消除所有衝突。在成功提交之前,交易內的任何操作結果都是投機性的,這與基於鎖的同步方式形成鮮明對比。
以這種方式,程序員無需明確識別鎖或購買鎖的順序,利用交易性記憶所編寫的程式不會導致死鎖的問題。這不僅提高了程式的執行效率,還保障了數據的安全性。
程序的正確實現可以確保數據不會在不通過交易的情況下被執行緒共享,並產生可序列化的結果。
不過,使用大量交易的程序中仍可能存在與並行操作相關的錯誤,特別是在那些語言庫無法正確實施的情況下。由於交易中的斷點無法設置,這使得通過交易引入的錯誤往往難以調試。
交易性記憶的局限之一在於它需要共享記憶體的抽象。儘管交易性記憶程序無法產生死鎖,但仍可能遭受活鎖或資源饑餓的問題。例如,較長的交易可能因為多個較小的交易重複恢復而浪費時間和能源。
交易性記憶中的原子性抽象需要硬體機制來檢測衝突並撤銷對共享數據所做的任何更改。硬體交易性記憶系統可能包括對處理器、快取和總線協議的修改,以支持交易。交易中的投機性值必須緩衝並在提交時對其他執行緒保持不可見。
至今仍在討論的問題是,最佳的緩衝區大小如何定義,因為目前商業程式中交易的使用相對有限。
在硬件實現中,存儲隊列或快取等不同結構用於緩存投機性值,這些結構的距離處理器越遠,可以持有的投機性值越多。雖然硬體交易性記憶提供了比軟體解決方案更優越的性能,但目前的應用實際仍然有限。
軟體交易性記憶則提供了在軟體運行時庫或編程語言中的交易性記憶語義,對硬體依賴最小。儘管如此,這種軟體實現通常伴隨著與硬體解決方案相比的性能損失。
交易性記憶的早期實現之一是Transmeta的Crusoe和Efficeon處理器中使用的門控儲存緩衝器。這項技術主要用於促進二進制翻譯的投機性優化,而並非直接暴露給程式設計師。隨著時代的推移,各種硬體和軟體的交易性記憶解決方案不斷發展,各大科技公司如IBM、AMD和Intel等都投入資源,以研究其潛力。
隨著交易性記憶的技術進步,我們是否能夠看到更高效、更易用的並行編程模型出現?
這項技術是否將引領我們進入一個全新的程式設計領域,並改變我們如何看待並行運算的問題呢?隨著科技的不斷進步,交易性記憶未來將會為我們的程式設計帶來怎樣的變化呢?