go的调度与go的gc

jun10ng jun10ng     2023-04-06     371

关键词:

go的调度 与 go 的GC

调度

首先golang的goroutine占用的资源非常小,默认size是2k,goroutine调度的切换也不用到内核层去完成,代价很低,所以go可以创建成千上万个goroutine。对于操作系统而言,go程序是一个用户层程序,对goroutine是不可见的,所以goroutine的调度要靠go自己来实现,也就是go runtime。

经过发展后,现在的Go调度器模型是GPM模型,算法是work stealing算法。

G就是goroutine,M指的是CPU,P是G和M之间的逻辑处理层,用来实现Go调度的伸展性。

对于G而言,它对应的P就是他的CPU,但是从调度角度来看,真正的CPU是M,这个关系有点像线程,进程,操作系统的关系。

Go是使用抢占调度的,go程序启动时,runtime会去启动一个叫sysmon的监控线程,他每20us到10毫秒启动一次,他会检查当前运行情况,比如超过2分钟没有垃圾回收,强制执行,向长时间运行的G发出抢占调度,收回长时间阻塞的P等。

Go的GC

GC算法有几种经典,比如引用计数,标记清扫,标记复制,分代回收,这些GC算法在JavaGC中也有。

Go的GC算法是基于标记GC的一个改进,叫做三色标记算法。

  1. 起初所有对象都是白色的
  2. 从根出发,扫描所有可达对象,标记为灰色,放入待处理队列
  3. 从队列中取出灰色对象,将其引用对象标记为灰色再放入队列,自身标记为灰色
  4. 重复3直到灰色对象为空,这个时候白色对象就是垃圾,回收白色对象。

这个过程有点像树遍历的层次遍历法和图的广度遍历

GC条件

在堆上分配大于32KB的对象时,进行检测,是否此时满足垃圾回收条件。

GC方式

自动检测GC和用户调用GC 监控函数数sysmon。

go语言——goroutine并发模型

参考技术A参考:Goroutine并发调度模型深度解析&手撸一个协程池Golang的goroutine是如何实现的?Golang-调度剖析【第二部分】OS线程初始栈为2MB。Go语言中,每个goroutine采用动态扩容方式,初始2KB,按需增长,最大1G。此外GC会收缩栈... 查看详情

go高阶:调度器gmp原理与调度全分析(代码片段)

目录Golang的协程调度器原理及GMP设计思想?一、Golang“调度器”的由来?(1)单进程时代不需要调度器(2)多进程/线程时代有了调度器需求(3)协程来提高CPU利用率(4)Go语言的协程goroutine(5)被废弃的goroutine调度器二、Goroutine调... 查看详情

《goinaction》读后记录:go的并发与并行

...数创建goroutine时,该函数将作为一个独立的工作单元,被调度器调度到可用的逻辑处理器上执行。Go的运行时调度器是个复杂的软件,它做的工作大致是:管理被创建的所有goroutine,为其分配执行时间将操作系统线程与语言运行... 查看详情

go切片与技巧(附图解)(代码片段)

你好,我是太白,今天和你聊聊Go语言的切片(Slice)以及它的一些技巧。如果觉得文章对你有帮助,记得点赞+收藏+关注+转发。谢谢!1前言2数组3切片的创建4切片操作5切片表达式1、简单的表达式2、扩展表达式6切片技巧CutCut(... 查看详情

go调度:第二部分-go调度器

前言这个博客是三部分中提供go调度器的语义和机制的部分.博客三部分的顺序:1) go调度:第一部分-操作系统调度2) go调度:第二部分-go调度器3) go调度:第三部分-并发 介绍在博客三部分中的第一部分,我解释了操作系... 查看详情

go语言之并发

...outine时,Go会将其视为一个独立的工作单元。这个单元会被调度到可用的逻辑处理器上执行。Go语言运行时的调度器是一个复杂的软件,这个调度器在操作系统之上。操作系统的线程与语言运行时的逻辑处理器绑定,并在逻辑处理器... 查看详情

Go和C++的指针区别,gc后指针会变吗?

】Go和C++的指针区别,gc后指针会变吗?【英文标题】:PointerdifferencebetweenGoandC++,willpointerchangeaftergc?【发布时间】:2019-10-0617:24:45【问题描述】:Go和C++中指针的工作方式有区别吗,gc后指针会改变吗?我想知道Go中指针和内存的... 查看详情

prometheus中自带的查询指标定义解析

...配字节总数go_memstats_buck_hash_sys_bytes:用于剖析桶散列表的堆空间字节go_memstats_frees_total:内存释放统计go_memstats_gc_cpu_fraction:垃圾回收占用服务CPU工作的时间总和go_memstats_gc_sys_bytes:圾回收标记元信息使用的内存字节go_memstats_hea... 查看详情

19.go语言基础之并发(代码片段)

...万个goroutine并发工作。goroutine是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是Go语言秉承的CSP(CommunicationSequentialProcess)并发模式的重要实现基... 查看详情

go中的特殊协程g0

...本文基于go1.13版本所有在Go中创建的goroutines都由一个内部调度程序的管理。Go调度程序试图给所有的goroutines分配运行时间,并且在当前goroutine被阻塞或终止情况下也能使CPU忙于运行其他goroutines。Go通过GOMAXPROCS变量来限制操作系... 查看详情

go语言并发(代码片段)

...成千上万个goroutine并发工作。goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是Go语言秉承 查看详情

go语言调度器之主动调度(20)(代码片段)

本文是《Go语言调度器源代码情景分析》系列的第20篇,也是第五章《主动调度》的第1小节。 Goroutine的主动调度是指当前正在运行的goroutine通过直接调用runtime.Gosched()函数暂时放弃运行而发生的调度。主动调度完全是用户代... 查看详情

go的内存回收机制(三色屏障)(代码片段)

...文垃圾回收(GarbageCollection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的内存对象,让出存储器资源。GC过程中无需程序员手动执行。GC机制在现代很多编程语言都支持,GC能力的性能与优劣... 查看详情

go的内存回收机制(三色屏障)(代码片段)

...文垃圾回收(GarbageCollection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的内存对象,让出存储器资源。GC过程中无需程序员手动执行。GC机制在现代很多编程语言都支持,GC能力的性能与优劣... 查看详情

go语言基础之并发(代码片段)

...个goroutine并发工作。goroutine是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是Go语言秉承的CSP(CommunicatingSequentialProcess)并发模式的重要实现基... 查看详情

goroutine与调度器

...且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。这个调度器的原理 查看详情

go语言打造分布式crontab轻松搞定高性能任务调度

第1章课程介绍本章中将介绍一下本课程的基本内容,包括:我们要做什么、要求什么基础、将学会哪些工具、收获哪些独家干货,以及课程具体安排。第2章如何执行shell命令执行"定时任务"其实就是执行"shell命令"。在本章中,... 查看详情

Go并发循环逻辑

...题描述】:我刚刚开始接触Go的并发性,并尝试创建一个调度go例程,该例程会将作业发送到在jobchan通道上侦听的工作池。如果一条消息通过dispatchchan通道进入我的调度函数并且我的其他go例程正忙,则该消息将附加到调度程序... 查看详情