2つのプロセスP1(送信者)とP2(受信者)があります。 P1はunix-domain-socket (UDS)
P2にデータを送信するために使用されます。 P1が毎秒100のメッセージレートでデータを送信し、P2が毎秒50のメッセージを受信できる場合はどうなりますか?どちらも非ブロックソケットです。
上記のシナリオでは何が起こりましたか?時間が経つと、p1またはp2がメモリ枯渇に直面しますか?
チーム、上記のシナリオで何が起こるか説明してください。
ありがとうございます。
答え1
受信者が発信者が送信できる速度と同じくらい速く読み取れない場合、ソケットバッファはしばらくして埋められます。
データグラムソケットタイプを想定すると、バッファがいっぱいになるとブロックソケットがブロックされ、暗黙的に発信者の速度が遅くなります。非ブロックソケットの場合、メッセージの送信は失敗し、EAGAIN
エラーとして返されますsend
。これは、データグラムタイプのUnixドメインソケットでのみ機能します。 UDPソケットを使用すると、送信は成功しますが、メッセージは失われます。
ストリームソケットの場合、ソケットがブロックか非ブロックかを問わず、部分的なメッセージが記録されることがあります。送信者は実際にどれだけのバイトが書き込まれたかを確認し、send
後で残りのデータを転送する必要があります。ブロックされていないソケットの場合はsend
完全に失敗する可能性がありますがEAGAIN
、ブロックソケットの場合はブロックし、受信者がソケットバッファにスペースを取り戻すためにデータを読み取るのを待ちます。