multithreading - 提供多少逻辑处理器的运行时API是什么?

标签 multithreading go

下面的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说,

NumCPU returns the number of logical CPUs usable by the current process.



我的理解是

Go调度程序会创建OS线程(M),该线程将等于逻辑处理器的数量。

为什么运行时api的值不为8?

最佳答案

根据以上所有列表,您具有:

  • 每个套接字两个内核
  • 和一个套接字

  • 这意味着您只有两个CPU内核。但是,您还有:
  • 每个核心两个线程

  • 这意味着您的两个CPU可以同时运行多达四个线程(使用some potential drawbacks,但是至少在大多数情况下,这应该比使用两个线程多得多)。

    由于这是实际的硬件限制,因此Go将要使用的线程数计算为4的事实似乎是正确的。

    (我认为您之所以计为八个,是因为您假设Linux报告的每个“cpus”都支持两个线程。事实并非如此:只有两个物理内核,但是每个内核都支持两个线程,因此Linux将其报告为四个“cpus”。)

    关于multithreading - 提供多少逻辑处理器的运行时API是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61643863/

    相关文章:

    android - 使用 Runnable 和 postDelayed 更新 UI 不适用于计时器应用程序

    java - 保证String.intern()线程安全吗?

    go - golang select 语句中案例与默认值的优先级

    go - 在同一包中自己的文件中单独实现

    go - 如何使用 GORM 一次一行读取 SQLite 数据库

    google-app-engine - goji 可以与 Google App Engine/Go 一起使用吗?

    c - 服务器的线程与客户端实现通信

    Android线程问题,为什么当我使用工作线程时ui仍然阻塞?

    java - 线程 "main"java.lang.NoClassDefFoundError : org/reactivestreams/Publisher? 中的异常

    go - sync.mutex 锁定什么?