goroutine与线程的区别
goroutine与线程的区别
1、使用方面:
(1)goroutine比线程更加轻量级,可以轻松创建十万、百万,不用担心资源问题
(2)goroutine与channel搭配使用,能够更加方便的实现高并发
2、实现方面:
(1)从资源上讲
- 线程栈的内存大小一般固定为2MB
- goroutine栈内存是可变的,初始的时候一般为2KB,最大可以扩大到1GB
(2)从调度上讲
- 线程的调度由OS的内核完成
- goroutine调度由自身的调度器完成
goroutine与线程的联系:
(1)多个goroutine绑定在同一个线程上面,按照一定的调度算法执行
goroutine调度机制
三个基本概念:MPG
1、M
代表一个线程,所有的G(goroutine)任务最终都会在M上执行
2、P(Processor)
- 代表一个处理器,每个运行的M都必须绑定一个P。P的个数是GOMAXPOCS,最大为256,在程序启动时固
定,一般不去修改。
- GOMAXPOCS默认值是当前电脑的核心数,单核CPU就只能设置为1,如果设置>1,在GOMAXPOCS函数中
也会被修改为1。
- M和P的个数不一定一样多,M>=P,每一个P都会保存本地的G任务队列,另外还有一个全局的G任务队列。G
任务队列可以认为线程池中的线程队列。
3、G(Goroutine)
- 代表一个goroutine对象,每次go调用的时候都会创建一个G对象
goroutine调度流程
带了张图,便于理解
1、启动一个goroutine
也就是创建一个G对象,然后加入到本地队列或者全局队列中
2、查找是否有空闲的P
全站分卷索引 · 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的内存对齐