当vmsplice(4)与SPLICE_F_GIFT一起使用时,我们承诺我的进程不会修改我提供的底层页面.我通知的正常工作流程是:
/*pseudo code don't kill me*/
void* page = memmap();
vmsplice(page, SPLICE_F_GIFT);
free(page);
但这要求我每次赠送页面时都会使TLB无效.这很好地否定了我从不复制数据中获得的任何性能提升.
那我怎么知道内核是用我的页面完成的呢?因为我可以直接释放页面吗?
我假设用例如:
vmsplice -> pipe -> splice -> tcpsocket
我会等待响应,此时内核将刷新其SEND缓冲区,我的页面将再次成为我的?
解决方法:
So how can I know the kernel is done with my page? As I can simply not free the page right?
vmsplice -> pipe -> splice -> tcpsocket
I would wait for a response, at which point the kernel will flush its SEND buffer and my page will be mine again?
没有
等到您使用的协议中的响应确认已收到所有有天赋的页面.然后你会知道内核已经刷新了所有有天赋页面的发送缓冲区.
(顺便说一下,我不认为这些页面的内容能够存活下来.我想它可以就IPSec进行就地加密).
显然,也可以检索“套接字发送队列中未发送数据的数量”,这是另一种方法. https://stackoverflow.com/questions/6421771/vmsplice-and-tcp(当然,您不必等待它按照此链接降至0,您可以重新使用每个页面,因为它变得安全).在您没有填充内核发送队列的情况下,它需要轮询. (当你是,你只需要同时重新检查select()epoll()告诉你有更多的空间来写数据).
标签:linux,memory,pipe,ram 来源: https://codeday.me/bug/20190815/1661849.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。