ソケットプログラミングでは、C
またはjava
のコードを記述しているかどうかにかかわらず、ソケット:read()メッセージが受信されたときにプログラムがブロックされないとどうなるか
while(1) {
read(...);
/* process received msg */
process(received_msg)
}
さて、クライアントがmsg1
を受信し、それを処理して忙しいです:
クライアントは次のようにコードを持っています。これは、プロセッサがprocess()
の内部で命令を実行していることを意味します。この時点で、msg2
が到着します。しかし、それを受け取ることを今ブロックしているのはread()
ではありません。着信メッセージmsg2
はどうなりますか?
プロトコルに依存しますか?それは言語APIに依存しますか?
私はこの問題を克服することができるメッセージを受け取るたびに新しいスレッドを作ると思います。私の質問は、単一スレッドのコンテキストで何が起こるのかを理解することと、複数のスレッドを使用せずにこの作業を行う方法があれば理解することを目的としています。
カーネルは受信したデータをバッファして、次の読み込み時に利用できるようにします。カーネルは、もはやバッファリングできなくても何が起きるか(プロトコルに依存する)を管理します。 – kaylum
あなたのメッセージがソケットのバッファに収まる場合、そこにメッセージがあります。バッファがいっぱいになると、あなたのTCPスタック - (ソケットがストリーミングするので、TCP) - 送信者にそれらのパケットを保持するように通知します。 SO [他の側よりも速くブロッキングソケットにデータを書き込むとどうなりますか?](http://stackoverflow.com/questions/14241235/what-happens-when-i-write-data-to -a-blocking-socket-other-sideよりも速い)。 –
"複数のスレッドを使用せずにこの作業を行う方法があれば" - シングルスレッドの同期処理*アプローチでは、プロセッサが送信者よりも遅く、TCPを使用している場合は、送信者も遅くなることで終了します。マルチスレッドが利用できない場合、UNIX-esは各要求に対して別のプロセスをfork/spawnするのに使用されました。 –