← 返回目录

goroutine与线程的区别

第 24 / 29 卷日期:

goroutine与线程的区别

1、使用方面:

(1)goroutine比线程更加轻量级,可以轻松创建十万、百万,不用担心资源问题

(2)goroutine与channel搭配使用,能够更加方便的实现高并发

2、实现方面:

(1)从资源上讲

  1. 线程栈的内存大小一般固定为2MB
  2. goroutine栈内存是可变的,初始的时候一般为2KB,最大可以扩大到1GB

(2)从调度上讲

  1. 线程的调度由OS的内核完成
  2. goroutine调度由自身的调度器完成

goroutine与线程的联系:

(1)多个goroutine绑定在同一个线程上面,按照一定的调度算法执行

goroutine调度机制

三个基本概念:MPG

1、M

代表一个线程,所有的G(goroutine)任务最终都会在M上执行

2、P(Processor)

  1. 代表一个处理器,每个运行的M都必须绑定一个P。P的个数是GOMAXPOCS,最大为256,在程序启动时固

定,一般不去修改。

  1. GOMAXPOCS默认值是当前电脑的核心数,单核CPU就只能设置为1,如果设置>1,在GOMAXPOCS函数中

也会被修改为1。

  1. M和P的个数不一定一样多,M>=P,每一个P都会保存本地的G任务队列,另外还有一个全局的G任务队列。G

任务队列可以认为线程池中的线程队列。

3、G(Goroutine)

  1. 代表一个goroutine对象,每次go调用的时候都会创建一个G对象

goroutine调度流程

带了张图,便于理解

1、启动一个goroutine

也就是创建一个G对象,然后加入到本地队列或者全局队列中

2、查找是否有空闲的P

全站分卷索引 · 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的内存对齐