下面的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”。)

    10-04 10:13