スピンロック

読み:スピンロック
外語:spin lock 英語
品詞:名詞

マルチスレッドなどの環境の排他制御において、ロックを獲得するまでスピン(ビジーループ)で待つ方法。

目次

共有メモリー型のマルチプロセッサー環境に適した手法である。

ロックが獲得できるまで単純にループで待ち続け、定期的にロックの獲得試行と確認を実施する。

その間、スレッド(またはタスク)は待機状態となり有益な処理が実行できない。ロックが獲得できないとCPUを無益に占有し続けることになり、ビジーウェイト状態となる。

競合が多数発生するような場合はミューテックスと比較するとCPUパワーを無駄に消費することになり非効率となるが、処理は簡潔で済み、ロックが短期間で済む場合はミューテックスより高速である。

ミューテックスの場合、システムがリスト管理をして必要な制御をする(ような実装が多い)。スピンロックも実装は様々だが、一般的にはメモリーにロック中かどうかのフラグを用意し、そのフラグを使ってロック制御をする。

従って実装自体はシンプルに済むが、ロックの同時アクセスの可能性を考慮する必要があり、ロック処理に必要な「フラグの読み込み」、「フラグの確認と更新」、「フラグの書き込み」という一連の手順(テスト&セット)全体をアトミックにしなければならない。

さらに、マルチプロセッサーでメモリー内容を同期させるため、メモリーバリアも考慮しなければならない。

x86

x86の場合、データ交換命令xchgはメモリーバリア機能を持っており、複数のCPUコアで実行された場合は相互にバスをロックし、キャッシュを更新する動作を合わせて実行する。

従ってx86/x64アーキテクチャーにおいては、メモリーアクセスの順序保証が必要な場合でも、殆どの場合は明示的なメモリーバリア命令を使わずに済む。

RAM上に確保されたstat_lockをフラグに用い、0か1かで判断する場合の例を以下に示す。

stat_lock:
    dd      0

spin_lock:
    mov     eax, 1
spin_lock_loop:
    xchg    eax, [stat_lock]
    test    eax, eax
    jnz     spin_lock_loop
    ret

spin_unlock:
    xor     eax, eax
    xchg    eax, [stat_lock]
    ret

上のspin_lock処理は、xchg命令でstat_lockの内容をeaxに取得すると同時に、stat_lockに1を代入する。結果のeaxが0なら他に使っている処理はないためそのまま終了するが、0以外なら他が使用中であるので、0になるまでループで処理を繰り返す。

上のspin_unlockはstat_lockに0を代入する処理である。アトミックかどうかだけ考えればxchgではなくmovでも良さそうに見えるが、実は良くない。xchg命令のメモリーバリア機能を使わないと、マルチプロセッサー時に正常に全CPUコアに反映されて見えない現象が生じるからである。

ARM

ARMの場合もx86と基本的に変わらないが、明示的にメモリーバリアーの命令を使用する必要がある。

ARMv7アーキテクチャー以降でも使用可能な手法は次のとおりである。

spin_lock/spin_unlock共に、予めr1にロックフラグに使用するメモリーのアドレスが格納されているものとする。

spin_lock:
    mov     r0, #1
spin_lock_loop:
    ldrex   r2, [r1]
    cmp     r2, #0
    wfene
    strexeq r2, r0, [r1]
    cmpeq   r2, #0
    bne     spin_lock_loop
    dmb
    bx      lr

spin_unlock:
    mov     r0, #0
    dmb
    str     r0, [r1]
    dsb
    sev
    bx      lr

なお、「bx lr」は「mov pc, lr」でもよい。どちらもサブルーチンから戻るための命令である。

関連する用語
待機
ビジーウェイト
APIC

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club