c -可以以太网缓冲区填满,不允许其他进程接收以太网数据包?



假设您有一个进程从服务器接收一个大文件。

  1. 如果您不执行recv()调用,它是否永远留在以太网控制器的缓冲区上?

  2. 如果另一个进程需要接收数据,缓冲区已满,是否需要等待,直到另一个进程执行recv()或缓冲区超时?

  3. 如果你有多个进程发送和接收数据,它必须等到缓冲区是空的吗?或者它可以复用它并在驱动程序级别或套接字库的某些部分进行跟踪?

编辑:拼写

  1. 如果您不执行recv()调用,它是否停留在您的永远的以太网控制器?

不,数据永远不会在以太网控制器的缓冲区中停留很长时间;内核会尽可能快地将数据从以太网控制器的缓冲区读入套接字的缓冲区(在计算机的常规RAM中)。如果您的套接字缓冲区已满,则传入的数据将被丢弃。

  1. 如果另一个进程需要接收数据并且缓冲区已满另一个进程需要等待另一个进程执行recv()还是缓冲区超时?

每个套接字在计算机的主内存中都有自己独立的缓冲区,每个进程都有自己的套接字,所以进程不必等待彼此的缓冲区清空。

  1. 如果你有多个进程发送和接收数据,它有等待,直到缓冲区为空。

见问题2的答案,因为它也回答了这个问题。

这是一个完全球形的鸡在真空类型的答案。但是你的问题非常广泛,有很多取决于网卡、操作系统和许多其他东西的假设。

但是让我们假设你在一个现代化的成熟的操作系统上,有现代化的以太网控制器。

  1. 。这些都是由内核和协议处理的。内核在等待您的时候不能让网络控制器上的缓冲区填满。否则会阻止其他进程访问网络。所以它会缓冲,直到你准备好。对于某些协议,存在一种机制,其中一个设备可以告诉另一个设备不要再发送任何数据。(ei。TCP接收窗口大小,一旦发送方发送了一定数量的数据,它将停止,直到接收方以某种方式确认它)
  2. 基本上和上面的答案一样,操作系统处理细节。从您的角度来看,您的recv()不会阻塞任何其他进程的recv()能力。
  3. 这更有趣,现代网卡是基于队列的。您有n个发送/接收队列,在大多数情况下,可以将过滤器附加到它们上。这允许网卡做很多通常必须由操作系统完成的功能(这被称为卸载),但回到重点。有了这些nic,您就有了多个I/O,而无需进行多路复用。一般来说,特别是在消费级NIC上,队列的数量非常少。通常4。所以会涉及到一些复用。

最新更新