golang 源码剖析(1): 运行初始化和包初始化

本文深入探讨Golang的初始化过程,包括基本概念如GPM模型,程序入口从`runtime.main`开始,逐步进行包初始化。解析源码揭示包init流程,按依赖关系和字母顺序执行,并防止循环依赖。
摘要由CSDN通过智能技术生成

初始化中主要对命令行参数整理,环境变量设置,以及内存分配器,垃圾回收器,并发调度器的工作现场准备

基本概念

  • 传统并发使用的是:多线程共享内存,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值