質問

仕事のために、クライアントソフトウェアに応答するためにtcpデーモンを作成する必要があり、これを実行するための最善の方法に関するヒントはないかと考えていました。

通常、スレッドを使用するように、新しい接続ごとに分岐する必要がありますか?

役に立ちましたか?

解決

アプリケーションによって異なります。スレッドとフォークの両方は、完全に有効なアプローチであり、シングルスレッドのイベント駆動モデルの3番目のオプションでもあります。あなたが書いているものについて正確にもう少し説明できれば、アドバイスをするときに役立ちます。

価値があるものについて、いくつかの一般的なガイドラインを次に示します。

  • 共有状態がない場合は、フォークを使用します。
  • 共有状態がある場合は、スレッドまたはイベント駆動型システムを使用します。
  • 非常に多数の接続の下で高いパフォーマンスが必要な場合は、オーバーヘッドが大きいためフォークを避けてください(特にメモリ使用量)。代わりに、スレッド、イベントループ、または複数のイベントループスレッド(通常はCPUごとに1つ)を使用します。

一般にフォークは実装が最も簡単です。フォークすると、基本的に他のすべての接続を無視できます。追加の同期要件により、次に難しいスレッド。処理をステートマシンに変える必要があるため、イベントループはより困難です。イベントループを実行する複数のスレッドは、それらのすべての中で最も困難です(他の要因を組み合わせるため)。

他のヒント

いつでもスレッドを介した接続をフォークすることをお勧めします。スレッドの問題は、共有メモリ空間であり、別のスレッドのメモリを操作するのがいかに簡単かということです。分岐したプロセスでは、プロセス間の通信はすべて意図的に行う必要があります。

このSOの答えを検索して見つけただけです:目的は何ですかフォーク?。あなたは明らかにその答えを知っていますが、そのスレッドの#1の答えはfork()の利点について良い点を持っています。

@hobodaveの良い答えとは別に、「接続ごとの分岐」のもう1つの利点 inetd tcpserver などを使用して、サーバーを非常に簡単に実装できるということです。その後、ソケットとの通信に標準入力と標準出力を使用できます。リスニングソケット管理(接続のリスニングなど)などを行う必要はありません。

別のオプションは、もちろん、デーモンのいくつかのコピーを事前にフォークし、それぞれのコピーを存続させてリクエストに応答し続けることです。特に、アプリケーション、予想される負荷、パフォーマンス要件などに依存します。

最も簡単で簡単な方法は、inetdベースのデーモンを作成することです。ソフトウェアはTCP接続で実行されているという事実を無視し、単純にstdin / stdoutを介して入出力を処理できます。これは、ほとんどの場合にうまく機能します。

1秒間に多くの新しい接続で攻撃される予定がない場合は、inetdから実行することを検討してください。それ以外の場合...

OpenSSHソースをダウンロードします。彼らは多くの作業を権限分離に適切に取り入れており、移植性があり、セキュリティについては他の何よりも精査されています。

あなたのニーズに合わせて調整してください。おそらくそのほとんどを捨てることができます。もちろんライセンス契約を順守してください。優れたSCCで今後のパッチをフォローしてください。

プロセスとスレッドの分岐のパフォーマンスについては、それが本当の問題であるという十分な証拠が得られるまで心配しないでください。 Apacheは何年もの間、単純なクライアントごとのプロセスモデルで最も忙しいサイトを運営していました。

本当に意欲的な人は、何らかの非ブロッキング非同期IOモデルを使用できます。 Boost.Asioは好きですが、C ++が大好きです。

コードが信号を正しく処理することを確認してください。設定をリロードするHUP。 TERMで正常にシャットダウンします。

独自のログファイルを書き込もうとしないでください。 syslogのみを使用するか、syslogにリダイレクトできるstderrに書き込みます。すべてがわずかに異なるログを記録するホームロールサーバーでlogrotateをセットアップしようとするのは本当に苦痛です。

スレッド化/フォークをすべて回避したい場合は、すべての非ブロッキングI / Oを libevent 。 Libeventは、イベント駆動型プログラミングの高性能ソリューションとしてかなりよく知られています。

ACE(C ++ / Java)をご覧ください。通信要件に対応するスレッド、イベント、分岐TCPリアクターが多数あります。また、何かを行う Boost ASIO を調べることもできます。類似

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top