リクエストが来るまで、このディスパッチスレッドはどういう状態
クライアントからの接続要求(あるいはパケットの到来)をずっと待っている状態(スレッドがブロックされた状態)です。
「ずっと待つ」ためにはOSや言語ライブラリーにそういう機能があるのでそれを用います。例えばUnix系OSであればlistenシステムコールがそれにあたります。これは入出力用のシステムコールの一つですが、他の同期的な入出力機能と同様、興味のある状態変化(クライアントからの接続要求)が発生するまでは呼び出し元スレッドをブロックします。
サーバー計算機上にあるサーバーの実体は単なる一つのプログラムであり、それは例えば次のような雰囲気の無限ループでできています。つまり「もういいから止まりなさい」と言われるまでずっと同じことをやり続けています。
while (true) {
// 新たな接続が到来するまで待つ
listen(...);
// その接続用の通信用リソース(ソケットを示すファイル記述子だったりする)を確保する
client_socket = accept(...);
// 接続を受け付けたクライアントに対するスレッドを決め(生成したり既存のものを割り当てたり)
client_thread = create_or_select_client_thread();
// そこへclient_socketに対する仕事を「やっといてね」と移譲する。
dispatch_request(client_thread, client_socket);
// 自分自身は次の接続待ちに入る
}
(上のコードに出てきている関数名などは便宜上のものであり、現実に存在する特定のOS/言語/ライブラリーでそのまま動作するような実例ではありません)
なぜスレッドが終了しないか
先に述べた例にあるように、繰り返し同じことをずっとやり続けているからです。
この質問が出るということは「スレッドのブロック」のイメージが曖昧なのかな・・・という気もしました。もしそうなら別途「スレッドのブロックとは何か?」を質問してみてもよいかも知れません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/08 14:57
2018/02/08 16:25 編集
2018/02/09 01:24
2018/02/09 01:58
2018/02/09 02:32