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