当大部分IO都是阻塞操作时,协程模型是不是就相当于多线程模型

Velpro · 2020-10-17 12:04:57 · 1312 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-10-17 12:04:57 的主题,其中的信息可能已经有所发展或是发生改变。

在网上教程中看到这样一句话: 当 M 执行某一个 G 时候如果发生了 syscall 或则其余阻塞操作,M 会阻塞,如果当前有一些 G 在执行,runtime 会把这个线程 M 从 P 中摘除 (detach),然后再创建一个新的操作系统的线程 (如果有空闲的线程可用就复用空闲线程) 来服务于这个 P;

假如一个协程处理一个连接,每个阻塞的连接需要一个线程,网络IO大部分时间是阻塞的,这样好像跟多线程差不多


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1312 次点击  
加入收藏 微博
3 回复  |  直到 2020-10-21 16:06:18
avtion
avtion · #1 · 5年之前

协程就是用户态线程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

Velpro
Velpro · #2 · 5年之前
avtionavtion #1 回复

协程就是用户态线程`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`

“并不是每个阻塞的连接需要一个内核支持线程KST”,什么样的阻塞连接是需要内核线程支持的

avtion
avtion · #3 · 5年之前
VelproVelpro #2 回复

#1楼 @avtion “并不是每个阻塞的连接需要一个内核支持线程KST”,什么样的阻塞连接是需要内核线程支持的

典型的是以阻塞IO为IO模型实现的编程

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传