go gmp --- goroutine创建源码newproc()分析

本文深入剖析Go语言中goroutine的创建过程,通过一个简单示例展示如何使用go关键字启动goroutine,并详细解读newproc()函数的汇编代码。在newproc()中,利用系统调用来在g0栈上创建goroutine,并确保其在运行结束后能正确回收资源。最后,文章提供了一个整体流程图以帮助读者理解goroutine的生命周期。
摘要由CSDN通过智能技术生成

之前我们已经了解了GMP的基础知识,对G、M、P各自的职责和分工都有了大致的认识,本篇文章主要是介绍一个goroutine是怎么被创建出来的

从一个简单的例子开始

func TestNewGoroutine(t *testing.T) {
   
	go func() {
   
		sayHello()
	}()
}

func sayHello() {
   
	println("hello gmp")
}

编译文件 go tool compile -N -l -S new_goroutine_test.go得到汇编代码

"".TestNewGoroutine STEXT size=71 args=0x8 locals=0x18
        0x0000 00000 (new_goroutine_test.go:5)  TEXT    "".TestNewGoroutine(SB), ABIInternal, $24-8
        0x0000 00000 (new_goroutine_test.go:5)  MOVQ    (TLS), CX
        0x0009 00009 (new_goroutine_test.go:5)  CMPQ    SP, 16(CX)
        0x000d 00013 (new_goroutine_test.go:5)  PCDATA  $0, $-2
        0x000d 00013 (new_goroutine_test.go:5)  JLS     64
        0x000f 00015 (new_goroutine_test.go:5)  PCDATA  $0, $-1
        0x000f 00015 (new_goroutine_test.go:5)  SUBQ    $24, SP
        0x0013 00019 (new_goroutine_test.go:5)  MOVQ    BP, 16(SP)
        0x0018 00024 (new_goroutine_test.go:5)  LEAQ    16(SP), BP
        0x001d 00029 (new_goroutine_test.go:5)  FUNCDATA        $0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
        0x001d 00029 (new_goroutine_test.go:5)  FUNCDATA        $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x001d 00029 (new_goroutine_test.go:6)  MOVL    $0, (SP)
        0x0024 00036 (new_goroutine_test.go:6)  LEAQ    "".TestNewGoroutine
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值