実験メモpart2
多対多接続の設計と実装
必要なもの
サーバプログラム,クライアント側のプログラムが必要
サーバプログラム:EchoBackプログラム(クライアントプログラムから送信されたメッセージを受信すると受信メッセージに追加メッセージを付与して返信する動作)
クライアントプログラム:サーバに負荷をかけるプログラム
サーバプログラムの現状
単一のクライアントからの接続に対して応答可能.しかし複数のクライアントからの接続があると最初に接続したクライアントとの通信が終わるまでほかのクライアントからの接続を受けることができない.
改良点
複数のクライアントからの接続に対して同時に応答できるように拡張
以下の複数クライアントからの応答が可能なプログラムをつくる.
select関数によって多重化したEchoBackサーバ
マルチプロセスによって多重化したEchoBackサーバ
マルチスレッドによって多重化したEchoBackサーバ
非同期I/Oによって多重化したEchoBackサーバ
クライアントプログラムの現状
サーバプログラムに負荷をかけれていない
シングルスレッドでメッセージを送受信を繰り返した場合単位時間あたりの通信は1メッセージとなりサーバにあまり負荷がかからない
改良点
並列処理でサーバに同時接続を行うプログラムを作りサーバに負荷をかける.
これらのプログラムを作り以下のことについて調べる.
最も実行速度が速い方法はどれか?
最も通信待ち時間が少ない方法はどれか?
最も通信失敗が少ない方法はどれか?
最も少ないリソースで実行できる方法はどれか?
以下からそれぞれのプログラムについて説明する
サーバプログラム
1select関数による同期I/Oの多重化えを利用したサーバープログラムの多重化(Np2回目ソースコード)
select関数
OSのシステムコールを活用することで複数のソケットを監視し任意のソケットが読み込み可能な状態となった時点でその情報を返す.その後,読み込み可能になったソケットのみを対象としてブロッキングI/O関数を利用した受信待ちを行ったとしても実質待ち時間なしでデータを受信することができる.
(ソケットとはコンピュータネットワークの接続の末端でネットワークプログラミングに必要となるライブラリのAPI)
1select関数に引数として与える監視するソケット情報を生成
サーバソケット
クライアント管理配列に登録されたソケット
2select関数を実行してソケットを監視
3-1読み込み可能となったソケットが新規のクライアントからの接続の場合accept関数で新規のクライアントからの接続を受け入れ当該クライアントとの通信用のソケットを生成する.生成したソケットをクライアント管理配列に登録
3-2読み込み可能となったソケットが既存のクライアントからのEchoBack要求ならばEchoBack通信を行う.
2マルチスレッドを用いたサーバプログラムの多重化(Np3回目のソースコード)
3マルチプロセスを用いてサーバプログラムを多重化(Np4回目のソースコード)
クライアントプログラム
サーバに対して1接続につきM回のEchoBack通信を実施する
M回のEchoBack通信をN並列で実行する
$tcpbenchmark 192.168.1.101 1000 1 30 100
第一引数:接続先IPアドレス
第二引数:接続先ポート番号
第三引数:試行数
第四引数:スレッド数(N)
第五引数:EchoBack回数(M)