为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ITMISS 2021-04-09 12:15:10
最近,我们一直在操作系统类中谈论线程,我想到了一个问题。由于Go(和Java)使用用户空间线程而不是内核线程,这是否意味着您不能有效利用多个内核,因为OS仅将CPU时间分配给进程,而不是线程本身?
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

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

没有。它使用OS线程,并且可以利用多个内核。

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

如果您确实想解锁全部的多核功能,请使用该GOMAXPROCS()功能。

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

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


查看完整回答
反对 回复 2021-04-26
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

我假设“用户空间线程”是指(例如)Go的goroutine。

的确,使用goroutines进行并发要比设计(通过手工和科学计算)为OS线程分配工作单元的专用算法效率低。

但是:每个Go程序都位于一个环境中,旨在解决特定问题。可以为环境对Go程序提出的每个请求启动一个新的goroutine。如果环境正在向Go程序发出并发请求,则即使Go程序仅使用1个OS线程,使用goroutines的Go程序也可能比串行程序运行得更快。goroutine能够以更高的速度处理请求的原因(即使仅使用1个OS线程)是因为,当与A关联的环境部分暂时无法执行时,Go程序会自动从goroutine A切换到goroutineB。回应。

但是,是的,的确,使用goroutine并将它们自动分配给多个OS线程确实比设计(通过手工和科学计算)为OS线程分配工作单元的专用算法效率低。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信