Multithreading Go运行时是否创建OS线程(M)?

Multithreading Go运行时是否创建OS线程(M)?,multithreading,go,Multithreading,Go,英特尔core i7上的numLogicalProcessors是8(2 X 4个物理内核)。Linux操作系统。因此,八个操作系统线程(M)可以并行工作。Go运行时可以在我的Go程序中分配八个上下文(P1,P2…P8-runtime.GOMAXPROCS(numLogicalProcessors)) Go遵循M:N线程模型,其中N是操作系统线程,M是Go程序的Go例程 操作系统调度程序时间表。线程状态为等待,可运行和执行 Go调度程序调度Go例程。Go例程状态为等待、运行和执行。Gorouti

英特尔core i7上的
numLogicalProcessors
8
(2 X 4个物理内核)。Linux操作系统。因此,八个操作系统线程(
M
)可以并行工作。Go运行时可以在我的Go程序中分配八个上下文(
P1
P2
P8
-
runtime.GOMAXPROCS(numLogicalProcessors)

Go遵循
M:N
线程模型,其中
N
是操作系统线程,
M
是Go程序的Go例程

操作系统调度程序时间表。线程状态为
等待
可运行
执行

Go调度程序调度Go例程。Go例程状态为等待、运行和执行。Goroutine是一个用户级线程


  • Go程序的运行时是否显式创建了这八个OS线程(
    M
    )?在将每个上下文(
    P
    )分配给每个操作系统线程(
    M
    )之前

  • 如果操作系统线程(
    M1
    )被操作系统调度程序抢占(由于时间片),goroutine调度程序(
    P1
    )如何使用LRQ管理goroutine
    G1
    的状态?
    P1
    是否从操作系统收到
    M1
    状态已更改的通知

  • 是,转到调度程序开始执行线程。它们的数量可以通过检查或更改
  • 不,操作系统抢占对正在运行的进程是透明的。从版本1.14开始,Go运行时可以运行,但这是为了避免由于紧循环而锁定线程。它与操作系统抢占无关
    这是一个模棱两可的问题。处理器有多个内核,每个内核都不读取数据。操作系统可以看到多个处理器。操作系统接受进程并在可用的处理器之间调度它们。线程类似于特殊类型的进程。它们与其他进程共享内存。线程不属于操作系统。处理器是。@GrzegorzŻur是的。。。OS线程是使用
    pthread\u create()
    创建的Linux本机线程。是的
    pthread\u create()
    在内部使用
    clone()
    系统调用。我的问题是。。。GO运行时是否创建了这八个linux本机线程(
    M
    )?goroutine scheduler=threadpool.@DavidHaim用户级线程线程池(Goroutines)?这是一个实现细节,可能会随着版本的不同而变化,或者gc和gcc中有所不同(不是,但可能是)。1)你明白我的第二个问题了吗?让我知道,如果还需要澄清的话,Go运行时只不过是执行OS线程创建和系统调用的C代码。只是想补充一下你的答案。第2页的图解释了关于您的第一个答案,当您说“Go runtime create OS threads”时,您的意思是每个goroutine调度程序(比如说
    P1
    )创建其相应的OS线程
    M1
    ?每个goroutine调度程序在运行时启动的单独线程中运行。您的意思是。。。。,Go运行时是否将goroutine调度程序(
    P1
    )作为操作系统线程(
    M1
    )启动,将goroutine调度程序(
    P2
    )作为操作系统线程(
    M2
    )启动,以及将其余所有操作系统线程启动?而
    P1
    不过是
    类型p结构
    是的,我是说。您可以通过运行任何Go程序来检查它,然后使用
    pidof
    ps-T
    查看这些线程。上下文是一个在Go运行时以某种方式表示的概念,尽管我不知道它的细节。