2

(マルチコア システムで) カーネル モジュール関数を一度に 1 つのコアだけで実行したい場合、何を使用すればよいですか? つまり、2 つのコアが同時に同じ機能を実行しないようにします。つまり、コアの 1 つは、もう 1 つのコアが関数の実行を完了するまで待機する必要があります。

ミューテックス?スピンロック?他の何か?

4

2 に答える 2

3

spinlock() のバリアント、つまり raw_spin_lock_irqsave()、raw_spin_lock_irqrestore() を使用する必要があります ( https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/spinlock. h#n188 )、mutex() はスリープ可能であるため、他の CPU でウェイクアップする可能性があります。また、スピンロックは、コードが他のコアによって実行されないようにします。これは、Documentation/spinlock.txt ( https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/spinlocks.txt )の Linux カーネル ツリーで十分に文書化されています。

于 2013-08-10T17:47:45.630 に答える
3

rakib はすでにスピンロックの使用を提案しているので、その使用方法についてもう少し説明します。

スピンロックを設定した後、例えば

static DEFINE_SPINLOCK(your_lock);

関数の内容を spin_lock_irqsave/spin_lock_irqrestore でラップするだけです。例:

static void function_to_protect()
{
    unsigned int flags;
    spin_lock_irqsave(&your_lock, flags);
    /* function body here */
    spin_lock_ireqrestore(&your_lock, flags);
}

割り込みハンドラーがロックに触れないことが確実にわかっている場合は、軽量関数の spin_lock と spin_unlock を使用して flags 変数を省略することができます。

参照: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/spinlocks.txt

于 2013-08-10T18:48:32.173 に答える