linux內存管理 (二) [硬件3][概念] SMP-Consistency之內存操作的原子化

  • 原子化操作是什麼
原子化這個問題要看每個體系結構的定義。每種體系結構都會說明自己哪些內存操作是原子的。更復雜的問題是進行通訊的時候需要做“讀-判斷-寫”這樣一個組合原子操作。早期CPU比較簡單,比如早期的x86會用LOCK這樣的信號來保證一段處理完全獨佔總線,讓內存被原子化地更新。用一個非事實但說明問題的比喻,在上面這個處理過程,如果我在修改的時候把總線鎖住,把data的每個域都更新了,然後其他CPU才能進來,這肯定是Consistent的,但這樣效率就低了,這段時間其他CPU全都閒着(stall),等你讓出總線。考慮到一個內存操作可能幾十ns,而一條指令不用一個ns,這個等待沒法忍。所以這種方法現在基本上就不用了,現在大部分時候使用LL/SC或者CAS等方案來保證多個動作的原子性。但我們這裏不是討論原子性問題,這個問題我們點到爲止,我們就認爲我們的CPU有一組針對內存的原子操作,以這個爲基礎討論問題。

  • ARMv6的原子化操作指令
	B2.2.3 SMP的Consistency之內存操作的原子化:內存同步原語
		同步原語,以確保在內存順序模型中正確操作系統信號量。
		內存同步原語指令定義爲用於確保內存同步的指令:
		
		在ARMv6之前
			支持由SWP和SWPB指令組成。// 在ARMv6中不推薦使用)。
		ARMv6引入了新的LDREX和STREX(Load and Store Exclusive)指令。
			•LDREX、STREX
		
			LDREX和STREX支持共享和非共享內存。
				當要同步的進程在同一個處理器上運行時,可以使用非共享內存。
				當要同步的進程在不同的處理器上運行時,必須使用共享內存。

  • 如何正確使用ARMv6的原子化操作指令
	B2.7.4同步原語和內存順序模型
	==============================
		對同步原語建模,SWP/SWPB和LDREX/STREX遵循這些指令訪問的內存類型的內存順序模型。
		因此:
			•用於聲明spinlock的可移植代碼在聲明spinlock和進行使用spinlock的訪問之間應該包含DMB指令。
			•用於釋放spinlock的可移植代碼在寫入清除spinlock之前應包含DMB指令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章