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