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

最近,我们一直在操作系统类中谈论线程,我想到了一个问题。

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


ITMISS
浏览 217回答 3
3回答

紫衣仙女

是什么让您认为Go使用用户空间线程?没有。它使用OS线程,并且可以利用多个内核。您可能会对以下事实感到困惑:默认情况下,Go仅使用1个线程来运行您的程序。如果启动两个goroutine,它们将在一个线程中运行。但是,如果一个I / O的goroutine块创建了第二个线程,并继续在新线程上运行另一个goroutine。如果您确实想解锁全部的多核功能,请使用该GOMAXPROCS()功能。runtime.GOMAXPROCS(4); //somewhere in main现在,您的程序将使用4个OS线程(而不是1个),并且将能够完全使用例如4个核心系统。

哆啦的时光机

我假设“用户空间线程”是指(例如)Go的goroutine。的确,使用goroutines进行并发要比设计(通过手工和科学计算)为OS线程分配工作单元的专用算法效率低。但是:每个Go程序都位于一个环境中,旨在解决特定问题。可以为环境对Go程序提出的每个请求启动一个新的goroutine。如果环境正在向Go程序发出并发请求,则即使Go程序仅使用1个OS线程,使用goroutines的Go程序也可能比串行程序运行得更快。goroutine能够以更高的速度处理请求的原因(即使仅使用1个OS线程)是因为,当与A关联的环境部分暂时无法执行时,Go程序会自动从goroutine A切换到goroutineB。回应。但是,是的,的确,使用goroutine并将它们自动分配给多个OS线程确实比设计(通过手工和科学计算)为OS线程分配工作单元的专用算法效率低。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go