假設您有一個從服務器接收大檔案的行程。
如果您不執行 recv() 呼叫,它會永遠留在以太網控制器的緩沖區中嗎?
如果另一個行程需要接收資料,而另一個行程的緩沖區已滿,是否需要等到另一個行程執行 recv() 或緩沖區超時?
如果您有多個行程發送和接收資料,是否必須等到緩沖區為空。?或者它可以多路復用它并在驅動程式級別或套接字庫的某些部分進行跟蹤?
編輯:拼寫
uj5u.com熱心網友回復:
- 如果不執行 recv() 呼叫,它會永遠留在以太網控制器的緩沖區中嗎?
不,資料永遠不會在以太網控制器的緩沖區中停留很長時間;內核將盡可能快地從以太網控制器的緩沖區中讀取資料并讀入您的套接字緩沖區(在計算機的常規 RAM 中)。如果您的套接字緩沖區已滿,則傳入的資料將被丟棄。
- 如果另一個行程需要接收資料,而另一個行程的緩沖區已滿,是否需要等到另一個行程執行 recv() 或緩沖區超時?
每個套接字在計算機的主 RAM 中都有自己獨立的緩沖區,并且每個行程都有自己的套接字,因此行程不必等待彼此的緩沖區清空。
- 如果您有多個行程發送和接收資料,是否必須等到緩沖區為空。?
請參閱問題 2 的答案,因為它也回答了這個問題。
uj5u.com熱心網友回復:
這是真空型別答案中的完美球形雞。但是您的問題非常廣泛,并且有很多假設取決于 NIC、作業系統和許多其他事情。
但是讓我們假設您使用的是現代成熟的作業系統,帶有現代以太網控制器。
- 不。這一切都由內核和協議的東西處理。內核不能讓網路控制器上的緩沖區在等待您時填滿。否則它將阻止其他行程訪問網路。所以它會緩沖它直到你準備好。對于某些協議,有一種機制可以讓一臺設備告訴另一臺設備不要再發送任何資料。(即 TCP 接收視窗大小,一旦發送方發送了該數量的資料,它將停止,直到接收方以某種方式確認它)
- 它與上面的答案基本相同,作業系統處理細節。從你的角度來看,你的 recv() 不會阻止任何其他行程 recv() 的能力。
- 這更有趣,現代 NIC 是基于佇列的。您有 n 個發送/接收佇列,并且在大多數情況下,可以將過濾器附加到它們。這允許 NIC 執行許多通常必須由作業系統完成的功能(稱為卸載),但回到正題。使用這些 NIC,您可以擁有多個 I/O 而無需多路復用。雖然一般來說,尤其是在消費級 NIC 上,佇列的數量會非常少。通常是 4. 所以會涉及到一些多路復用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328757.html
