goroutine在什么情况下会被挂起呢?
3、由这个刚创建的M循环执行能找到的G任务
4、G任务执行的循序
先从本地队列找,本地没有找到就从全局队列找,如果还没有找到
就去其他P中找
5、所有的G任务的执行是按照go的调用顺序执行的
6、如果一个系统调用或者G任务执行的时间太长,就会一直占用这个线程
(1)在启动的时候,会专门创建一个线程sysmon,用来监控和管理,在内部挨个循环
(2)sysmon主要执行任务(中断G任务)
- 记录所有P的G任务并用schedtick变量计数,该变量在每执行一个G任务之后递增
- 如果schedtick一直没有递增,说明这个P一直在执行同一个任务
- 如果持续超过10ms,就在这个G任务的栈信息加一个标记
- G任务在执行的时候,会检查这个标记,然后中断自己,把自己添加到队列的末尾,执行下一个G
(3)G任务的恢复
- 中断的时候将寄存器中栈的信息保存到自己G对象里面
- 当两次轮到自己执行的时候,将自己保存的栈信息复制到寄存器里面,这样就可以接着上一次运行
goroutine是按照抢占式进行调度的,一个goroutine最多执行10ms就会换下一个
goroutine在什么情况下会被挂起呢?
goroutine被挂起也就是调度器重新发起调度更换P来执行时
在channel堵塞的时候;
在垃圾回收的时候;
sleep休眠;
锁等待;
抢占;
IO阻塞;
主goroutine与其他goroutine有什么不同
类似于一个进程总会有一个主线程,每一个独立的go程序在运行时也总会有一个主goroutine,主goroutine是自动启用而不需要手动操作的,每条go语句(启用一个goroutine的语句)一般都会携带一个函数调用,这个调用的函
数被称为go函数,而主goroutine的go函数就是作为程序入口的main函数
从main函数的角度来理解主goroutine,则主goroutine就是程序运行的主程序,其他goroutine执行的程序是被异步调用的,同时主goroutine的结束也就意味着整个进程的结束。
扩展
全站分卷索引 · 29 卷
- 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
- 2Go string 和 []byte 的区别
- 3数组和切片的区别
- 4扩容前后的Slice是一样的吗
- 5Go语言map是有序的还是无序的, 为什么
- 6go里面的map是并发安全的吗?如何并发安全
- 7Go 的错误处理和 Java 的异常处理对比
- 8介绍一下panic和recover
- 9什么是defer?有什么作用
- 10Go并发
- 11进程、线程的区别
- 12什么是go runtine
- 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
- 14什么是互斥锁(mutex)?在什么情况下会用到它们?
- 15Mutex有几种模式
- 16goroutine什么情况会发生内存泄漏?如何避免。
- 17Go语言中GC的流程是什么
- 18Go 中的内存逃逸现象是什么?
- 19CAP 理论,为什么不能同时满足
- 20说一下 Gin 的路由怎么实现的
- 21简述slice的底层原理,和数组的区别是什么
- 22defer底层原理
- 23侵入式和非侵入式的区别
- 24goroutine与线程的区别
- 25goroutine在什么情况下会被挂起呢?
- 26GC(垃圾回收)原理 1.5版本
- 27简述Go的垃圾回收机制
- 28协程优势及其通信方式
- 29Go的内存对齐