在数据传输的场景中,如果接受者(receiver)无法跟上发送者(sender)发送数据包的速度,接受者需要如何处理?(提示选择轮询或者中断的方式)
轮询方式:后续的数据可能会覆盖之前的数据如果接受者没有及时的接受数据包
中断方式:前面的数据包会被保留,并且能够阻塞后续的数据包进入设备的缓存中
简单描述当接受者(receiver)从网卡接受到了网络包之后的数据传输流程。在真实情况下,Linux中会发生几次上下文的切换,ChCore中呢?
数据流:
a) ISR:DMA环形缓存->skb缓存
b) Softirq:通知IP层
c) IP->TCP->内核中接受socket的缓存区(通过转移skb的指针)
d) 内核中的缓存区->用户态的缓存区
(例如:Linux中过的copy_to_user())
上下文切换:
Linux 1次:(内核的网络栈/用户态应用)
ChCore 4次:(网络驱动/内核/网络栈服务/内核/用户态应用)
Linux是如何使用skb机制在内核中实现零拷贝的?skb拷贝在什么时候会发生?请同时考虑浅拷贝(skb_clone)以及深拷贝(skb_copy)
零拷贝:sk_buff拥有四个指针:head,data,tail,end。Linux网络栈实现零拷贝通过更新data的指针
浅拷贝:捕获网络包(通过监视器或者分析)而不会损害性能
深拷贝:修改数据包的内容,例如Network Address Translation
Intel DPDK使用了哪一种技术来提升网络性能?如果你是ChCore团队的网络设计者,你会选者什么方式来优化ChCore为内核的网络服务,你可以通过学习"Snap: a microkernel approach to host networking", Marty et al., SOSP’19来回答该问题
相应技术:
a) 绕过内核,全部实现在用户态
b) 使用轮训的机制而不是使用中断
c) 使用大页
d) 绑核(CPU 亲和力)或者使用无锁的环形缓存的结构以上的技术都能够实现在ChCore中,并且能进一步的优化性能,例如使用中断和轮训的动态切换。