Go和Java使用用户空间线程的事实是否意味着您无法真正利用多核?

2022-09-04 01:29:14

我们最近一直在谈论我的操作系统类中的线程,一个问题出现在我的脑海中。

由于Go(和Java)使用用户空间线程而不是内核线程,这是否意味着您无法有效地利用多个内核,因为操作系统仅将CPU时间分配给进程而不是线程本身?

这似乎证实了你不能的事实

维基百科似乎也这么认为


答案 1

是什么让你认为Go使用用户空间线程?

事实并非如此。它使用操作系统线程,可以利用多个内核。

您可能会感到困惑的是,默认情况下Go仅使用1个线程来运行程序。如果您启动两个 goroutine,它们将在一个线程中运行。但是,如果一个用于 I/O 的 goroutine 块,Go 会创建第二个线程,并继续在新线程上运行另一个 goroutine。

如果您真的想解锁完整的多核电源,只需使用GOMAXPROCS()功能即可。

runtime.GOMAXPROCS(4); //somewhere in main

现在,您的程序将使用4个操作系统线程(而不是1个),并且能够完全使用例如4核系统。


答案 2

使用操作系统线程的最新版本的Java,尽管不一定有与Java线程的一对一映射。Java显然在许多硬件线程上确实工作得很好。


推荐