
我有兩個進程 P1(發送者)和 P2(接收者)。 P1用於unix-domain-socket (UDS)
向P2發送資料。如果 P1 以 100 則訊息/秒的速率發送資料且 P2 能夠接收 50 則訊息/秒,將會發生什麼情況。兩者都是非阻塞套接字。
上述場景中發生了什麼事?一段時間後p1或p2會面臨記憶體耗盡嗎?
團隊,請解釋一下在上述場景中會發生什麼。
謝謝。
答案1
如果接收方的讀取速度不如發送方的發送速度,那麼套接字緩衝區會在一段時間後填滿。
當假設資料報套接字類型時,如果緩衝區已滿,阻塞套接字將阻塞,從而隱式減慢發送者的速度。對於非阻塞套接字,訊息的傳送只會失敗,並且EAGAIN
將作為錯誤傳回send
。請注意,這僅適用於資料封包類型的 unix 網域套接字。使用 UDP 套接字,發送將會成功,但訊息只會遺失。
對於流套接字,無論套接字是阻塞還是非阻塞,都可能寫入部分訊息。發送方需要檢查實際寫入了多少位元組(返回send
)並確保稍後發送剩餘的資料。對於非阻塞套接字,send
也可能完全失敗EAGAIN
,而對於阻塞套接字,它會阻塞並等待接收器讀取一些數據,以便在套接字緩衝區中再次擁有空間。