Go 调度器(三):GMP高效调度的核心机制
基本思路: work stealing(任务窃取)机制:详解该机制的实现,如何提高cpu利用率的 hand off(切换移交)机制:详解该机制的实现,如何避免线程阻塞导致资源限制的 协作式抢占:详解gmp模型的调度时机 1. 程序的启动 启动阶段由 runtime·rt0_go(核心启动函数) 汇编函数调用,调用顺序为: runtime·osinit:获取系统信...
基本思路: work stealing(任务窃取)机制:详解该机制的实现,如何提高cpu利用率的 hand off(切换移交)机制:详解该机制的实现,如何避免线程阻塞导致资源限制的 协作式抢占:详解gmp模型的调度时机 1. 程序的启动 启动阶段由 runtime·rt0_go(核心启动函数) 汇编函数调用,调用顺序为: runtime·osinit:获取系统信...
工作线程的执行流程与调度循环 注:以下所有源码都是基于go1.23.1 1. GMP调度器的初始化 启动阶段由 runtime·rt0_go(核心启动函数) 汇编函数调用,调用顺序为: runtime·osinit:获取系统信息(如CPU核心数) runtime·schedinit:初始化调度器。 runtime·newproc:创建主Goroutine(执行 ...
大致学习框架 goroutine的调度方式 — GMP模型 goroutine的通信方式 — channel机制 goroutine的内存管理 select的特性、优先级问题、如何优雅的关闭goroutine 工具分析(pprof、trace) — goroutine堆栈、协程阻塞、锁 GC与goroutine的关系,哪些情况下会触发GC goroutine ...
GC 基本概念 垃圾回收 一种内存管理策略,由垃圾收集器以类似守护协程的方式在后台运作,按照既定的策略为用户回收那些不再被使用的对象,释放对应的内存空间。 时停(STW, Stop The World) 在GC的过程中,Runtime或多或少地需要暂停所有运行中的CPU指令,避免回收到目前正在使用的内存,或者说产生悬挂指针(指针指向已被回收的地址), 虽然有各种机制减少STW的次数...
context context的主要作用是在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制;同时兼备数据存储功能; 注:以下所有源码都是基于go1.23.1 1 核心数据结构 1.1 context.Context type Context interface { Deadline() (deadline time.Time, ok bool) /...
channel channel是go的并发原语之一,也是基于CSP的思想实现的,强调 goroutine 通过 Channel 传递数据而非直接操作共享内存。 该设计理念旨在通过提供一个安全、高效、灵活的通信机制,消除数据竞争风险,简化并发逻辑。 go version go 1.23.1 channel数据结构 源码位置:src/runtime/chan.go ...
map 1 数据结构 type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer oldbuckets unsafe.Pointer nevacuate uintptr ...
slice 切片 Golang中的切片是类似于数组结构的,不过数组是定长的,切片是动态的,也被称为动态数组(其长度不固定,可以向切片中追加元素,还支持动态扩容的能力);其实切片的底层数据结构就是数组; 1 数据结构 type slice struct { array unsafe.Pointer // 元素指针(指向起点) len int // 长度 cap ...