进程(process),线程(thread) ,逻辑调度器(lo

2020-02-28  本文已影响0人  cdz620

基础: 进程与线程

图示:


image.png

go

goroutine 调度过程

  1. goroutine 创建,放置在go runtime scheduler 的全局队列,等待被调度
  2. runtime scheduler 调度goroutine 到一个logical processor ,添加到logical processor 的执行队列,等待logical processor 调度
  3. 当正在执行的goroutine 执行一些阻塞调用,该thread与goroutine从logical processor解除关联,阻塞的goroutine等待阻塞调用返回
  4. 解除thread关联时,logical processor 没有一个可以调度的thread。所以logical processor重新创建一个线程关联到logical processor,继续调度自己的执行队列
  5. 当阻塞调用返回时,goroutine 返回到logical processor 的执行队列等待被调度;空闲的thread资源保留,等待将来被使用。

图示:

image.png

Concurrency vs parallelism

Parallelism(并发):

Concurrency(并行):

图示:

image.png

疑问?

go弱化了thread概念,让logical processor来调度thread执行。go runtime 是否在维护一个线程池,让logical processor 调度使用?

基于以上两点,猜测确实有维护一个线程池。目前还没找到相关文档,关乎这方面底层的介绍

参考文档:

上一篇 下一篇

猜你喜欢

热点阅读