如果我的程序有更多线程

时间:2017-01-14 17:04:52

标签: multithreading go linux-kernel threadpool

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

  

答:10个帖子

     

B:20个帖子

     

C:30个帖子

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

C会比B完成更多的事情吗?B比A做得更多?

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

这与golang有什么关系: 在go中,go调度程序通常具有#of-CPU-cores线程的线程池。如果具有更多线程的进程完成更多工作,为什么这有意义呢?

2 个答案:

答案 0 :(得分:1)

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

Go 并非旨在与其他进程争夺 CPU 过载的更大份额。如果您想参加这样的战斗,您可以随意将 GOMAXPROCS 设置为您喜欢的任何数字。

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

答案 1 :(得分:0)

  

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

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

  

这与golang有什么关系:在go中,go调度程序通常有一个   #of-CPU-cores线程的线程池。为什么这有意义如果a   有更多线程的进程可以完成更多工作吗?

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

另一件事是上下文切换可能不占用你的大部分CPU,并且拥有更多线程可能不会使你的任务 - 吞吐量降低。因此,在这种情况下,拥有更多线程意味着您的并行性更高,但您不会失去性能。这是一种常见的情况。这些天线程之间的上下文切换非常便宜。拥有比核心更多的线程可能没有必要杀死你的性能或以某种方式降低它。