Go和Java使用用户空间线程的事实是否意味着您无法真正利用多核?
2022-09-04 01:29:14
我们最近一直在谈论我的操作系统类中的线程,一个问题出现在我的脑海中。
由于Go(和Java)使用用户空间线程而不是内核线程,这是否意味着您无法有效地利用多个内核,因为操作系统仅将CPU时间分配给进程而不是线程本身?
我们最近一直在谈论我的操作系统类中的线程,一个问题出现在我的脑海中。
由于Go(和Java)使用用户空间线程而不是内核线程,这是否意味着您无法有效地利用多个内核,因为操作系统仅将CPU时间分配给进程而不是线程本身?
是什么让你认为Go使用用户空间线程?
事实并非如此。它使用操作系统线程,可以利用多个内核。
您可能会感到困惑的是,默认情况下Go仅使用1个线程来运行程序。如果您启动两个 goroutine,它们将在一个线程中运行。但是,如果一个用于 I/O 的 goroutine 块,Go 会创建第二个线程,并继续在新线程上运行另一个 goroutine。
如果您真的想解锁完整的多核电源,只需使用GOMAXPROCS()
功能即可。
runtime.GOMAXPROCS(4); //somewhere in main
现在,您的程序将使用4个操作系统线程(而不是1个),并且能够完全使用例如4核系统。
使用操作系统线程的最新版本的Java,尽管不一定有与Java线程的一对一映射。Java显然在许多硬件线程上确实工作得很好。