go goroutine调度

记录下对goroutine的理解,看了一些go的源码,goroutine并不能被称协程,它是可以管理多线程的,

先解释下面图中GPM模型
G(G1,G2 …) : 当前的任务(当前排队中的任务)
M: 对应操作系统层面的线程
P: 可以定义P的数量,每个P对应管理着一个M

先不管goroutine是从哪里来的,现在权当它是被go func(第二个goroutine,或者第n个)显示调用来的,
1.生成一个任务
2.它可能是G…Gn,正在执行,或者在排队
3.它被执行时,P把G给到M,再由M执行

任务分配不均时,P会自动去全局队列获取一部分的G,此时其它P发现自己的G比全局队列的多时,会把自己的G再分一部分到全局队列

在这里插入图片描述

接下来找一找第一个g0是怎么来的,
${GOROOT}/src/asm_amd64.c

TEXT runtime·rt0_go(SB),NOSPLIT,$0
	// copy arguments forward on an even stack
	MOVQ	DI, AX		// argc
	MOVQ	SI, BX		// argv
	SUBQ	$(4*8+7), SP		// 2args 2auto
	ANDQ	$~15, SP
	MOVQ	AX, 16(SP)
	MOVQ	BX, 24(SP)

	// create istack out of the given (operating system) stack.
	// _cgo_init may update stackguard.
	MOVQ	$runtime·g0(SB), DI

    .....
    
    MOVQ	$runtime·mainPC(SB), AX		// entry
	PUSHQ	AX
	PUSHQ	$0			// arg size
	CALL	runtime·newproc(SB)
	POPQ	AX
	POPQ	AX

	// start this M
	CALL	runtime·mstart(SB)

g0生成先准备工作,初始化内存管理,拉圾回收,再根据参数生成go调度器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值