返回顶部
首页 > 资讯 > 精选 >Go语言怎么实现stop the world
  • 247
分享到

Go语言怎么实现stop the world

2023-06-16 14:06:15 247人浏览 独家记忆
摘要

本篇内容主要讲解“Go语言怎么实现stop the world”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言怎么实现stop the world”吧!停止世界(Stop the worl

本篇内容主要讲解“Go语言怎么实现stop the world”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言怎么实现stop the world”吧!

停止世界(Stop the world)

停止程序意味着停止所有正在运行的 goroutine。下面是一个执行 STW 的简单程序:

func main() {    runtime.GC() }

运行垃圾回收器,将触发 STW 两个阶段。

有关垃圾回收器周期的更多信息,建议阅读我的另外一篇文章 “Go:垃圾收集器如何标记内存? ① ”

抢占所有正在运行的 goroutine:

Go语言怎么实现stop the world

goroutine 抢占

一旦 goroutine 被抢占,它们将在安全点停止。同时,P 处理器将(正在运行的代码或在空闲列表)被标记为已停止,以不运行任何代码:

Go语言怎么实现stop the world

P 标记为已停止

然后,Go 调度程序将运行,将每个 M 与其 P 各自分离,并将其放入空闲列表中:

Go语言怎么实现stop the world

M 已移至闲置清单

关于在每个上运行的 goroutine M,它们将在全局队列中等待:

Go语言怎么实现stop the world

Goroutine 在全局队列中等待

然后,一旦世界停止了,只有唯一活动的 goroutine 才能安全地运行,并在工作完成后启动整个世界。下面跟踪图将有助于理解此阶段发生在何时:

Go语言怎么实现stop the world

跟踪 “ STW”阶段

系统调用

“STW”阶段也可能会影响系统调用,因为它们可能会在 STW 时返回。让我们以一个密集执行系统调用的例子,并查看其如何处理:

func main() {    var wg sync.WaitGroup    wg.Add(10)    for i := 0; i < 10; i++ {       go func() {          Http.Get(`https://httpstat.us/200`)          wg.Done()       }()    }    wg.Wait() }

这是跟踪:

Go语言怎么实现stop the world

STW 阶段,系统调用正在结束。但是,由于没有可用 P(如上一节所述,它们都被标记为已停止),goroutine  将被放入全局队列,并在世界恢复时稍后运行。

延迟时间

“STW” 第三步涉及将所有 M 与其 P 分离。但是,Go 将等待它们自行停止:在调度程序运行时,在 syscall 调用中等。等待 goroutine  被抢占应该很快,但是在某些情况下,可能会导致某些延迟。让我们以一个极端的情况为例:

func main() {    var t int    for i := 0;i < 20 ;i++  {       go func() {          for i := 0;i < 1000000000 ;i++ {             t++          }       }()    }     runtime.GC() }

在这里,“ Stop the World”阶段需要 2.6 秒:

Go语言怎么实现stop the world

到此,相信大家对“Go语言怎么实现stop the world”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Go语言怎么实现stop the world

本文链接: https://lsjlt.com/news/283913.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言怎么实现stop the world
    本篇内容主要讲解“Go语言怎么实现stop the world”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言怎么实现stop the world”吧!停止世界(Stop the worl...
    99+
    2023-06-16
  • c语言hello world怎么写
    在 c 语言中,编写 hello world 程序的步骤为:创建一个名为 hello.c 的源文件。包含必要的头文件 stdio.h。定义主函数 main。在 main 函数中使用 pr...
    99+
    2024-04-05
    sublime c语言
  • C语言Hello World实现的方法有哪些
    在C语言中,可以使用以下几种方法实现Hello World程序: 使用printf函数: #include int main...
    99+
    2023-10-24
    C语言
  • C语言怎么输出 "Hello, World!"
    这篇文章主要介绍了C语言怎么输出 "Hello, World!"的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言怎么输出 "Hello, World!"文章都会有所收...
    99+
    2023-06-17
  • 怎么用Go语言实现LRU Cache
    小编给大家分享一下怎么用Go语言实现LRU Cache,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1 基本概念LRU是一个老生常谈的问题,即最近最少使用,LRU是Least Recently Used的缩写,是...
    99+
    2023-06-29
  • go语言多线程怎么实现
    在Go语言中,可以使用goroutine来实现多线程。goroutine是Go语言中的轻量级线程,可以同时运行在一个操作系统线程上。...
    99+
    2023-10-21
    go语言
  • go语言堆排序怎么实现
    Go语言堆排序的实现步骤如下: 首先,定义一个用于进行堆调整的函数 adjustHeap,该函数接受三个参数:待调整的切片 arr...
    99+
    2023-10-22
    go语言
  • Go语言怎么实现JSON解析
    这篇文章主要介绍“Go语言怎么实现JSON解析”,在日常操作中,相信很多人在Go语言怎么实现JSON解析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言怎么实现JSON解析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • Go语言怎么实现CGO编程
    本文小编为大家详细介绍“Go语言怎么实现CGO编程”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言怎么实现CGO编程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。基于 C 标准库实现最简单的 CGO 程序...
    99+
    2023-07-05
  • 怎么使用Go语言实现Spark
    这篇文章主要介绍了怎么使用Go语言实现Spark的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Go语言实现Spark文章都会有所收获,下面我们一起来看看吧。为什么使用Go语言实现SparkGo语言的成长...
    99+
    2023-07-06
  • go语言怎么实现屏幕截图
    今天小编给大家分享一下go语言怎么实现屏幕截图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。借助第三方库安装go ...
    99+
    2023-06-30
  • go语言心跳超时怎么实现
    这篇文章主要介绍了go语言心跳超时怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言心跳超时怎么实现文章都会有所收获,下面我们一起来看看吧。一、背景本文描述的是客户端接收心跳信息的超时实现。心跳超时...
    99+
    2023-06-30
  • Go语言单例模式怎么实现
    这篇文章主要介绍“Go语言单例模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言单例模式怎么实现”文章能帮助大家解决问题。什么是单例模式单例模式指仅允许创建一个对象的设计模式。它通常...
    99+
    2023-07-05
  • go语言数组怎么实现队列
    在Go语言中,可以使用切片来实现队列。 首先,定义一个结构体来表示队列: type Queue struct { items...
    99+
    2024-02-29
    go语言
  • 怎么用Python实现Hello World
    这篇文章主要讲解了“怎么用Python实现Hello World”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python实现Hello World”吧!Python命令行假设你已经安...
    99+
    2023-06-01
  • Go语言实现的语言有哪些
    这篇文章主要讲解了“Go语言实现的语言有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言实现的语言有哪些”吧!01 Go+这是国内七牛老大许式伟主导的,对 Go 语言的扩展,专为数...
    99+
    2023-06-15
  • Go 语言中怎么实现凯撒加密
    今天就跟大家聊聊有关 Go 语言中怎么实现凯撒加密,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码清单 9-6 处理单个字符: caesar.go...
    99+
    2024-04-02
  • Go语言怎么实现RSA加密解密
    这篇文章将为大家详细讲解有关Go语言怎么实现RSA加密解密,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。go是什么golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标...
    99+
    2023-06-14
  • Go语言怎么实现Snowflake雪花算法
    这篇文章主要介绍了Go语言怎么实现Snowflake雪花算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。雪花算法雪花算法的原始版本是scala版,用于生成分布式ID(纯数字...
    99+
    2023-06-15
  • GO语言怎么实现协程池管理
    本篇内容介绍了“GO语言怎么实现协程池管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用channel实现协程池通过 Channel 实...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作