最近我们在我的操作系统课上讨论了很多线程,我想到了一个问题.
由于Go(和Java)使用用户空间线程而不是内核线程,这是否意味着您不能有效地利用多核,因为操作系统只将CPU时间分配给进程,而不是线程本身?
最近我们在我的操作系统课上讨论了很多线程,我想到了一个问题.
由于Go(和Java)使用用户空间线程而不是内核线程,这是否意味着您不能有效地利用多核,因为操作系统只将CPU时间分配给进程,而不是线程本身?
是什么让您认为Go使用用户空间线程?
It doesn't.它使用操作系统线程,可以利用多核.
您可能会对Go在默认情况下只使用一个线程来运行您的程序这一事实感到困惑.如果您启动两个goroutines,它们在一个线程中运行.但是,如果一个goroutine阻塞I/O,则GO会创建第二个线程,并继续在新线程上运行另一个goroutine.
如果你真的想解锁全部多核电源,只需使用GOMAXPROCS()
功能.
runtime.GOMAXPROCS(4); //somewhere in main
个
现在,您的程序将使用4个OS线程(而不是1个),并且能够完全使用例如4核系统.