
Tenho dois processos P1 (remetente) e P2 (receptor). P1 usa unix-domain-socket (UDS)
para enviar dados para P2. o que acontecerá se P1 enviar dados a uma taxa de 100 mensagens/segundo e P2 for capaz de receber 50 mensagens/segundo. Ambos são soquetes sem bloqueio.
O que está acontecendo no cenário acima? p1 ou p2 irão esgotar a memória depois de algum tempo?
equipe, por favor, explique o que acontecerá nos bastidores no cenário acima.
obrigado.
Responder1
Se o receptor não estiver lendo tão rápido quanto o remetente envia, os buffers dos soquetes ficarão cheios depois de um tempo.
Ao assumir um tipo de soquete de datagrama, um soquete de bloqueio bloquearia se os buffers estivessem cheios e, portanto, retardaria implicitamente o remetente. Com um soquete sem bloqueio, o envio de uma mensagem simplesmente falharia e EAGAIN
seria retornado como erro por send
. Observe que isso é verdade apenas para soquetes de domínio unix do tipo datagrama. Com soquetes UDP, o envio será bem-sucedido e as mensagens serão simplesmente perdidas.
Com um soquete de fluxo, uma mensagem parcial pode ser escrita, não importa se o soquete está bloqueando ou não. O remetente precisa verificar quantos bytes foram realmente gravados (retorno de send
) e certificar-se de enviar os dados restantes posteriormente. Com um soquete sem bloqueio, o send
também poderia falhar completamente EAGAIN
; com um soquete com bloqueio, ele bloquearia e esperaria que o receptor lesse alguns dados para ter espaço novamente no buffer do soquete.