Multithreading Go运行时是否创建OS线程(M)?
英特尔core i7上的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
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是一个用户级线程
M
)?在将每个上下文(P
)分配给每个操作系统线程(M
)之前M1
)被操作系统调度程序抢占(由于时间片),goroutine调度程序(P1
)如何使用LRQ管理goroutineG1
的状态?P1
是否从操作系统收到M1
状态已更改的通知这是一个模棱两可的问题。处理器有多个内核,每个内核都不读取数据。操作系统可以看到多个处理器。操作系统接受进程并在可用的处理器之间调度它们。线程类似于特殊类型的进程。它们与其他进程共享内存。线程不属于操作系统。处理器是。@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运行时以某种方式表示的概念,尽管我不知道它的细节。