Kernel 同一处理器上的两个自旋锁?

Kernel 同一处理器上的两个自旋锁?,kernel,driver,multiprocessing,wdm,wdf,Kernel,Driver,Multiprocessing,Wdm,Wdf,两个CPU能否同时持有两个“不同”的自旋锁 那么…这是否意味着:单处理器CPU不能同时容纳两个“不同”的自旋锁 那么…这是否意味着:单个CPU上的自旋锁数不能大于1 PS:“different”表示与不同内存资源关联的自旋锁 有人知道自旋锁在内部是如何工作的吗。。。我的意思是,在测试集运行期间,他们会冻结总线吗?我用谷歌搜索过,但没有绝对的答案。旋转锁或多或少只是一个共享int,写入是同步的。处理器没有特殊标志。因此,您可以获得多个旋转锁。(你不应该…) 为了防止单处理器系统锁定,window

两个CPU能否同时持有两个“不同”的自旋锁

  • 那么…这是否意味着:单处理器CPU不能同时容纳两个“不同”的自旋锁

  • 那么…这是否意味着:单个CPU上的自旋锁数不能大于1

  • PS:“different”表示与不同内存资源关联的自旋锁



    有人知道自旋锁在内部是如何工作的吗。。。我的意思是,在测试集运行期间,他们会冻结总线吗?我用谷歌搜索过,但没有绝对的答案。

    旋转锁或多或少只是一个共享int,写入是同步的。处理器没有特殊标志。因此,您可以获得多个旋转锁。(你不应该…)


    为了防止单处理器系统锁定,windows将IRQL提升到
    DISPATCH\u级别
    。处理器只能有一个“线程”在调度级别运行,因此在这些系统上同时锁定多个自旋锁是安全的

    实现应该是这样的:(不是100%正确,并且可能因细节而出现分歧)



    InterlockedExchange
    保证同一内存总线上的所有处理器以原子方式进行交换。因此,它必须锁定内存总线,或者至少强制特定缓存线的唯一所有权。

    “处理器只能有一个“线程”在调度级别运行,因此在这些系统上同时锁定多个自旋锁是安全的。”这就是信息。丢失的谢谢,这消除了我对单处理器自旋锁的疑虑。
    LONG lock = 0;
    
    KeAcquireSpinlock( ... )
    {
        // raise irql. etc.
        while( InterlockedExchange( &lock, 1 ) != 0 ) 
            /* do nothing*/;
    }
    
    KeReleaseSpinLock( ... )
    {
         InterlockedExchange( &lock, 0 );
         // lower irql ... etc.
    }