수신기가 소켓을 통한 데이터 속도를 처리할 수 없으면 어떻게 됩니까?

수신기가 소켓을 통한 데이터 속도를 처리할 수 없으면 어떻게 됩니까?

두 개의 프로세스 P1(발신자)과 P2(수신자)가 있습니다. P1은 unix-domain-socket (UDS)P2에 데이터를 보내는 데 사용됩니다 . P1이 초당 100개의 메시지 속도로 데이터를 보내고 P2가 초당 50개의 메시지를 수신할 수 있다면 어떻게 될까요? 둘 다 비차단 소켓입니다.

위 시나리오에서는 무슨 일이 일어났나요? 시간이 지나면 p1 또는 p2가 메모리 고갈에 직면하게 됩니까?

팀, 위의 시나리오에서 어떤 일이 일어날지 설명해 주세요.

감사해요.

답변1

수신자가 발신자가 보낼 수 있는 속도만큼 빠르게 읽을 수 없으면 소켓 버퍼는 잠시 후에 채워집니다.

데이터그램 소켓 유형을 가정할 때 버퍼가 가득 차면 차단 소켓이 차단되어 암묵적으로 발신자의 속도가 느려집니다. 비차단 소켓의 경우 메시지 전송이 실패하고 EAGAIN오류로 반환됩니다 send. 이는 데이터그램 유형의 Unix 도메인 소켓에서만 작동합니다. UDP 소켓을 사용하면 전송은 성공하지만 메시지는 손실됩니다.

스트림 소켓의 경우 소켓이 차단인지 비차단인지에 관계없이 부분 메시지가 기록될 수 있습니다. 송신자는 실제로 얼마나 많은 바이트가 기록되었는지(return) 확인 send하고 나중에 나머지 데이터를 전송해야 합니다. 비차단 소켓의 경우 send완전히 실패할 수도 있지만 EAGAIN, 차단 소켓의 경우 차단하고 수신자가 소켓 버퍼에 공간을 다시 확보하기 위해 일부 데이터를 읽을 때까지 기다립니다.

관련 정보