
Tengo dos procesos P1 (remitente) y P2 (receptor). P1 utiliza unix-domain-socket (UDS)
para enviar datos a P2. ¿Qué pasará si P1 envía datos a una velocidad de 100 mensajes/segundo y P2 es capaz de recibir 50 mensajes/segundo? Ambos son enchufes sin bloqueo.
¿Qué está sucediendo en el escenario anterior? ¿Se agotará la memoria de p1 o p2 después de un tiempo?
equipo, por favor explique qué sucederá bajo el capó en el escenario anterior.
gracias.
Respuesta1
Si el receptor no lee tan rápido como envía el remitente, los buffers de los sockets se llenan después de un tiempo.
Cuando se supone un tipo de socket de datagrama, un socket de bloqueo se bloquearía si los buffers están llenos y, por lo tanto, implícitamente ralentizarían al remitente. Con un socket sin bloqueo, el envío de un mensaje simplemente fallaría EAGAIN
y send
. Tenga en cuenta que esto es cierto sólo para sockets de dominio Unix de tipo datagrama. Con sockets UDP el envío se realizará correctamente y los mensajes simplemente se perderán.
Con un socket de flujo se puede escribir un mensaje parcial, sin importar si el socket es bloqueante o no bloqueante. El remitente debe verificar cuántos bytes se escriben realmente (devolución de send
) y asegurarse de enviar los datos restantes más tarde. Con un socket sin bloqueo, send
también podría fallar completamente EAGAIN
, con un socket con bloqueo, en cambio, se bloquearía y esperaría a que el receptor lea algunos datos para tener espacio nuevamente en el búfer del socket.