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

Goroutines切换时,CPU上下文会发生什么?

郁鸿博
2023-03-14
问题内容

如果我正确理解goroutine在系统线程之上的工作方式,那么它们将从队列中逐一运行。但这是否意味着每个goroutine都会将其上下文加载/卸载到CPU?如果是,系统线程和goroutines之间有什么区别?

最重要的问题是上下文切换的时间成本。这是正确的吗?

检测哪种goroutine请求哪些数据的基础是什么?例如:我正在从goroutine
A向DB发送请求,并且不等待响应,并且同时切换到下一个goroutine。系统如何理解请求来自A而不是来自B或C?


问题答案:

Goroutine,内存和OS线程

Go具有可根据需要增长的分段堆栈。运行时执行调度,而不是操作系统。运行时将goroutine复用到相对较少的实际OS线程上。

Goroutines切换成本

Goroutine是协同调度的,当发生切换时,仅需要保存/恢复3个寄存器-
程序计数器,堆栈指针和DX。从操作系统的角度来看,Go程序的行为就像一个事件驱动程序。

Goroutine和CPU

您不能直接控制运行时将创建的线程数。可以通过调用来设置变量GOMAXPROCS来设置程序使用的处理器内核数量runtime.GOMAXPROCS(n)

程序计数器

和一个完全不同的故事

在计算中,程序是计算机要执行的一组特定的有序操作。指令是由程序赋予计算机处理器的命令。在计算机内,地址是内存或存储中的特定位置。程序计数器寄存器是处理器使用的一小部分数据存放位置之一。

这是关于程序如何工作以及如何相互通信的另一个故事,它与goroutine主题没有直接关系。

资料来源:

  • http://blog.nindalf.com/how-goroutines-work/
  • https://gobyexample.com/goroutines
  • http://tleyden.github.io/blog/2014/10/30/goroutines-vs-threads/
  • http://whatis.techtarget.com/definition/program-counter


 类似资料:
  • 什么是 CPU 上下文 Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。

  • 本文向大家介绍什么是上下文切换?相关面试题,主要包含被问及什么是上下文切换?时的应答技巧和注意事项,需要的朋友参考一下 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文

  • 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。 概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时

  • 问题内容: 我看过的shell脚本包括如下一行: 我知道这会导致执行的内容,但是意义何在? 后续问题:可以源任何脚本,还是仅源某些类型的脚本?脚本的来源(与正常执行相反)是否有除环境变量以外的其他副作用? 问题答案: 在脚本上运行命令会在当前进程的上下文中执行脚本。这意味着由脚本设置的环境变量在完成运行后仍然可用。这与正常运行脚本相反,在正常情况下,脚本退出后,新生成的进程中设置的环境变量将丢失。

  • 我在yarn cluster上运行的spark应用程序崩溃了,我正在试图确定根本原因。在我使用从yarn获得的日志中,我看到在块获取期间有一大堆连接被拒绝,还有一个内存不足错误。很难说出根本原因是什么。我的问题是当容器因为OutOfMemory异常而被杀死时会发生什么。因此,在容器日志中,我看到这是如何在容器上启动执行器的 我还看到许多。在应用程序崩溃之前,似乎有多个这样的问题。spark重试一个

  • 如何修复此行为?谢谢你。