Go 知识总结
基础
语言
数据类型
数据类型分为四类:基础类型、复合类型、引用类型和接口类型。
基础类型,包括:数字、字符串和布尔型
复合数据,类型——数组和结构体——是通过组合简单类型,来表达更加复杂的数据结构。
引用类型,包括指针、切片、字典、函数、通道
接口类型,是对其它类型行为的抽象和概括
Goroutine
进程:进程是系统进行资源分配的基本单位,有独立的内存空间。
线程:线程是 CPU 调度和分派的基本单位,线程依附于进程存在,每个线程会共享父进程的资源。
协程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制,协程间切换只需要保存任务的上下文,没有内核的开销。
Golang 的 goroutine 是如何实现的? - 知乎 https://www.zhihu.com/question/20862617
GPM 模型
Go 学习总结之 GPM 模型 - 知乎 https://zhuanlan.zhihu.com/p/261807834
G:Goroutine,每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数,可重用。G 并非执行体,每个 G 需要绑定到 P 才能被调度执行。
P: Processor,表示逻辑处理器,对 G 来说,P 相当于 CPU 核,G 只有绑定到 P 才能被调度。对 M 来说,P 提供了相关的执行环境(Context),如内存分配状态(mcache),任务队列(G)等。P 的数量决定了系统内最大可并行的 G 的数量(前提:物理 CPU 核数 >= P 的数量)。P 的数量由用户设置的 GoMAXPROCS 决定,但是不论 GoMAXPROCS 设置为多大,P 的数量最大为 256。
M: Machine,OS 内核线程抽象,代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取。M 的数量是不定的,由 Go Runtime 调整,为了防止创建过多 OS 线程导致系统调度不过来,目前默认最大限制为 10000 个。M 并不保留 G 状态,这是 G 可以跨 M 调度的基础。
Sched:Go 调度器,它维护有存储 M 和 G 的队列以及调度器的一些状态信息等。
调度器循环的机制大致是从各种队列、P 的本地队列中获取 G,切换到 G 的执行栈上并执行 G 的函数,调用 Goexit 做清理工作并回到 M,如此反复。
GC 的迭代
go1.1,提高效率和垃圾回收精确度。 标记-清除(mark and sweep)算法
go1.3,提高了垃圾回收的精确度。 go1.4,之前版本的runtime大部分是使用C写的,这个版本大量使用Go进行了重写,让GC有了扫描stack的能力,进一步提高了垃圾回收的精确度。 go1.5,目标是降低GC延迟, 采用了并发标记和并发清除,三色标记,write barrier,以及实现了更好的回收器调度,设计文档1,文档2,以及2015 版的Go talk。 三色标记——“强-弱” 三色不变式、插入屏障、删除屏障
go1.6,小优化,当程序使用大量内存时,GC暂停时间有所降低。 go1.7,小优化,当程序有大量空闲goroutine,stack大小波动比较大时,GC暂停时间有显著降低。 go1.8,write barrier切换到hybrid write barrier,以消除STW中的re-scan,把STW的最差情况降低到50us,设计文档。 三色标记——混合屏障
go1.9,提升指标比较多,(1)过去 runtime.GC, debug.SetGCPercent, 和 debug.FreeOSMemory都不能触发并发GC,他们触发的GC都是阻塞的,go1.9可以了,变成了在垃圾回收之前只阻塞调用GC的goroutine。(2)debug.SetGCPercent只在有必要的情况下才会触发GC。 go.1.10,小优化,加速了GC,程序应当运行更快一点点。 go1.12,显著提高了堆内存存在大碎片情况下的sweeping性能,能够降低GC后立即分配内存的延迟。 go1.13,着手解决向操作系统归还内存的,提出了新的 Scavenger go1.14,替代了仅存活了一个版本的 Scavenger,全新的页分配器,优化分配内存过程的速率与现有的扩展性问题,并引入了异步抢占,解决了由于密集循环导致的 STW 时间过长的问题 go gc垃圾回收——三色标记、混合写屏障 - 简书 https://www.jianshu.com/p/ff3d6da5d71a
golang gc| go语言gc详解 - 知乎 https://zhuanlan.zhihu.com/p/115143370
Slice
数组和切片的区别