2
  1. 2つのCPUが同時に2つの「異なる」スピンロックを保持できますか?

  2. つまり...これは、単一(ユニプロセッサ)CPUが2つの「異なる」スピンロックを同時に保持できないことを意味しますか?

  3. つまり...これは、単一のCPU上のスピンロックの数を1より大きくすることはできないという意味ですか。

PS:「異なる」とは、異なるメモリリソースに関連付けられたスピンロックを意味します。


スピンロックが内部でどのように機能するか知っている人はいますか?...つまり、テストセットの操作中にバスをフリーズしますか?私はグーグルで検索しましたが、絶対的な答えはありません。

4

1 に答える 1

2

スピンロックは、多かれ少なかれ、書き込みが同期される共有intにすぎません。プロセッサに特別なフラグはありません。したがって、複数のスピンロックを取得できます。(すべきではありません...)

ユニプロセッサシステムがロックアップするのを防ぐために、windowsはIRQLをに上げDISPATCH_LEVELます。プロセッサはで実行できる「スレッド」を1つだけにすることができるDISPATCH_LEVELため、これらのシステムでは複数のスピンロックを同時にロックしても安全です。

実装は次のようになります:(100%真実ではなく、詳細のために発散する可能性があります)

LONG lock = 0;

KeAcquireSpinlock( ... )
{
    // raise irql. etc.
    while( InterlockedExchange( &lock, 1 ) != 0 ) 
        /* do nothing*/;
}

KeReleaseSpinLock( ... )
{
     InterlockedExchange( &lock, 0 );
     // lower irql ... etc.
}

InterlockedExchange同じメモリバス上のすべてのプロセッサに対してアトミックに交換が行われることを保証します。したがって、メモリバスをロックするか、少なくとも特定のキャッシュラインの唯一の所有権を強制する必要があります。

于 2010-08-05T12:18:02.970 に答える