理解Linux内核中的TCP内存管理
我正在UDP之上实现一个自定义传输层协议,以提供健壮的传递服务,并需要确保适当的内存管理。我试图使用TCP作为参考,看看函数理解Linux内核中的TCP内存管理,tcp,linux-kernel,network-programming,Tcp,Linux Kernel,Network Programming,我正在UDP之上实现一个自定义传输层协议,以提供健壮的传递服务,并需要确保适当的内存管理。我试图使用TCP作为参考,看看函数TCP\u sendmsg()如何处理内存约束 在tcp\u sendmsg()的内核代码中 因此,为套接字设置了SOCK_NOSPACE标志。但是稍后如何以及在哪里清除位呢?tcp\u sendmsg()函数如何知道位已被清除,并且可以继续发送数据 编辑1:正如Maxim在回答中所建议的那样,函数sk_stream\u wait\u memory()处理等待TCP。我的建
TCP\u sendmsg()
如何处理内存约束
在tcp\u sendmsg()
的内核代码中
因此,为套接字设置了SOCK_NOSPACE标志。但是稍后如何以及在哪里清除位呢?tcp\u sendmsg()
函数如何知道位已被清除,并且可以继续发送数据
编辑1:正如Maxim在回答中所建议的那样,函数sk_stream\u wait\u memory()
处理等待TCP。我的建立在UDP之上的协议也可以使用这个“流”功能吗
因此,为套接字设置了SOCK_NOSPACE标志。但是稍后如何以及在哪里清除位呢
当排队规程将数据从传出套接字缓冲区复制(或删除)到设备的传出队列时,此位被清除
tcp_sendmsg()函数如何知道该位已被清除,并且可以继续发送数据
其中有一个带有
sk\u stream\u wait\u内存调用的循环<代码>密钥流\u等待\u内存执行等待。谢谢Maxim。我也可以使用sk_stream_wait_memory
作为我的协议吗?我的协议运行在UDP之上,因此不是“流”protocol@GauravSuman我必须阅读内核代码才能回答这个问题。
if (!sk_stream_memory_free(sk))
goto wait_for_sndbuf;
wait_for_sndbuf:
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);