3

Mac OS X ネットワーク カーネル拡張機能の特定の部分を可能な限り高速かつ効率的に設計する方法 (C 言語) に関するアドバイスや指針を探しています。

説明: 2 セットの TAILQ リストがあります。1 つはタイプ A 構造用、もう 1 つはタイプ B 構造用です。ほとんどの場合、私はそれらを別々に扱うので、それぞれに lock_mtx を持っています。場合によっては、A、B、そして両方を同時に変更する必要があります。次のようになります。

Function1:
{
Modify List or Struct A
Modify List or Struct B
Modify List or Struct A & B
Modify List or Struct B
Modify List or Struct A
}

Function2:
{
Modify List or Struct B
Modify List or Struct A & B
Modify List or Struct A
Modify List or Struct A & B
}

私はロックの使い方に慣れていません。1. 単一のロックを使用して両方のリストを保護します。B のみを変更する関数が実行されている間に、A のみを変更する関数が実行されるのを防ぐため、これは無駄です (逆も同様です)。

  1. 両方のロックを連続して取得し、解放します。それは私に与えるでしょう:

.

   Function1:
    {
    lock A
    Modify List or Struct A
    unlock A

    lock B
    Modify List or Struct B
    unlock B

    lock A
    lock B
    Modify List or Struct A & B
    unlock B
    unlock A

    lock B
    Modify List or Struct B
    unlock B

    lock A
    Modify List or Struct A
    unlock A
    }

これらすべてのロックを取得すると、これは非常に高価になるでしょう。A と B の相互変更を保護するより良い方法はありますか?

アドバイスありがとうございます。

4

1 に答える 1

1

当初、私は上記の質問のコンテキストで設計に関するアドバイスを探していました。

さて、カーネル レベルのミューテックスを使用するという考え方が正しいように思われますが、明確な答えはありません。関数の正確な構造と、ロックされたコンテキストで実行する必要のない副業に費やされる時間に大きく依存します。

そのような状況では、dario_ramos と pmjordan によって示唆された最良の答えは、実行可能なオプションをプロファイリングして選択することです。

ご協力ありがとうございました。

于 2012-09-26T10:30:44.333 に答える