Multithreading 如果我的程序有更多的线程,它会得到更多的cpu时间吗

Multithreading 如果我的程序有更多的线程,它会得到更多的cpu时间吗,multithreading,go,linux-kernel,threadpool,Multithreading,Go,Linux Kernel,Threadpool,如果当前内核正在调度60个线程,则它们属于3个进程: A:10根线 B:20根线 C:30线 他们都在做计算(没有磁盘IO) C会比B做得更多,B会比A做得更多吗 这对我来说似乎不太公平。如果我是一个不负责任的程序员,我可以产生更多的线程来消耗更多的CPU资源 这与golang的关系: 在go中,go调度程序通常有一个由#个CPU核心线程组成的线程池。如果一个有更多线程的进程完成了更多的工作,那么这为什么有意义呢 这对我来说似乎不太公平。如果我是一个不负责任的程序员, 我可以产生更多的线程来消耗

如果当前内核正在调度60个线程,则它们属于3个进程:

A:10根线

B:20根线

C:30线

他们都在做计算(没有磁盘IO)

C会比B做得更多,B会比A做得更多吗

这对我来说似乎不太公平。如果我是一个不负责任的程序员,我可以产生更多的线程来消耗更多的CPU资源

这与golang的关系: 在go中,go调度程序通常有一个由#个CPU核心线程组成的线程池。如果一个有更多线程的进程完成了更多的工作,那么这为什么有意义呢

这对我来说似乎不太公平。如果我是一个不负责任的程序员, 我可以产生更多的线程来消耗更多的CPU资源

您还可以分配全部可用内存,导致操作系统故障并劫持网卡。你可以做各种各样的事情,但是谁会想使用你的软件呢

这与golang的关系:在go中,go调度程序通常具有 由#个CPU核心线程组成的线程池。如果一个 有更多线程的进程可以完成更多的工作

Golang goroutines基本上是一个线程池。每个goroutine都是一个线程池工作项。很多事情都会导致线程池线程阻塞,比如使用同步IO、等待(非自旋锁)锁以及手动休眠或屈服。在这些非常常见的情况下,拥有比CPU更多的线程通常会提高应用程序的性能。
请注意,并非所有IO都是磁盘IO。写入控制台是一种IO操作,但实际上不是“磁盘IO”。


另一件事是,上下文切换可能不会占用大量CPU,拥有更多线程可能不会降低任务吞吐量。因此,在这种情况下,拥有更多线程意味着您的并行度更高,但不会降低性能。这是比较普遍的情况。现在线程之间的上下文切换非常便宜。拥有比内核多一点的线程可能不一定会降低性能或以某种方式降低性能

您描述的情况是机器过载。只有当CPU没有空闲时间时,具有更多线程的进程才能完成更多的工作

Go的设计目的不是为了与其他进程争夺过载CPU的更大份额。如果你想参加这样的战斗,你可以自由设置
GOMAXPROCS
为任何你喜欢的数字


在更典型的系统中,总工时小于总CPU时间;一个包含8个线程和30个goroutine的Go进程与一个同时运行30个线程的进程的性能大致相同。

谢谢。我只想澄清一下您的goroutine
拥有比CPU更多的线程通常会提高应用程序的性能
注释:我同意拥有比CPU核心更多的线程更好,但您不需要仅仅为了这个目的而增加
GOMAXPROXCS
:“在I/O或其他系统调用中被阻止或正在调用非GO函数的Goroutine确实需要一个OS线程,但GOMAXPROXCS不需要考虑它们“从第281页开始。如果我从你的回答中理解的那样:CPU时间大致均匀地分布在整个操作系统中CPU密集型线程的总数上
GOMAXPROXCS
设置为核心数对我来说没有意义——使用核心数作为线程池中的线程数是毫无意义的。如果是这样的话,goroutine Worker就没有必要比CPU更多。