Go runtime 调度器精讲(一):Go 程序初始化

前言 本系列将介绍 Go runtime 调度器。要学好 Go 语言,runtime 运行时是绕不过去的,它相当于一层“操作系统”对我们的程序做“各种类型”的处理。其中,调度器作为运行时的核心,是必须要了解的内容。本系列会结合 Go plan9 汇编,深入到 runtime 调度器的源码层面去看程序运行时,goroutine 协程创建等各种场景下 runtime 调度器是如何工作的。 ...

2024-09-11 · xhy

Go plan9 汇编:内存对齐和递归

前言 在 Go plan9 汇编系列文章中,介绍了函数和函数栈的调用。这里继续看内存对齐和递归调用方面的内容。 内存对齐 直接上示例: 1type temp struct { 2 a bool 3 b int16 4 c []string 5} 6 7func main() { 8 var t = temp{a: true, b: 1, c: []string{}} 9 fmt.Println(unsafe.Sizeof(t)) 10} 输出: ...

2024-09-02 · xhy

Go plan9 汇编:说透函数栈

前言 函数是 Go 的一级公民,本文从汇编角度出发看看我们常用的一些函数在干什么。 函数 main 函数 在 main 函数中计算两数之和如下: 1package main 2 3func main() { 4 x, y := 1, 2 5 z := x + y 6 print(z) 7} 使用 dlv 调试函数(不了解 dlv 的请看 Go plan9 汇编: 打通应用到底层的任督二脉): ...

2024-09-02 · xhy

Go plan9 汇编:手写汇编

前言 在 Go plan9 汇编: 打通应用到底层的任督二脉 一文中介绍了从应用程序到汇编指令的转换。本文将结合汇编和 Go 程序实现手写基本的汇编指令,以加深对 Go plan9 汇编的了解。 ...

2024-09-01 · xhy

Go plan9 汇编: 打通应用到底层的任督二脉

前言 作为一个严肃的 Gopher,了解汇编是必须的。本汇编系列文章会围绕基本的 Go 程序介绍汇编的基础知识。 Go 程序到汇编 首先看一个简单到令人发指的示例: ...

2024-08-31 · xhy

Go 互斥锁 Mutex 源码分析(二)

前言 在 Go 互斥锁 Mutex 源码分析(一) 一文中分析了互斥锁的结构和基本的抢占互斥锁的场景。在学习锁的过程中,看的不少文章是基于锁的状态解释的,个人经验来看,从锁的状态出发容易陷入细节,了解锁的状态转换过一段时间就忘,难以做到真正的理解。想来是用静态的方法分析动态的问题导致的。在实践中发现结合场景分析互斥锁对笔者来说更加清晰,因此有了 Go 互斥锁 Mutex 源码分析(一),本文接着结合不同场景分析互斥锁。 ...

2024-08-24 · xhy

Go 互斥锁 Mutex 源码分析(一)

前言 锁作为并发编程中的关键一环,是应该要深入掌握的。 锁 示例 实现锁很简单,示例如下: 1var global int 2 3func main() { 4 var mu sync.Mutex 5 var wg sync.WaitGroup 6 7 for i := 0; i < 2; i++ { 8 wg.Add(1) 9 go func(i int) { 10 defer wg.Done() 11 mu.Lock() 12 global++ 13 mu.Unlock() 14 }(i) 15 } 16 17 wg.Wait() 18 fmt.Println(global) 19} 输出: ...

2024-08-23 · xhy