두 개의 프로세스 P1(발신자)과 P2(수신자)가 있습니다. P1은 unix-domain-socket (UDS)
P2에 데이터를 보내는 데 사용됩니다 . P1이 초당 100개의 메시지 속도로 데이터를 보내고 P2가 초당 50개의 메시지를 수신할 수 있다면 어떻게 될까요? 둘 다 비차단 소켓입니다.
위 시나리오에서는 무슨 일이 일어났나요? 시간이 지나면 p1 또는 p2가 메모리 고갈에 직면하게 됩니까?
팀, 위의 시나리오에서 어떤 일이 일어날지 설명해 주세요.
감사해요.
답변1
수신자가 발신자가 보낼 수 있는 속도만큼 빠르게 읽을 수 없으면 소켓 버퍼는 잠시 후에 채워집니다.
데이터그램 소켓 유형을 가정할 때 버퍼가 가득 차면 차단 소켓이 차단되어 암묵적으로 발신자의 속도가 느려집니다. 비차단 소켓의 경우 메시지 전송이 실패하고 EAGAIN
오류로 반환됩니다 send
. 이는 데이터그램 유형의 Unix 도메인 소켓에서만 작동합니다. UDP 소켓을 사용하면 전송은 성공하지만 메시지는 손실됩니다.
스트림 소켓의 경우 소켓이 차단인지 비차단인지에 관계없이 부분 메시지가 기록될 수 있습니다. 송신자는 실제로 얼마나 많은 바이트가 기록되었는지(return) 확인 send
하고 나중에 나머지 데이터를 전송해야 합니다. 비차단 소켓의 경우 send
완전히 실패할 수도 있지만 EAGAIN
, 차단 소켓의 경우 차단하고 수신자가 소켓 버퍼에 공간을 다시 확보하기 위해 일부 데이터를 읽을 때까지 기다립니다.