初始化中主要对命令行参数整理,环境变量设置,以及内存分配器,垃圾回收器,并发调度器的工作现场准备
基本概念
- 传统并发使用的是:
多线程共享内存
,go 使用的是CSP
(communicating sequential processes)并发模型,以通信的方式来共享内存.
go 中使用GPM方式来实现CSP,每个M关联一个P,goroutine关联哪个P是无法控制的,P中维护了一个goroutin的列表,并用循环的方式取出一个G来关联上P来执行程序.
// The main concepts are:
// G - goroutine.
// M - worker thread, or machine.
// P - processor, a resource that is required to execute Go code.
// M must have an associated P to execute Go code, however it can be
// blocked or in a syscall w/o an associated P.
入口
随便写个demo debug,调用栈如下
main.main at main.go:15
runtime.main at proc.go:203
runtime.goexit at asm_amd64.s:1357
- Async stack trace
runtime.rt0_go at asm_amd64.s:220
即go进程先启动runtime.main,然后才执行main.main
然后就可以新建一个G和M 开始运行程序.
在runtime/asm_amd64.s