美文网首页
Go并发编程-线程模型

Go并发编程-线程模型

作者: 筑梦之队 | 来源:发表于2020-09-15 15:55 被阅读0次

    在介绍Go独特的线程模型之前,我们先来回顾下常见的三种线程模型。
    线程的并发执行是由操作系统来进行调度的,操作系统在内核提供对线程的支持。而我们在使用高级语言编写程序时候创建的线程属于用户线程,那么用户线程与内核线程是什么关系呢?根据用户线程与内核线程关系的不同可以分成三类:

    1. 一对一模型(1 : 1):每个用户级线程映射到一个内核线程。
      一对一模型(1 : 1)

    优点:

    • 在多核处理器下,内核空间线程模型支持了真正的并行。
    • 当一个线程被阻塞后,另一个线程继续执行,所以并发能力较强。

    缺点:

    • 每创建一个用户线程都需要创建一个内核线程与之对应,这样创建线程的开销比较大,会影响到应用程序的性能。
    • 由于操作系统一般会限制内核线程的个数,所以用户线程的个数会受到限制。
    • 另外由于用户线程与内核线程一一对应,当用户线程执行系统调用(比如IO操作)的时候,需要从用户态切换到内核态执行内核操作,然后等执行完毕后又会从内核态切换到用户态执行用户程序,而这个切换操作开销是相对比较大的。
    1. 多对一模型(M : 1):多个用户线程映射到一个内核线程,线程管理在用户空间完成。
      多对一模型(M : 1)

    优点:

    • 线程上下文切换都发生在用户空间,避免模态切换(mode switch),所以切换速度很快,开销很小。
    • 可创建的用户线程的数量可以很多,只受内存大小限制。

    缺点:

    • 由于多个用户线程对应一个内核线程,多核处理器得不到充分地利用。
    • 由于多个用户线程对应一个内核线程,当该内核线程对应的一个用户线程被阻塞挂起时候,该内核线程对应的其他用户线程也不能运行了,因为这时候内核线程已经被阻塞挂起了。
    1. 多对多模型(M : N):用户线程和内核线程的数量比为 M : N。
      多对多模型(M : N)

    优点:

    • 每个内核线程对应多个用户线程,每个用户线程也可以对应多个内核线程。当一个用户线程阻塞后,其对应的内核线程会被阻塞,但是被阻塞的内核线程对应的其他用户线程可以切换到其他的内核线程上继续运行,所以多对多模型是可以充分利用多核CPU提升运行效率。
    • 多对多模型对用户线程个数没有限制,理论上只要内存够用可以无限创建。

    Go实现的是多对多模型(M : N)。在操作系统提供的内核线程之上,Go搭建了一个特有的两级线程模型。一级是操作系统的调度系统,该调度系统调度逻辑处理器占用cpu时间片运行;另一级是Go的运行时调度系统,该调度系统调度某个goroutine在逻辑处理上运行。

    说起Go的线程实现模型,有三个必知的核心元素,它们支撑起了这个模型的主框架。
    M:Machine的缩写。一个M代表一个内核线程,或者“工作线程”。
    P:Processor的缩写。一个P代表执行一个Go代码片段所必需的资源(或称“上下文环境”)。
    G:Goroutine的缩写。一个G代表一个Go代码片段。前者是对后者的一种封装。

    简单来说,一个G的执行需要P和M的支持。
    一个M在与一个P关联之后,就形成了一个有效的G运行环境(内核线程+上下文环境)。
    每个P都会包含一个可运行的G的队列(runq)。该队列中的G会被依次传递给与P关联的M,并获得运行时机。
    MPG之间的关系如下图所示:


    Go线程模型

    可以看到,M与KSE之间总是一对一的关系,一个M能且仅能代表一个内核线程。Go的运行时系统(runtime system)用M代表一个内核调度实体。M与KSE之间的关联非常稳固,一个M在其生命周期内,会且仅会与一个KSE产生关联。相比之下,M与P、P与G之间的关联都是易变的,它们之间的关系会在实际调度的过程中发生变化。此外,M与G之间也会建立关联,因为一个G终归会由一个M来负责运行;它们之间的关联会由P来牵线。注意,由于M、P和G之间的关系在实际调度过程中多变,上图中的可能关联仅能作为一般性的示意。

    至此,我们已经知道了这些核心实体之间可能存在的关系。Go的运行时系统会对这些实体的实例进行实时管理和调度。接下来,我们分三篇文章分别介绍M, P, G的内容。

    相关链接:
    Go并发编程-线程模型
    Go并发编程-线程模型(M)
    Go并发编程-线程模型(P)
    Go并发编程-线程模型(G)

    参考资料:
    https://www.jianshu.com/p/2e45a5c0b72f
    https://blog.csdn.net/m0_37055174/article/details/104132303
    https://www.ituring.com.cn/book/tupubarticle/16048

    相关文章

      网友评论

          本文标题:Go并发编程-线程模型

          本文链接:https://www.haomeiwen.com/subject/dvkfyktx.html