[ARM-assembly]-ARMV8的exclusive和inexclusive的介绍
★★★ 個人博客導讀首頁—點擊此處 ★★★
AMRv8-aarch64架構中的A64指令中,提供了如下的一些exclusive指令,用來支持exclusive操作
那為什么,arm在加入exclusive指令呢?加入這個,主要是為了解決多核情況下,鎖的競爭問題。
在軟件層面,對于共享資源的訪問,會設定一個鎖,只有能拿到這個鎖的程序,才能夠訪問共享資源,而沒有拿到鎖的程序,就不能訪問該共享資源。
static int g_lock;void lock() {while(!g_lock);g_lock = 1; // 上鎖 }void unlock() {g_lock = 0; //釋放鎖 }在使用操作系統后,這個程序也可能會出現潛在的問題,因為操作系統會調度應用程序。假設應用程序A在讀取到鎖狀態后,值為0,表示當前鎖沒有被其他程序占有,正當自己要將鎖鎖上的時候,操作系統進行了調度,應用程序B執行。程序B也讀取鎖狀態,發現值為0,表示當前鎖沒有被其他程序占有,然后將鎖給鎖上,訪問共享資源。此時,操作系統又進行了調度,應用程序A執行,將鎖給鎖上,然后訪問共享資源。那此時,就出現了2個應用程序,同時訪問共享資源,鎖的作用,被屏蔽了。
(單核的情況下)為了解決這個問題,可以在獲取鎖的時候,屏蔽中斷,那這個時候,操作系統就不能調度,也就避免上面出現的問題
static int g_lock;void lock() {mask_interrupt();while(!g_lock);g_lock = 1; // 上鎖unmask_interrupt(); }void unlock() {g_lock = 0; //釋放鎖 }但是在多核的情況下,各個cpu是并行執行的,因此這個時候,還會出現,上面描述的2個程序,同時獲取到鎖的狀態,而這個時候,通過禁止中斷,是沒有效果的.
為了解決多核情況下的鎖競爭問題,arm引入了exclusive操作,并添加了相應的指令
exclusive的操作的核心,就是會將鎖,用一個狀態機進行維護,該狀態機有2種狀態,open狀態和exclusive狀態。要想成功的對鎖進行上鎖,狀態必須要從exclusive狀態切換到open狀態,其他狀態,都是失敗的。
為了支持exclusive操作,在A64,新增了LDXR和STXR指令。
在A32和T32下,也加入LDREX和STREX指令來支持
LDXR指令,將狀態從open狀態切換到exclusive狀態,STXR指令,將狀態從exclusive狀態切換到open狀態,這個就表示store exclusive操作成功
總結
以上是生活随笔為你收集整理的[ARM-assembly]-ARMV8的exclusive和inexclusive的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [architecture]-ARMV8
- 下一篇: [Issue Fixed]-Ubuntu