go-GMP-牛翰网

go-GMP

go的协程和线程都绕不过GMP,关于GMP基本的工作流程,有go开发经验的大致都懂,这边更多关注GMP如何解决一些类似 协程饥渴的问题,以及底层的大致实现原理。 多线程循环 上篇讲了单线程是如何循...
9个月前
03914
go锁基础 - atomic、sema-牛翰网

go锁基础 – atomic、sema

atomic和sema是实现go中锁的基础,简单看下他们的实现原理。 atomic atomic 常用来作为保证原子性的操作。 当多个协程,同时一个数据进行操作时候,如果不加锁,最终的很难得到想要的结果。 var...
9个月前
04214
go gc-牛翰网

go gc

垃圾回收 (Garbage Collecting)思路 1. "标记-清除〞 go的做法 2. "标记-整理〞 标记后删除, 删除后重新把内存空间整理 java 早期 3. "标记 - 复制〞 两块相似的内存, 直接把有...
9个月前
03414
go channel-牛翰网

go channel

模型 三部分组成: 发送等待队列 接收等待队列 管道 缓存区 定义 在 runtime 的chan.go中 type hchan struct { qcount uint dataqsiz uint buf unsafe.Pointer elemsize uint16 elemtype *_type
9个月前
13813
go 内存管理-牛翰网

go 内存管理

协程栈 go 栈的位置 1. Go 协程栈位于 Go-堆内存上 2. Go 堆内存位于操作系统虚拟内存上 go 栈的工作流程 以main.main为出发点 要记录runtime.main的栈基地址 记录 a 和 b的局部变量值 开辟一个...
9个月前
03413
go数据类型-map-牛翰网

go数据类型-map

go的map在面试时候经常会被问到。 最近看到群里有个被问到为什么map的每个桶中只装8个元素? map 的结构 注:解决hash冲突还有一些别的方案:开放地址法 (往目标地址后面放)、再哈希法(再次h...
9个月前
03412
go数据类型-空结构体、空接口、nil-牛翰网

go数据类型-空结构体、空接口、nil

空结构体 func main() { a := struct{}{} fmt.Println(unsafe.Sizeof(a)) fmt.Printf("%p\n", &a) } 打印 0 0x117f4e0 有经验的开发人员都知道,所有的空结构体是指向一个 zeroba
9个月前
03111
go数据类型-sync.map-牛翰网

go数据类型-sync.map

定义 在runtime的sync.map包中有定义: type Map struct { mu Mutex // 锁 read atomic.Pointer[readOnly] //包含了readOnly类型的一个struct,下方把 Pointer 也贴了 dirty map[any]*entry
9个月前
37310
go互斥锁-牛翰网

go互斥锁

互斥锁的定义 type Mutex struct { state int32 sema uint32 } 一个 sema,背后实际上 是一个 休眠队列,可以看下上篇。 一个state,这个状态 分为4个部分。 后三位 各自代表一个状态。 前29位...
9个月前
05410
go 网络 network poller-牛翰网

go 网络 network poller

网络基础 协议架构 tcp链接 假如需要开发者去实现一套新的网络协议(例如 redis 的resp), 是基于TCP的, 那tcp这层的协议,是否需要开发者自己去实现? 这层如果自己实现, 其实很复杂, 会涉及很多算...
9个月前
12310