golang程序运行分析

golang程序启动运行:

G(名称):

G代表的是goroutine。开启一个goroutine实际就是实例化一个G

M(名称) :

M代表的是Machine。M中存放go程序和机器CPU交互的数据结构

比如一个双核CPU,在主routine外开启了4个goroutine,那么实际上就有2个M结构,6个G结构(1个是主routine,4个开启的routine,最后一个是闲置的routine)

runtime和C标准库起的作用是一样的。都是为了语言的跨平台性。runtime可以运行在Windows和Unix平台,可以运行在Intel或ARM处理器上。

golang程序运行分析_第1张图片

一个go程序都附带一个Runtime,runtime负责与底层操作系统交互。

启动流程

回到$goroot/pkg/runtime/proc.c
里面这么个注释:
// The bootstrap sequence is:
//
// call osinit
// call schedinit
// make & queue new G
// call runtime·mstart
//
// The new G calls runtime·main.

明确告诉我们go程序的启动流程是:

1 调用osinit,操作系统级别的初始化

2 调用runtime·schedinit

在这个函数内做了许多预操作

获取程序运行参数

获取程序环境变量

(主要是有一个环境变量GOMAXPROCS,你可以使用runtime.GOMAXPROCS(int) 或者直接设置环境变量$GOMAXPROCS改变程序使用的CPU数量)

3 调用runtime·mstart启动M

4 调用runtime·main

在runtime.main中有这么两行:

main·init(); //调用main包中的init函数

main·main(); //调用main包中的main函数

用gdb调试看trace看到调用栈

clip_image002[4]

关于启动流程推荐一下这篇文章:http://www.cnblogs.com/genius0101/archive/2012/04/16/2447147.html


你可能感兴趣的:(golang程序运行分析)