Open chenyahui opened 4 years ago
你好博主,我有个问题不是很清楚,希望博主能给点指导,就是libco hook了所有的阻塞io,只注册fd对应的io事件后就yield让出cpu,那么当对应的fd发生事件时,也就是从epoll_wait返回时,协程调度程序如何将该fd对应的协程找出来,他们之间时通过什么对应的那?
@duweismile 你好博主,我有个问题不是很清楚,希望博主能给点指导,就是libco hook了所有的阻塞io,只注册fd对应的io事件后就yield让出cpu,那么当对应的fd发生事件时,也就是从epoll_wait返回时,协程调度程序如何将该fd对应的协程找出来,他们之间时通过什么对应的那?
可以注意看co_poll_inner函数,对于每个epoll事件,都会对应一个arg变量,存在epoll_event.data.ptr
中. 该变量里面包含一个callback及当前协程的相关信息,当epoll_wait事件到达时,同时可拿到epoll_event.data.ptr,即可找到对应协程了
https://www.cyhone.com/articles/analysis-of-libco/
libco 是微信后台开发和使用的协程库,同时也是极少数的直接将 C/C++ 协程运用到如此大规模的生产环境中的案例。 在 《云风 coroutine 协程库源码分析》 中,介绍了有栈协程的实现原理。相比 coroutine,libco 在性能上号称可以调度千万级协程。 从使用上来说,不仅提供了一套类 pthread 的协程通信机制,同时可以零改造地将三方库的阻塞 IO 调用协程异步化。 本文将从