Linux/Unixサーバソケットプログラミング非同期I/Oモード選択


最近、サーバーがUnixを使用するソケットプログラミングの応用をしました.
ソケット非同期の選択には、一般的に2つのモードがあります.1つは、新しく来た接続ごとにスレッド(pthread)を作成し、スレッドプールを使用して管理することができます.
もう1つは、単一プロセスでの非同期I/Oを用いて、関数select()によって実現する.
select()関数は、監視する必要があるファイル記述子の変化(読み書きまたは異常)を監視する非ブロック方式で動作するプログラムを完了します.
ここでの非ブロックとは、プロセスまたはスレッドがこの関数を実行する際にイベントの発生を待つ必要がなく、いったん肯定的な戻りを実行すると、戻り値の違いで関数の実行状況を反映することを意味します.
イベントが発生した場合、ブロック方式と同じです.イベントが発生していない場合は、イベントが発生していないことを通知するコードを返し、プロセスまたはスレッドが実行を続行します.
この2つの効率が高いと曖昧になります
次に、IBMの非同期サーバに関する観点を示します.
非同期サーバ
非同期または非ブロックsocketと呼ばれる別の技術は、スレッド化または分岐法よりも効率的である可能性がある.非同期プログラミングの背後にある概念は、実行を単一のスレッド内に維持することですが、開いているsocketごとにポーリングして、読み込みまたは書き出しを待つより多くのデータがあるかどうかを確認します.しかしながら、非ブロッキングsocketは、実際にはI/O制約を受けるプロセスにのみ有用である.sleep()を用いて作成したCPU制約サーバシミュレーションは,この要点をある程度見逃している.さらに、非ブロッキングsocketは、UDP接続よりもTCP接続に対してより意味があり、前者は依然として未決データを有する可能性のあるオープン接続を維持するためである.
要約すると、非同期ピア(クライアントまたはサーバ)の構造はポーリング・ループです.通常、関数select()またはPythonのasyncoreなどの高度なパッケージを使用します.ループを通過するたびに、開いているすべてのsocketをチェックして、現在読み取り可能なものと書き込み可能なものを特定します.これはチェックが速く、簡単に無視できます.現在、I/O操作の準備ができているsocketはありません.このsocketプログラミングスタイルは、スレッドまたはプロセスに関連するオーバーヘッドを回避します.
これで両者の選択についても明らかになった.