このドキュメントで説明するソフトウェアは、Extended SupportまたはSustaining Supportのいずれかにあります。 詳細は、https://www.oracle.com/us/support/library/enterprise-linux-support-policies-069172.pdfを参照してください。
Oracleでは、このドキュメントに記載されているソフトウェアをできるだけ早くアップグレードすることをお薦めします。

機械翻訳について

6.3 共有リソースへのアクセスの処理について

共有されたカーネル・データ構造体では複数の実行スレッドを同時に処理できます。 そのため、このようなアクセスは必ずシリアル化されている必要があります。 スピンロックとミューテックスを使用すると、クリティカル・セクション(共有リソースが含まれているコード領域)へのアクセスを制御できます。

  • スピンロックでは、一度に1つのスレッドのみがクリティカル・セクションにアクセスできます。 クリティカル・セクションにアクセスしようとしている別のスレッドは、アクセスを保持しているスレッドが終了するまでスピンし続けます。 spin_lock()関数を使用すると、コードがハードウェア割込みまたはソフトウェア割込みコンテキスト内で実行されない場合に、スピンロックを獲得できます。

    #include <linux/spinlock.h>
    
    spinlock_t spinlock = SPIN_LOCK_UNLOCKED;
    
    spin_lock(&spinlock);
        /* Critical section */
    spin_unlock(&spinlock);

    コードがハードウェア割込みまたはソフトウェア割込みコンテキスト内で実行される場合は、割込みを無効にするスピンロック関数(spin_lock_irq()spin_lock_irqsave()など)を使用します。 最後に、spin_lock_bh()関数で、ハードウェア割込みは有効にしたまま、ソフトウェア割込みを無効にします。 これらの関数はそれぞれ、対応する名前の付いたロック解除関数とペアになっています。

  • ミューテックスは、クリティカル・セクションにアクセスできるようになるまでスレッドをスリープさせます。

    #include <linux/mutex.h>
    
    static DEFINE_MUTEX(mutex);
    
    mutex_lock(&mutex);
        /* Critical section */
    mutex_unlock(&mutex);

    この例では、静的に定義されたミューテックス使用します。 動的なミューテックスを作成するには、mutex_init()を使用できます。

待機時間が2コンテキスト・スイッチを超えることが予想される場合は、スピンロックよりもミューテックスの使用をお薦めします。 ただし、割込みハンドラ内ではミューテックスによってスレッドがスリープ状態になる可能性があるので、必ずスピンロックを使用する必要があります。 反対に、クリティカル・セクションをスリープさせる必要がある場合は、スピンロックを獲得した後でスレッドのスケジュール、優先使用またはスリープは行えないので、ミューテックスを使用する必要があります。

ノート

ミューテックス・インタフェースはセマフォ・インタフェースの代替機能として導入されました。 セマフォを使用すると、指定数のスレッドが同時にクリティカル・セクションへアクセスできますが、この機能はほとんど使用されません。

スレッドがクリティカル領域に対して読取りまたは書込みのいずれかの操作しか実行できない場合は、read_lock()関数とwrite_lock()関数を使用して、リーダー/ライターのスピンロックを実装することもできます。 ライター・スピンロックでは、他のすべての書込み/読取りスレッドへのアクセスをブロックします。 リーダー・スピンロックでは、他の書込みスレッドへのアクセスはブロックしますが、他の読取りスレッドからのアクセスは許可します。

スピンロックとミューテックスの代替機能として、32ビットおよび64ビットの基本整数型(atomic_tatomic64_t)を使用したり、カウンタのインクリメントやビット・マスク設定などの操作を実行したりできます。

最後に、リーダー・スレッドで常に使用されているデータ構造体が、単一のライター・スレッドで保持される場合は、ロックレス循環バッファ(<linux/kfifo.h>に定義されているkfifo構造体など)を使用できます。 ネットワーク・ドライバは通常、このようなバッファを使用してアダプタとデータ交換を行います。