# go程序编译过程
- 编译
- 文本到文件
- 链接
linux可执行文件
- ELF header
- Sectuib header
- Sesctions
# go进程的启动与初始化
golang是一种有runtime的语言,runtime的组成
- Scheduelr GMP后台执行的调度循环
- Netpoll 网络相关时间的读写等
- Memory 内存分配
- Garbage 回收垃圾内存
- entry point找到程序入口
go func() {
println(123)
}()
1
2
3
2
3
这段代码其实是想runtime提交了一个计算任务
- 调度流程本身就是一个生产-消费流程
- 各类线程执行执行调度循环(尝试获取任务)
- 空闲的线程,进入空闲线程队列,没有可用线程进空闲线程里面找
# 生产端逻辑
队列(优先级 高中低)
runnext, 每个p上一个,局部性原理(长度为1队列)
local run queue(类数组, max is 256)
golobal run queue(链表,大小无线)
goroutine创建步骤
- 分配内存等。。。。
- 插入到队列
- 放到runnext,非空后续执行
- 如果runnext有值,将其踢给local
- 如果local满,拿走local一半外加被踢走的G,放到global队列
# 消费端逻辑
- 多个线程反复执行一个循环从队列里免拿值
- schedule-> runtime.execute -> runtime.gogo -> runtime.goexit -><