日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

簡介自旋鎖

“鎖”的作用就是保護臨界區資源,避免不同的CPU同時訪問相同的變量(或中斷與進程同時訪問相同變量)。非原子變量的賦值,大多數都不是一個指令周期能完成的,試想如果CPU1將某變量剛更改了一半,CPU2正好就來讀取了這個半成品變量,并基于此去做計算,可能會造成嚴重后果。

解決辦法就是CPU1在改寫這個變量前,先“加鎖”;CPU2訪問這個變量前也先加鎖,但由于已經被加鎖了,所以獲取鎖失敗,CPU2原地等待鎖釋放;CPU1改寫完變量后,“解鎖”;CPU2獲取到鎖后加鎖,然后訪問變量,完成后解鎖。

上面的“鎖”可以是信號量、互斥鎖、自旋鎖等。本文的自旋鎖(spinlock)與其它鎖的最大不同,就是在等待鎖釋放的時候不會睡眠,而是在空轉(自旋)。信號量和互斥鎖在等待鎖釋放的時候,會進入睡眠。

不睡眠的好處是:可以在中斷上下文運行;另外,對于很快就能獲取到鎖的場景,這種方式效率更高。

不睡眠的壞處是:如果等待鎖釋放的時間較長,則極其浪費CPU資源。

自旋鎖在X86的代碼實現

/******include/asm-i386/spinlock_types.h***/

typedef struct {
                unsigned int slock;
} raw_spinlock_t;
 #define __RAW_SPIN_LOCK_UNLOCKED { 1 }

/******include/asm-i386/spinlock.h***/

static inline void __raw_spin_lock(raw_spinlock_t *lock){
    asm volatile(
       // lock->slock減1
      1:LOCK_PREFIX decb %0
       //如果不為負.跳轉到3f.3f后面沒有任何指令,即為退出
      jns 3f
      //重復執行nop.nop是x86的小延遲函數
      2:rep nop
      cmpb $0,%0
      //如果lock->slock不大于0,跳轉到標號2,即繼續重復執行nop
      jle 2
      //如果lock->slock大于0,跳轉到標號1,重新判斷鎖的slock成員
      jmp 1
      3:: "+m" (lock->slock) : : "memory");
}

在多處理器環境中 LOCK_PREFIX 實際被定義為 “lock”前綴。x86 處理器使用“lock”前綴的方式提供了在指令執行期間對總線加鎖的手段。芯片上有一條引線 LOCK,如果在一條匯編指令(ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, XCHG)前加上“lock” 前綴,經過匯編后的機器代碼就使得處理器執行該指令時把引線 LOCK 的電位拉低,從而把總線鎖住,這樣其它處理器或使用DMA的外設暫時無法通過同一總線訪問內存。

jns 匯編指令檢查 EFLAGS 寄存器的 SF(符號)位,如果為 0,說明 slock 原來的值為 1,則線程獲得鎖,然后跳到標簽 3 的位置結束本次函數調用。如果 SF 位為 1,說明 slock 原來的值為 0 或負數,鎖已被占用。那么線程轉到標簽 2 處不斷測試 slock 與 0 的大小關系,假如 slock 小于或等于 0,跳轉到標簽 2 的位置繼續忙等待;假如 slock 大于 0,說明鎖已被釋放,則跳轉到標簽 1 的位置重新申請鎖。

分享到:
標簽:自旋
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定