我们理解概念时往往会代入自身感受, 觉得线程或协程运行就是像我们吭哧吭哧的处理事情, 线程或协程阻塞就是做事情时我们需要等待其他人. 然后就在这等着了. 要是其他人搞好了, 那我们就继续做当前的事....其实主体对象搞错了.正确的理解应该是我们处理事情时就像 CPU, 而不是像线程或者协程. 假如我当前在写某个服务, 发现依赖别人的函数还没有 ready, 那就把写服务这件事放一边....(上图中的 struct 和函数都做了精简)
GM 模型及 GPM 模型
有了协程的这种执行流形式, 那待运行的协程放在哪呢在 Go1.0 的时候:
调度队列 schedt 是全局的, 对该队列的操作均需要竞争同一把锁...(注意并行和并发的区别)
协程状态及流转
协程的状态其实和线程状态类似,状态转换和发生状态转换的时机如图所示. 还是需要注意: 协程只是一个执行流, 并不是运行实体....go 在初始化一个网络 fd 的时候, 就会把这个 fd 使用 epollctl 加入到全局的 epoll 节点中.