- go在执行main包中的main函数之前肯定是需要做一些准备工作的,这些工作包括:设置好本地线程存储,设置好main函数的参数,设置线程的数量,初始化调度器和内存的管理等。
- sysmon后台任务,主要处理两个时间:对于网络的epoll以及抢占式调度的检测;它是由newm函数创建一个新的物理线程运行sysmon函数,所以他的优先级是非常高的,整个函数是一个死循环。sysmon会根据系统的繁忙程度睡眠一段时间,然后每10ms进行一次epoll并唤醒相应的goroutine。同时会检测是否有p长时间处于psyscall状态和prunning状态,并进行抢占式调度
for(;;) { runtime.usleep(delay); if(lastpoll != 0 && lastpoll + 10*1000*1000 > now) { runtime.netpoll(); } retake(now); // 根据每个P的状态和运行时间决定是否要进行抢占 }
-
scavenger任务:作用是将一些不在使用的内存归还给操作系统,go语言是一门垃圾回收的语言,垃圾回收是在系统运行过程中被触发的,内存会被归还到go的内存管理系统中,go的内存管理是基于内存池进行复用的,而这个函数是真正的将内存归还给系统,他是创建一个协程来执行的,所有优先级没有sysmon高
2021-03-31 go语言初始化过程
最新推荐文章于 2024-04-24 21:27:52 发布