0

単一のスケジューラーが「メイン」コアで使用され、I / Oの可用性(tcp / ip、udpなど)を読み取り、コアごとに単一のスレッドを持つ、Linuxのfedoraでマルチスレッドの単一プロセスモデルを実装するにはどうすればよいですか? (initで開始)、「実行スレッド」は、データを解析してから、共有メモリスペースに少量の情報更新を更新します(pthreadが単一のプロセスでデータを共有することを理解しています)。

私の選択肢は次のとおりです。

PthreadまたはLinuxOSスケジューラ

私は、これらの実行スレッドの特定の数を単一のスケジューラースレッドで開始することからなる素朴なモデルを念頭に置いています。

この種のモデルを使用できることがわかっているときに考えられる最善の解決策は何ですか。

4

4 に答える 4

1

Linuxスケジューラーの変更は非常に大変な作業です。私はそれを忘れるでしょう。通常、Pthreadが優先されます。私がよく理解している場合は、制御計画専用の1つのコアと、データ計画処理専用のその他のコアのプールが必要ですか?次に、マスタースレッドからスレッドのプールを作成し、を使用してこれらのスレーブスレッドのコアアフィニティを設定しますpthread_setaffinity_np(...)

実際、プロセスのスレッドは同じアドレス空間を共有し、グローバル変数はそのプロセスのどのスレッドからもアクセスできます。

于 2012-06-08T10:31:43.707 に答える
1

Benoitの答えを完成させると、マスタースレッドとワーカースレッドの間で通信するために、条件変数を使用できます。労働者は次のようなことをします:

while (true)
{
    pthread_mutex_lock(workQueueMutex);
    while (workQueue.empty())
        pthread_cond_wait(workQueueCond, workQueueMutex);
    /* if we get were then (a) we have work (b) we hold workQueueMutex */
    work = pop(workQueue);
    pthread_mutex_unlock(workQueueMutex);
    /* do work */
}

とマスター:

/* I/O received */
pthread_mutex_lock(workQueueMutex);
push(workQueue, work);
pthread_cond_signal(workQueueCond);
pthread_mutex_unlock(workQueueMutex);

これにより、アイドル状態の作業が1つウェイクアップされ、リクエストがすぐに処理されます。使用可能なワーカーがない場合、作業はキューから取り出され、後で処理されます。

于 2012-06-08T10:43:42.200 に答える
0

単一の消費者が生産者の結果を集約するという、生産者/消費者問題のバージョンがあるように思われますn。これはかなり標準的な問題なので、間違いなくpthreadそれで十分だと思います。スケジューラーをいじくり回す必要はありません。

答えの状態の1つとして、ここで説明するようなスレッドセーフキューは、この種の問題に対してうまく機能します。たくさんのスレッドをスポーンするというあなたの最初のアイデアは良いアイデアです。スレッドがグローバル状態を共有できると問題が発生するのではないかと心配しているようです。共有状態を最小限に抑え、適切なロックの規律を使用すれば、これは問題ではないと思います。責任を持って共有する限り、状態の共有は問題ありません。

最後に、自分が何をしているのかを本当に理解していない限り、手動でスレッドアフィニティをいじらないようにすることをお勧めします。スレッドを生成し、スケジューラーにスレッドが実行されるタイミングとコアを処理させるだけです。最適化するのは、使用するスレッドの数です。他のスレッドが実行されている場合、コアごとに1つが実際には最速のアプローチではない可能性があります。

于 2012-06-08T11:17:11.033 に答える
0

一般的に言えば、これは多かれ少なかれ、posixselectおよびlinux固有のepoll関数の目的です。

于 2012-06-08T11:37:22.970 に答える