我想在 System V 共享記憶體中實作一個counter4 位元組的無鎖int。作者是一個C 程式,讀者是一個Python程式。作業大致是這樣的:
counter原子操作中的C 代碼更新- Python 代碼讀取
counter并具有一致的記憶體視圖(最終一致性是完全可以接受的) - 沒有實施鎖來實作這一點
在 C 語言中,有原子獲取/更新操作可以實作這一點并保證記憶體一致性,我相信在 Python 中也是如此。
然而,據我所知,C 中關于原子操作的假設不一定適用于用另一種語言和編譯器撰寫和編譯的代碼。
有沒有一種方法可以在不涉及實作低級鎖的情況下實作跨語言的共享記憶體的一致視圖?
uj5u.com熱心網友回復:
有沒有一種方法可以在不涉及實作低級鎖的情況下實作跨語言的共享記憶體的一致視圖?
不,不是一般的。
首先我想說這與語言無關,而更多地與實際平臺、架構、實作或作業系統有關。
因為語言差異很大,以 Python 為例:它沒有直接訪問記憶體的語言本機方式,或者以低級方式說。然而,它的一些實作確實提供了自己的 API。用于這種低級使用的語言對此具有抽象,就像 C、C 或 Rust 一樣。但是這種抽象的實作方式通常完全不同,因為它們通常取決于代碼的運行、解釋或編譯位置。某些體系結構的整數是大端,在大多數情況下,例如 x86 或 arm,它的小端。作業系統也有發言權,例如記憶體被使用和抽象。
雖然許多語言都有線性記憶體的共同抽象,但它在原子方面變得更加混亂:C 的編譯器可以生成機器代碼,即檢查 CPU 運行的程式集是否支持新的花哨的原子整數指令并使用它們或回退通常支持原子標志加上整數。如果代碼可以在作業系統管理的環境中運行,它可以只依賴于作業系統、自旋鎖或由 POSIX、SystemV、Linux、Windows 定義的標準化 API。
對于非命令式語言,它變得更加混亂。
因此,為了在語言之間交換資料,這些語言的實作必須使用一些公共交換。例如,他們可以嘗試直接通過共享記憶體來做到這一點。這被稱為應用程式二進制介面 (ABI),因為記憶體抽象至少對它們先驗是通用的。或者作業系統或架構甚至可能對這些東西進行標準化,甚至支持 API。
System V 將是為這種交換而設計的 API,但由于 AFAIK 它沒有原子的抽象或鎖定較少的抽象,即使 System V 背景關系不在標題中,答案仍然是否定的。
uj5u.com熱心網友回復:
我將對 Superlokkus 的一些斷言提出異議。
該mmap原語在 C 和 Python 中均可用。該原語為您提供位于兩個行程共享的物理頁面中的記憶體。不同的虛擬地址,相同的記憶體物理頁。另一個行程可以立即查看一個行程的更改。這就是它必須作業的方式。它在硬體級別運行。抽象是無關緊要的。
現在,這并不意味著您可以獲得這些更改的通知。如果您在回圈中輪詢(大概是在檢查之間休眠的友好回圈),那么您將在下次檢查時看到更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/350328.html
