当前位置: 首页 > 面试题库 >

是否可以强制在特定CPU上运行go例程?

谷梁卓
2023-03-14
问题内容

我正在阅读有关go包“运行时”的信息,并发现我可以(除其他功能外)(func GOMAXPROCS(n
int))设置可用于运行程序的CPU单元数。我可以强制goroutine在我选择的特定CPU上运行吗?


问题答案:

在现代Go中,我不会为了提高效率而将goroutine锁定在线程上。Go 1.5
添加了goroutine调度亲和力,以最小化goroutine在OS线程之间切换的频率。而且,必须权衡CPU之间剩余迁移的任何成本和用户模式调度程序的好处,避免上下文切换到内核模式。最后,当转换成本是一个实际问题时,有时更好的重点是更改程序逻辑,因此它需要进行的转换更少,例如通过传达批量工作而不是单个工作项。

但是即使考虑了所有这些,有时您也只需要锁定一个goroutine,例如C API需要它时,我就假设是这种情况。

如果整个程序都运行GOMAXPROCS=1,则通过从schedutils包中调用taskset实用程序来设置CPU亲和力相对简单。

我本来以为您不走运,GOMAXPROCS > 1因为那样的话,goroutines会在运行时在OS线程之间迁移。实际上,詹姆斯·亨斯特里奇(James
Henstridge)指出,您可以使用它
runtime.LockOSThread()来防止goroutine迁移。我不知道一旦将goroutine锁定到它后,就不会有任何Go
stdlib函数来设置当前线程的CPU关联性。您可能可以使用cgo和call
pthread_setaffinity_np,因为显然Go在cgo模式下使用pthreads。由于我们在谈论系统调用,因此详细信息将因操作系统而异。

(如果您的整个程序是纯Go语言(没有C链接),则可以通过模块sched_setaffinity用零pid参数进行调用syscall。但这很棘手。)



 类似资料:
  • 什么JVM在CPU+GPU上运行? 我知道像Oracle、Zulu、OpenJDK这样的JVM,但没有一个是为了将处理卸载到GPU上而设计的。

  • 问题内容: 我有一个vpn连接,当我运行python -m SimpleHTTPServer时,它在0.0.0.0:8000上提供服务,这意味着可以通过本地主机 和 我的真实IP访问它。我不想让机器人扫描我,并且对仅通过本地主机访问服务器感兴趣。 可能吗? 也欢迎任何其他可以使用命令行立即执行的简单http服务器。 问题答案: 如果您阅读了源代码,您将看到只能在命令行上覆盖端口。如果你想改变它在服

  • 我试图在flutter中创建一个布局,由一行和两个子小部件组成,第一个子部件向左对齐,第二个子部件向右对齐,如果容器太窄,这也将包装小部件。 这类似于这里提出的问题:Flutter将两个项极端地对齐--一个在左边,一个在右边,这可以通过小部件来解决,小部件具有。然而,当小部件使用此方法包装时,包装到新运行的右小部件不再右对齐。(截图) 我希望发生的是,右边的小部件在包装时保持与右边对齐。在使用fl

  • 问题内容: 我有以下代码将nvarchar转换为整数: 但是,我无法控制参数@value,因此代码可能会失败。无论如何,在进行转换之前是否要检查是否可以进行转换? 问题答案: 好吧,在SQL Server 2012中,您可以使用新的TRY_CAST(),但在SQL Server 2008中,您应该能够使用ISNUMERIC(),然后包括对未通过该测试的值进行处理。

  • 问题内容: 是否可以在Java 8中强制转换流?说我有一个对象列表,我可以做这样的事情来过滤掉所有其他对象: 不过,在此之后,如果我想与客户做点事情,则需要对每个客户进行转换: 这看起来有点难看。是否可以将整个流转换为其他类型?像蒙上了一个? 请忽略以下事实:这样做可能意味着不良的设计。我们在计算机科学课上做了类似的事情,所以我一直在研究Java 8的新功能,并且好奇是否有可能。 问题答案: 我认

  • 我写了一个简单的程序,在一个循环中执行一堆NOP指令,令我惊讶的是,它每秒执行大约106000000000条指令,或大约10Ghz,而我的CPU只有2.2GHz。 这怎么可能?CPU是将它们视为单个兆NOP,还是我刚刚发现“指令级并行性”是什么意思? 每秒指令的更好衡量标准是什么?添加指令仅达到414900000/s,是我CPU报告的bogomips的十分之一:4390.03 C代码: 编译的程序