「24」GPM newm函数
上节看了go的入口函数,,,也就是你执行main函数前后所做的准备工作。
继续深入学习。「newm」第一个M,到底是怎么来的?
go version: 1.14.3
¶入口
先看下主体,主要在M创建的过程中,干了what,,,,,「PS : 关键看值得学习的点」
1 | // Create a new m. It will start off with a call to fn, or else the scheduler. |
¶newm1
go to 「newm1」
看起来很简短
1 | func newm1(mp *m) { |
¶newosproc
M创建之前,系统的操作和相关地址的变化
1 | // May run with m.p==nil, so write barriers are not allowed. |
¶pthread_attr_init细节
汇编代码:
1 | TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0 |
¶pthread_attr_getstacksize细节
1 | TEXT runtime·pthread_attr_getstacksize_trampoline(SB),NOSPLIT,$0 |
¶sigprocmask_trampoline细节
1 | TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0 |
¶pthread_create细节
1 | // mstart_stub is the first function executed on a new thread started by pthread_create. |
¶execLock.rlock()
1 |
|
¶acquirem()
加锁获取M
1 | //go:nosplit |
¶notesleep()
比较有趣的是sleep是用队列实现,前后加锁
1 | func notesleep(n *note) { |
¶execLock.runlock()
1 |
|
¶releasem
1 | //go:nosplit |
先分析到这儿吧…关于这一节的流程图,会整理出来的,,,,
不然就白分析这么多了,及时学习,及时总结。
晚安😴…