2016-06-24 5 views
1

この質問があいまいで終わっているかあまりにも漠然と思われる場合は謝罪します。私は最高のC/Cppプログラマではありません問題)。サーバプロセスがクライアントの入力/メッセージを待つ最良の方法は何ですか

クライアントとサーバーの2つのプロセスが実行されているとします(プロデューサとコンシューマとして表示される可能性がありますが、ここではクライアントとサーバーが良いかもしれないと思います)。サーバーは、クライアントのオフライン処理として作成されたような、クライアントの「子」(ソート、以下を参照)プロセスです。時間が経つとクライアントはいくつかのジョブを生成し、作成したサーバーにオフロードします。ジョブによっては、サーバーはジョブの完了に関する情報をクライアントに送り返すこともあれば送り返すこともできません。さて、これはスレッドで行うことができるかもしれないと示唆しているかもしれません。私が入り込まない理由で、スレッドはここでは動作しません。クライアントとサーバはメモリを共有してはいけません(共有メモリがあるかもしれないし、そうでないかもしれません。クライアントとサーバは2つの異なるマシンです:私が書いているコードは両方の可能性をサポートするべきです)。

サーバーの初期化期間は非常に長く、したがって常に実行されている必要があります。したがって、2番目のプロセスはサーバーになるという考え方です。したがって、常にクライアントからのメッセージをリスンする必要があります。単純な疑似コード/ Cの例を以下に示します。

int main() { 
    ... 
    client_pid = getpid(); 
    pid = fork(); 
    if(pid > 0) { 
     /* sets up connection with client, based on what connection type has been 
     * given (shared memory, sockets, etc). I don't know anything 
     * about what type of connection is established only that all 
     * communication is handled by the wait_For_Jobs and generate_Jobs functions 
     */ 
     start_Server(client_pid, connection_type); 
     wait_For_Jobs(); 
    } else { 
     // gets information needed to send messages to server 
     contact_info = wait_for_connection(); 
     generate_Jobs(contact_info); 
    } 
} 

これは私が欲しいものの非常に非常に概略です。私が持っている質問は、 "wait_For_Jobs"関数に関連しています。残念ながら、connection_typeは実行時まで認識されないため、この質問には、使用される通信方式のタイプ(共有メモリ、ソケットなど)によっていくつかの異なる回答があります。簡単にするために、共有メモリが使用されている通信タイプ(ブースト・インタープロセス)であると仮定します。これを念頭に置いて、サーバーがクライアントからの入力を待つ最も効率的な方法は何ですか?可能なアプローチの1つは、以下のやり方でwhileループをいくらか使用することです。

void wait_For_Jobs() { 
    while(true) { 
     if(check_If_Message_Received_Over_Shared_Memory){ 
      // handle message 
     } 
    } 
} 

しかし、これは非常に非効率的だと思われます。プロセスは常に「ホイールを回転させる」。修正プログラムのほんの一部は、whileループの終わりに一定期間プロセスを "スリープ"させることです。これはwhileループでコードを実行するだけでは実際にはあまり違いはありません(実際は同じことです)。応答時間を犠牲にしてリソースの使用率を低下させるだけです。理想的には、プロセスはちょうどスタンバイモードになり、メッセージを受信するとコンピューティングを開始する必要があります。しかし、私はあなたがCやCppでこのようなことをどうやってやるか分からない。それを念頭に置いて、より良い選択肢がありますか?

+0

* "可能なクライアントとサーバーは2つの異なるマシンです" * - むしろ共有メモリを排除すると、私はソケットに関して考えています。 – Galik

+0

実行時に何が実行されるかを決定するifステートメントです。これにより、ユーザーはローカルで実行するかどうかを判断できます(ハードウェアユーザーが利用できる場合)。この質問の要点は、質問で前述したようにwhileループを使用しないことで研究の使用率(CPU使用率)を下げることが可能かどうかです。例えば、セマフォが使用されていても、コンパイルされたコードのどこかにwhileループが存在すると思われます。問題は、このループがより効率的かどうかです。アンドロイドのようなシステムでは、OSがプロセスをスリープ状態にして、メッセージを送信したときにスリープ状態にすることができます。 – Ryan

+0

C/CPPで同様のことができる場合(デフォルトでは、私はそれがセマフォよりもはるかに効率的であると思う。実際、セマフォは、私の理解では、主にリソースの管理と割り当てに使用されています。利用率を低下させない。 – Ryan

答えて

0

共有メモリを使用する場合、別の要求が表示されたときに発生するセマフォをブロックする必要があります。

ソケットを使用する場合は、ブロッキング受信を使用してください。

+0

はい、継続的にセマフォをチェックする必要はありませんか?つまり、概念的には、これはリソース使用量に関してwhileループを実行するのと同じではないでしょうか?そして、受信をブロックするために同じ。具体的には、セマフォをブロックすると、実際のコードのwhileループは必要ありません(少なくとも私はC/Cppのセマフォに慣れていないと思います)。プロセスがまだブロックされているかどうかを確認するために、コードがコンパイルされたらどこかにwhileループがなければならないと思われます。 – Ryan

+0

私はこの問題を尋ねる別の方法は、セマフォまたはブロッキング? – Ryan

+0

いいえ、セマフォとブロッキングはカーネル内のブロック*を読み込み、イベントによって呼び起こされます。スピンループはありません。最後の質問は「パフォーマンスの向上」とは何ですか?CPU使用率に関しては – EJP

関連する問題