在网上教程中看到这样一句话:
当 M 执行某一个 G 时候如果发生了 syscall 或则其余阻塞操作,M 会阻塞,如果当前有一些 G 在执行,runtime 会把这个线程 M 从 P 中摘除 (detach),然后再创建一个新的操作系统的线程 (如果有空闲的线程可用就复用空闲线程) 来服务于这个 P;
假如一个协程处理一个连接,每个阻塞的连接需要一个线程,网络IO大部分时间是阻塞的,这样好像跟多线程差不多
更多评论
协程就是用户态线程`ULT`,但并不是每个阻塞的连接需要一个内核支持线程`KST`,网络连接和线程,包括ULT和KST没有必然的关系,网络连接在Linux中都是IO,而IO有对应的IO模型,Linux环境下Golang选用epoll作为IO多路复用模型实现,Windows环境下Golang选用Select作为IO多路复用模型,具体可以看[Go语言设计与实现 - 网络轮询器](https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-netpoller/)
Golang的多线程模型实现是`类似`M:N模型,但KST与ULT中间还夹着一层Process,也就是`P`,其中有`KST`只需要负责Process,然后由Process负责调度`ULT`
#1