← 返回目录

goroutine在什么情况下会被挂起呢?

第 25 / 29 卷日期:

3、由这个刚创建的M循环执行能找到的G任务

4、G任务执行的循序

先从本地队列找,本地没有找到就从全局队列找,如果还没有找到

就去其他P中找

5、所有的G任务的执行是按照go的调用顺序执行的

6、如果一个系统调用或者G任务执行的时间太长,就会一直占用这个线程

(1)在启动的时候,会专门创建一个线程sysmon,用来监控和管理,在内部挨个循环

(2)sysmon主要执行任务(中断G任务)

  1. 记录所有P的G任务并用schedtick变量计数,该变量在每执行一个G任务之后递增
  2. 如果schedtick一直没有递增,说明这个P一直在执行同一个任务
  3. 如果持续超过10ms,就在这个G任务的栈信息加一个标记
  4. G任务在执行的时候,会检查这个标记,然后中断自己,把自己添加到队列的末尾,执行下一个G

(3)G任务的恢复

  1. 中断的时候将寄存器中栈的信息保存到自己G对象里面
  2. 当两次轮到自己执行的时候,将自己保存的栈信息复制到寄存器里面,这样就可以接着上一次运行

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. 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
  2. 2Go string 和 []byte 的区别
  3. 3数组和切片的区别
  4. 4扩容前后的Slice是一样的吗
  5. 5Go语言map是有序的还是无序的, 为什么
  6. 6go里面的map是并发安全的吗?如何并发安全
  7. 7Go 的错误处理和 Java 的异常处理对比
  8. 8介绍一下panic和recover
  9. 9什么是defer?有什么作用
  10. 10Go并发
  11. 11进程、线程的区别
  12. 12什么是go runtine
  13. 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
  14. 14什么是互斥锁(mutex)?在什么情况下会用到它们?
  15. 15Mutex有几种模式
  16. 16goroutine什么情况会发生内存泄漏?如何避免。
  17. 17Go语言中GC的流程是什么
  18. 18Go 中的内存逃逸现象是什么?
  19. 19CAP 理论,为什么不能同时满足
  20. 20说一下 Gin 的路由怎么实现的
  21. 21简述slice的底层原理,和数组的区别是什么
  22. 22defer底层原理
  23. 23侵入式和非侵入式的区别
  24. 24goroutine与线程的区别
  25. 25goroutine在什么情况下会被挂起呢?
  26. 26GC(垃圾回收)原理 1.5版本
  27. 27简述Go的垃圾回收机制
  28. 28协程优势及其通信方式
  29. 29Go的内存对齐