日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows事件等待学习笔记(一)—— 临界区自旋锁

發布時間:2025/3/21 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows事件等待学习笔记(一)—— 临界区自旋锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Windows事件等待學習筆記(一)—— 臨界區&自旋鎖

    • 基礎知識
    • 演示代碼
      • 案例一
      • 案例二
    • LOCK
      • 單行代碼原子操作
      • 多行代碼原子操作
    • 臨界區
      • 演示代碼
      • 手動實現
    • 自旋鎖
      • 分析 KeAcquireSpinLockAtDpcLevel
      • 總結

基礎知識

并發:是指多個線程在同時執行

  • 單核(是分時執行,不是真正的同時)
  • 多核(在某一個時刻,會同時有多個線程再執行)
  • 同步:則是保證在并發執行的環境中各個線程可以有序的執行

    演示代碼

    注意:如果線程中的代碼只對局部變量進行訪問,就不存在并發的問題;只有當訪問全局變量的時候,才需要關注并發的問題

    案例一

    DWORD dwVal = 0; //全局變量線程中的代碼:dwVal++; //只有一行 安全嗎?

    答案

    dwVal++; 對應的匯編代碼:mov eax,[0x12345678]add eax,1 //當第一個線程執行到這里時,產生了線程切換的話//第二個線程也執行到這里時,將會出現邏輯錯誤mov [0x12345678],eax

    案例二

    當將案例一的三行匯編代碼改為一行時:

    INC DWORD PTR DS:[0x12345678] //一行匯編指令,安全嗎?

    答案:若當前系統為單核時,安全;但如果當前CPU為多核時,不安全(兩個核有可能同時執行一行指令)
    解決方案:改為LOCK INC DWORD PTR DS:[0x12345678]

    LOCK

    描述:在多核CPU的情況下,保證只有一個CPU能訪問帶有LOCK指令內存

    可以帶LOCK前綴的指令

    BT, BTS, BTR, BTC (mem, reg/imm) XCHG, XADD (reg, mem / mem, reg) ADD, OR, ADC, SBB (mem, reg/imm) AND, SUB, XOR (mem, reg/imm) NOT, NEG, INC, DEC (mem)

    單行代碼原子操作

    原子操作相關API

    InterlockedIncrement InterlockedExchangeAdd InterlockedDecrement InterlockedFlushSList InterlockedExchange InterlockedPopEntrySList InterlockedCompareExchange InterlockedPushEntrySList

    InterlockedIncrement 反匯編

    多行代碼原子操作

    關鍵代碼A //N行代碼要求原子操作 關鍵代碼B //單獨加LOCK可以嗎? 關鍵代碼C .......

    答案:不行,試想一下,當第一個線程執行到關鍵代碼B,第二個線程就執行完關鍵代碼A時,此時雖然第二個線程無法執行關鍵代碼B,但卻有可能會先執行關鍵代碼C

    解決方案:臨界區

    臨界區

    描述:一次只允許一個線程進入直到離開
    實現思路:加鎖(全局變量)

    演示代碼

    DWORD dwFlag = 0; //實現臨界區的方式就是加鎖//鎖:全局變量 進去加一 出去減一if(dwFlag == 0) //進入臨界區 { dwFlag = 1 .....................dwFlag = 0 //離開臨界區 }

    問題:上述演示代碼安全嗎?
    答案:仍不安全,當第一個線程通過if判斷并進入if內部,但還未來得及執行dwFlag=1時,第二個線程也有可能通過if判斷從而進入if語句內部

    手動實現

    進入臨界區:

    Lab:mov eax,1lock xadd [Flag],eaxcmp eax,0jz endLabdec [Flag]//線程等待Sleep.. endLab:ret

    離開臨界區

    lock dec [Flag]

    自旋鎖

    小提示:單核和多核雖然使用的是同一份內核文件,但里面的代碼是有區別的

    單核 ntoskrnl.exe 反匯編

    多核 ntoskrnl.exe 反匯編

    分析 KeAcquireSpinLockAtDpcLevel

    多核

    單核

    總結

  • 自旋鎖只對多核有意義
    (查看不同版本的KeAcquireSpinLockAtDpcLevel函數)
  • 自旋鎖臨界區、事件、互斥體一樣,都是一種同步機制,都可以讓當前線程處于等待狀態,區別在于自旋鎖不用切換線程
  • 總結

    以上是生活随笔為你收集整理的Windows事件等待学习笔记(一)—— 临界区自旋锁的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。