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

go进程产生的OS线程数是否永远不会减少?

商昆琦
2023-03-14
问题内容

考虑一个在具有GOMAXPROCS值10的系统上运行的golang程序。由于阻塞了系统调用,OS产生了30个以上的线程,导致40个OS线程附加到该进程。

在所有阻塞的系统调用返回之后,该进程是否仍将具有40个OS线程?如果是,那么我们可以得出结论,映射到golang进程的OS线程数量可以增加,但绝不会减少吗?


问题答案:

是的,当前由于阻塞的goroutines而产生的线程不会停止。关于定期关闭空闲线程的讨论:运行时:让空闲OS线程退出#14592

虽然有一种杀死线程的方法。如果您按照文档runtime.LockOSThread()调用goroutine而未调用goroutine的对应项runtime.UnlockOSThread(),则:

如果调用的goroutine在没有解锁线程的情况下退出,则该线程将终止。

您也可以使用以下命令执行此操作:(源:运行时:如果goroutine退出#20395,终止锁定的OS线程):

syscall.Syscall(syscall.SYS_EXIT, 0, 0, 0)


 类似资料:
  • 我们有一个由2个节点a和B组成的集群。 如果我们在节点a上阻止线程的执行(我是通过远程连接到我的VM并放置断点来执行的),那么节点B认为节点a被分段(这是预期的行为)。 在执行上述场景后,节点A上的任何缓存查找都会被卡住,我们永远不会从IGniteCache中获得结果。 我已经编写了一个测试应用程序来重现这个问题。复制这个问题并不困难,但我已经尽力在readme.md中提供了指导 如果你仍然不清楚

  • 在下面的代码中,线程。activeCount()始终返回2,即使executor中的线程在5秒后终止。 我期望Thread.activeCount()在5秒后返回1。为什么它总是返回2?

  • 在其他语言中,此任务很简单,只需在Python中使用类似以下内容: 如果没有什么要处理的,我的程序也会想暂停执行。我不希望它用查询使数据库过载。 我正在尝试编写一个应用程序,它将充当后台队列处理器。它将检查数据库,看看队列中是否有任何需要处理的项目,然后该程序将数据写入磁盘上的文件。连接到同一数据库的不同系统的用户会间歇性地将数据添加到数据库中。 我认为永久npm模块不太合适,因为该模块只是检查脚

  • 问题内容: 在阅读了这样的问题之后,我有了一些疑问。请帮助理解。 调度涉及确定何时运行流程以及运行时间的多少。 linux内核是否调度线程或进程?由于内核中的进程和线程没有区别,调度程序如何对待它们? 如何确定每个线程的数量?一个。如果为一个进程确定了一个时间量(例如100us),是在该进程的所有线程之间共享该时间吗?或b。每个线程的数量由调度程序决定吗? 注意:问题1和问题2是相关的,可能看起来

  • 问题内容: 看起来我已经搞砸了Java线程/ OS线程和解释性语言。 在开始之前,我确实了解绿色线程是Java线程,其中JVM处理线程,并且整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上是没有用的。 现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运

  • 使用Ubuntu 13.10和运行节点v0.10.0。我正在使用pty.jsv0.2.4生成一个程序(需要在交互式环境中运行)。该程序是用C编写的,并分叉子进程本身。 我已经编写了一个非常精简的C程序版本(我称之为“forktest”),它具有产生此问题所需的最小值,并包含以下内容: 我还整理了一个最小节点脚本,用coffeescript(test.coffee)编写,它运行程序,如下所示: 运行