zoukankan      html  css  js  c++  java
  • go的调度 与 go 的GC

    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。

  • 相关阅读:
    Http option 请求是怎么回事
    Azure中配置和发布 Nginx docker到互联网
    Antdesign Form 实现页面控件的赋值加载
    windows下搭建spark+python 开发环境
    Python 使用有道翻译
    Docker安装
    Servlet使用注解配置URl提示404错误
    PowerShell自定义函数定义及调用
    使用代理实现对C# list distinct操作
    Asp.net 按钮幕布遮盖效果实现方式
  • 原文地址:https://www.cnblogs.com/Jun10ng/p/12616268.html
Copyright © 2011-2022 走看看