@
wekw 首先感谢你的回复,我确实不懂协程,我在工程中并没有使用过协程,不算 go 的话。
、我的之前回复语气可能有点冲,这里我道歉。我确实经验不足,毕竟我工作也没几年。既然 v2 是讨论技术的地方,那我继续向你请教。
另外你认错人了。
1.`第一操作系统会自动调控`
在我的理解里,单线程的调控就是把之前在 A 核的任务挪到 B 核。并没有解决一个核满了一个核空的问题。
2 `协程为什么性能高,就是因为没有上下文切换了`
我的理解里协程里依旧有上下文切换。因为需要保存当前程序运行在了哪一句。这个就是上下文,否则我无法理解协程是如何恢复到原来运行环境的,只不过开销比较小。可以话提供一个协程实现库让我学习一下。
3 ` 你管这个叫测试?好好学学英语,这是一个研究者在某一个会议上发表的论文`
可能是我的描述有误,这里的测试指的是论文里的测试数据。这篇链接是用来反驳你`是无法实现 10Gbps 和 40Gbps 的网卡速度的`这句话的。这篇文章依旧用的是 linux 网络栈,之后还有 bbr 的测试数据。根据里面的测试数据在 100Gbps 下达到了 79Gbps 的成绩。100Gbps 都能达到有个还可以的成绩,何来无法实现 40Gbps 一说?另外你给的文章里面也提到了 `使用多核编程技术替代多线程,将 OS 绑在指定核上运行` `而多核则是每个 CPU 核一个线程` `DPDK 程序启动后只能有一个主线程,然后创建一些子线程并绑定到指定 CPU 核心上运行`(这个是我贴的文档里描述)。这里面都提到了线程,只不过是用的线程池(不是无脑的开新线程还是将任务分配到线程池)。我还是没有看到里面提到了协程。
4. 同上
5.是我的描述有误,这里的 frame 指的是 ethernet frames。我没有说不是内核提供的,tun 本身就是依赖内核实现的。
6.我重新看了一遍,没有问题。goroutine 就是这么做的。
7. 我研究过 libuv 源码,也给 libuv 提交过 pr,我现在做项目基本上都是基于 libuv 做的。所以我才会说提供给 nodejs 异步的 api,文件操作用的是线程池实现的。另外,你说的文件指的是 File descriptor,这里是单纯的 file,也是描述不清的问题。
8.`你真的要好好学习一个。“协程的开销会比手动接管 callback 来的要高”,协程调度器的本质就是手动接管 callback,你还是不懂协程,唉。 `
我这里指的是,与其在 callback 处放协程调度器,不如自己实现一套更加轻量的调度器,参考 libuv,libuv 没有使用协程,老一点的 libevent 也没有使用协程。
总结下我的观点
1. 你的协程高性能这点,是得力于异步 api,和协程本身没有任何直接关系,不是协程造就了高并发高性能,协程是用来减轻异步 api 带来的开发难度。
2. 协程依旧需要切换上下文,因为需要恢复到 yield 的地方继续执行。