gpt4 book ai didi

tcp - 了解 Linux 内核中的 TCP 内存管理

转载 作者:可可西里 更新时间:2023-11-01 02:42:17 31 4
gpt4 key购买 nike

我正在 UDP 之上实现自定义传输层协议(protocol)以提供可靠的交付服务,并且需要确保适当的内存管理。我正在尝试使用 TCP 作为引用,并查看函数 tcp_sendmsg() 如何处理内存限制。

tcp_sendmsg()的内核代码中,

if (!sk_stream_memory_free(sk))
goto wait_for_sndbuf;

wait_for_sndbuf:
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);

因此为套接字设置了 SOCK_NOSPACE 标志。但是后来如何以及在何处清除该位? tcp_sendmsg() 函数如何知道该位已被清除并可以恢复发送数据?

编辑 1:正如 Maxim 在他的回答中所建议的,函数 sk_stream_wait_memory() 处理等待 TCP。我的建立在 UDP 之上的协议(protocol)也可以使用这个“流”功能吗?

最佳答案

So the SOCK_NOSPACE flag is set for the socket. But how and where is the bit cleared later?

当队列规则将数据从传出套接字缓冲区复制(或丢弃)到设备的传出队列中时,该位被清除。

And how does the tcp_sendmsg() function know that the bit has been cleared and it can resume sending the data?

while (msg_data_left(msg))在其中调用 sk_stream_wait_memory 循环。 sk_stream_wait_memory 进行等待。

关于tcp - 了解 Linux 内核中的 TCP 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39702169/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com