文章目录
一个Hello World程序的执行
注:本文以Go SDK v1.14进行讲解
程序入口是汇编实现的,主要任务是程序初始化,根据源码中的注释,程序启动的主要步骤如下:
1.调用osinit()获取CPU核数与内存页大小;
2.执行schedinit()初始化调度器,创建指定个数的P,并建立m0与P的关联;
3.以runtime.main为执行入口创建goroutine,也就是main goroutine;
4.mstart开启调度循环,此时等待队列里只有main goroutine等待执行;
5.main goroutine得到调度,开始执行runtime.main;
6.runtime.main会调用main.main,开始执行我们编写的内容。main.main返回后,会调用exit函数结束进程。
简单来说,一个HelloWorld程序就是这样执行的,已经了解的同学,可以去吃月饼啦,咱们就此别过图片
留下来的同学,咱们继续~
下面我们把这个故事丰富一下,增加一些细节_
var x,y int
go func(){
x = 1
fmt.Println("y:",y," ")
}
go func(){
y = 1
fmt.Println("x:",x," ")
}
所谓内存屏障,就是防止因为CPU指令重排,导致上面的代码出现如下意料之外的输出:
x:0 y:0
y:0 x:0
前方高能预警!!!
即将进入一个很重要的函数!!!
不要淹没在细节中,
关键环节以后咱会细聊,
所以,Take it easy!!!图片