下面的UNIX命令:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
显示,
CPU(s): 4
Thread(s) per core: 2
这是4 X 2 = 8个逻辑处理器。纠正我。
以下是另一个Linux命令:
$ cat /proc/cpuinfo
processor : 0
....
cpu cores : 2
.....
processor : 1
.....
cpu cores : 2
.....
processor : 2
.....
cpu cores : 2
.....
processor : 3
.....
cpu cores : 2
.....
$
但是下面的程序仅显示4个逻辑处理器:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println(runtime.GOMAXPROCS(0)) // gives 4
fmt.Println(runtime.NumCPU()) // gives 4
}
输出:
$ go install github.com/myhub/cs61a
$ bin/cs61a
4
4
code$
更多细节:
$ go version
go version go1.14.1 linux/amd64
$ uname -a
Linux mohet01-ubuntu 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Documentation说,
我的理解是
Go调度程序会创建OS线程(
M
),该线程将等于逻辑处理器的数量。为什么运行时api的值不为8?
最佳答案
根据以上所有列表,您具有:
这意味着您只有两个CPU内核。但是,您还有:
这意味着您的两个CPU可以同时运行多达四个线程(使用some potential drawbacks,但是至少在大多数情况下,这应该比使用两个线程多得多)。
由于这是实际的硬件限制,因此Go将要使用的线程数计算为4的事实似乎是正确的。
(我认为您之所以计为八个,是因为您假设Linux报告的每个“cpus”都支持两个线程。事实并非如此:只有两个物理内核,但是每个内核都支持两个线程,因此Linux将其报告为四个“cpus”。)