@
lxdlam 看得出来, 你只搞懂了协程依赖于控制流调度, 没有搞懂为什么必须要用户态调度, 以及它和异步网络编程之间的联系。
协程的崛起本质是异步网络编程的崛起。 在没有协程支持, 只能写基于 callback 的 poll/epoll 异步的时候, 已经可以通过共享一个上下文结构体实现异步执行流了。 协程只是为这种写法提供了语言层面的支持, 提供了异步堆栈和异步上下文。 有栈无栈只是对调用栈的取舍; 对称非对称, 协程还是 fiber 只是这些"函数片段"如何调度的一些策略。
用户线程可以用来调度一些与 I/O 无关的计算任务的这个想法, 从历史来看不过是人们的一种想象中的需求, 实际上从来没有实用过。
你对 epoll 的理解也挺歪的, epoll 和现在新的 fs syscall io uring 的设计目的都是为了减少 I/O 所需的 syscall 调用次数和 overhead 。 你说的什么只需要另一个线程去轮询就能模拟 non-blocking 的想法, 在没有异步 syscall 的前提下是完全不可能的(Linux 的文件系统 syscall 就是这样), 并发的读写文件请求只能让线程池慢慢消费(nodejs) , 或者多开线程处理(go), 在性能方面完全丧失和传统多线程网络编程范式竞争的资本。
另外贴链接的时候好好看看文章是不是你说的那个意思。 你稍微了解一下 LWP 也知道, LWP 也是内核完成调度的线程, 它和 Linux 线程的区别仅仅是 Linux 内核对线程的调度和对进程的调度是没有任何区别的, 而 Windows 和 Solaris 对线程调度有一定的优化。
https://docs.oracle.com/cd/E19455-01/806-3461/6jck06gqe/index.html https://docs.oracle.com/cd/E19455-01/806-5257/6je9h0339/index.html