摘录


可以看到,Go运行时存在两种类型的queue: 一种是一个全局的queue(在schedt结构体中,很少用到), 一种是每个P都维护自己的G的queue。

为了运行goroutine, M需要持有上下文P。M会从P的queue弹出一个goroutine并执行。

当你创建一个新的goroutine的时候(go func()方法),它会被放入P的queue。当然还有一个 work-stealing调度算法,当M执行了一些G后,如果它的queue为空,它会随机的选择另外一个P,从它的queue中取走一半的G到自己的queue中执行。(偷!)

当你的goroutine执行阻塞的系统调用的时候(syscall),阻塞的系统调用会中断(intercepted),如果当前有一些G在执行,运行时会把这个线程从P中摘除(detach),然后再创建一个新的操作系统的线程(如果没有空闲的线程可用的话)来服务于这个P。

当系统调用继续的时候,这个goroutine被放入到本地运行queue,线程会park它自己(休眠), 加入到空闲线程中。

点评

NULL

原文

点击这里查看原文

其它

本帖内容由21QA云收藏工具自动生成,欢迎使用。

系统消息 若觉得内容不错,请点击左上角的"赞"图标,以优化网站的内容呈现。 另外,请及时验证注册邮箱,否则收不到21QA发出的红包。 官方Q群:250203055

asked 12 Apr, 11:06

%E8%B7%AF%E4%BA%BA%E7%94%B2's gravatar image

路人甲
131547588659

Be the first one to answer this question!
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link: [text](http://url.com/ "title")
  • image: ![alt](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×828
×19

question asked: 12 Apr, 11:06

question was seen: 97 times

last updated: 12 Apr, 11:06

powered by O*S*Q*A

粤ICP备14040061号-1