编辑
2023-12-04
后端
00

Go语言的CSP(Communicating Sequential Processes)并发模型是一种并发编程模型,它基于通信来实现并发控制,而不是共享内存。这个模型的核心思想是通过通信来共享内存,而不是通过共享内存来通信。Go语言通过goroutine和channel来实现CSP模型。

  1. Goroutine(协程):
    • Goroutine是Go语言中的轻量级线程,它可以在并发执行的实体之间进行切换。
    • Goroutine可以看作是并发执行的实体,它可以独立执行一段代码,拥有自己的栈空间。
    • Goroutine之间的切换是由Go语言的调度器自动完成的,开发者无需关心具体的调度细节。
编辑
2023-12-04
后端
00

Go Channel底层原理及源码解析

Channel是Go语言中用于协程之间通信的重要机制。它的底层实现原理相对简单,通过分析源码可以更好地理解其工作原理。

go
type hchan struct { //channel分为无缓冲和有缓冲两种。 //对于有缓冲的channel存储数据,借助的是如下循环数组的结构 qcount uint // 循环数组中的元素数量 dataqsiz uint // 循环数组的长度 buf unsafe.Pointer // 指向底层循环数组的指针 elemsize uint16 //能够收发元素的大小 closed uint32 //channel是否关闭的标志 elemtype *_type //channel中的元素类型 //有缓冲channel内的缓冲数组会被作为一个“环型”来使用。 //当下标超过数组容量后会回到第一个位置,所以需要有两个字段记录当前读和写的下标位置 sendx uint // 下一次发送数据的下标位置 recvx uint // 下一次读取数据的下标位置 //当循环数组中没有数据时,收到了接收请求,那么接收数据的变量地址将会写入读等待队列 //当循环数组中数据已满时,收到了发送请求,那么发送数据的变量地址将写入写等待队列 recvq waitq // 读等待队列 sendq waitq // 写等待队列 lock mutex //互斥锁,保证读写channel时不存在并发竞争问题 }

image.png

  1. Channel的基本概念

编辑
2023-12-04
后端
00

Go协程调度模型是通过GMP模型来实现的。GMP模型由三个组件组成:Goroutine(G)、Mac

编辑
2023-12-04
后端
00

Go Runtime 和 Go 应用之间的关系以及 Runtime 是如何被编译到二进制的

Go

编辑
2023-12-04
后端
00

Golang的垃圾回收(GC)机制是一种自动管理内存的机制,它负责回收不再使用的对象和内存空间,以确保程序的内存使用效率和稳定性。Golang的GC机制使用的是无分代、不整理、并发的三色标记清扫算法。

三色标记清扫算法

Golang的GC机制使用了三色标记清扫算法来进行垃圾回收。这个算法将对象分为三个颜色:白色、灰色和黑色。