我有两个进程 P1(发送者)和 P2(接收者)。 P1用于unix-domain-socket (UDS)
向P2发送数据。如果 P1 以 100 条消息/秒的速率发送数据并且 P2 能够接收 50 条消息/秒,将会发生什么情况。两者都是非阻塞套接字。
上述场景中发生了什么?一段时间后p1或p2会面临内存耗尽吗?
团队,请解释一下在上述场景中会发生什么。
谢谢。
答案1
如果接收方的读取速度不如发送方的发送速度,那么套接字缓冲区会在一段时间后填满。
当假设数据报套接字类型时,如果缓冲区已满,阻塞套接字将阻塞,从而隐式减慢发送者的速度。对于非阻塞套接字,消息的发送只会失败,并且EAGAIN
将作为错误返回send
。请注意,这仅适用于数据报类型的 unix 域套接字。使用 UDP 套接字,发送将成功,但消息只会丢失。
对于流套接字,无论套接字是阻塞还是非阻塞,都可能会写入部分消息。发送方需要检查实际写入了多少字节(返回send
)并确保稍后发送剩余的数据。对于非阻塞套接字,send
也可能完全失败EAGAIN
,而对于阻塞套接字,它会阻塞并等待接收器读取一些数据,以便在套接字缓冲区中再次拥有空间。