在网上教程中看到这样一句话: 当 M 执行某一个 G 时候如果发生了 syscall 或则其余阻塞操作,M 会阻塞,如果当前有一些 G 在执行,runtime 会把这个线程 M 从 P 中摘除 (detach),然后再创建一个新的操作系统的线程 (如果有空闲的线程可用就复用空闲线程) 来服务于这个 P;
假如一个协程处理一个连接,每个阻塞的连接需要一个线程,网络IO大部分时间是阻塞的,这样好像跟多线程差不多
有疑问加站长微信联系(非本文作者)

在网上教程中看到这样一句话: 当 M 执行某一个 G 时候如果发生了 syscall 或则其余阻塞操作,M 会阻塞,如果当前有一些 G 在执行,runtime 会把这个线程 M 从 P 中摘除 (detach),然后再创建一个新的操作系统的线程 (如果有空闲的线程可用就复用空闲线程) 来服务于这个 P;
假如一个协程处理一个连接,每个阻塞的连接需要一个线程,网络IO大部分时间是阻塞的,这样好像跟多线程差不多
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
协程就是用户态线程
ULT
,但并不是每个阻塞的连接需要一个内核支持线程KST
,网络连接和线程,包括ULT和KST没有必然的关系,网络连接在Linux中都是IO,而IO有对应的IO模型,Linux环境下Golang选用epoll作为IO多路复用模型实现,Windows环境下Golang选用Select作为IO多路复用模型,具体可以看Go语言设计与实现 - 网络轮询器Golang的多线程模型实现是
类似
M:N模型,但KST与ULT中间还夹着一层Process,也就是P
,其中有KST
只需要负责Process,然后由Process负责调度ULT
“并不是每个阻塞的连接需要一个内核支持线程KST”,什么样的阻塞连接是需要内核线程支持的
典型的是以
阻塞IO
为IO模型实现的编程