![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang高级编程
文章平均质量分 92
月守护
卡拉卡拉
展开
-
CPU Cache体系对Go程序的影响
引言看一段测试代码:package mainimport "testing"func createMatrix(size int) [][]int64 { matrix := make([][]int64, size) for i := 0; i < size; i++ { matrix[i] = make([]int64, size) } return matrix}const matrixLength = 6400func BenchmarkMatrixCombi原创 2021-04-22 17:46:15 · 376 阅读 · 0 评论 -
Go中的内存对齐
在 Go 中恰到好处的内存对齐转载 2021-03-29 11:31:15 · 306 阅读 · 0 评论 -
Go指针的使用限制和突破之路-unsafe
转载:Go指针的使用限制和突破之路这篇文章跟大家聊一下 Go 语言指针这个话题,相较于 C 而言,Go 语言在设计时为了使用安全给指针在类型和运算上增加了限制,这让Go程序员既可以享受指针带来的便利,又避免了指针的危险性。除了常规的指针外,Go 语言在 unsafe 包里其实还通过 unsafe.Pointer 提供了通用指针,通过这个通用指针以及 unsafe 包的其他几个功能又让使用者能够绕过 Go 语言的类型系统直接操作内存进行例如:指针类型转换,读写结构体私有成员这样操作。网管觉得正是因为功能强大转载 2021-03-03 15:54:42 · 297 阅读 · 1 评论 -
从一段可能卡死的代码出发讲讲goroutine的调度和GC
package mainimport ( "fmt" "runtime")func main() { var i byte go func() { for i = 0; i <= 255; i++ { } }() fmt.Println("Dropping mic") // Yield execution to force executing other goroutines runtime.Go原创 2021-03-26 14:37:42 · 620 阅读 · 1 评论 -
Golang中的逃逸分析
本节讨论golang声明变量时,是放在栈上还是堆上的问题引言package mainfunc foo(arg_val int)(*int) { var foo_val int = 11; return &foo_val;}func main() { main_val := foo(666) println(*main_val)}编译运行$ go run pro_1.go 11这段代码在golang中是可以正常运行的,但了解C/C++的原创 2021-03-11 15:44:39 · 768 阅读 · 1 评论 -
正在执行的goruntine发生阻塞,golang调度策略
减少阻塞如果正在执行的 Goroutine 阻塞了线程 M 怎么办?P 上 LRQ 中的 Goroutine 会获取不到调度么?在 Go 里面阻塞主要分为一下 4 种场景:场景 1:由于原子、互斥量或通道操作调用导致 Goroutine 阻塞,调度器将把当前阻塞的 Goroutine 切换出去,重新调度 LRQ 上的其他 Goroutine;场景 2:由于网络请求和 IO 操作导致 Goroutine 阻塞,这种阻塞的情况下,我们的 G 和 M 又会怎么做呢?Go 程序提供了网络轮询器(N原创 2021-01-04 14:12:38 · 2216 阅读 · 0 评论 -
GMP调度11大场景全解析
(1) 场景 1P 拥有 G1,M1 获取 P 后开始运行 G1,G1 使用 go func() 创建了 G2,为了局部性 G2 优先加入到 P1 的本地队列。(2) 场景 2G1 运行完成后 (函数:goexit),M 上运行的 goroutine 切换为 G0,G0 负责调度时协程的切换(函数:schedule)。从 P 的本地队列取 G2,从 G0 切换到 G2,并开始运行 G2 (函数:execute)。实现了线程 M1 的复用。(3) 场景 3假设每个 P 的本地队列只能存 3 个转载 2020-12-31 16:51:51 · 673 阅读 · 0 评论 -
golang的调度模型--GMP
GMP是什么?是gplang内部自己实现的调度器,用来调度goruntine。GMP的由来为什么golang程序中的goruntine需要GMP来进行调度执行呢?单进程的时代单进程时代及一个程序就一个进程,没有别的东西存在。每一个进程都由操作系统来进行调度,按顺序的在cpu上进行执行,及一切的程序只能串行发生。这样单一的执行流程,计算机只能一个任务一个任务地处理,而且进程阻塞会带来cpu资源空闲的浪费。为了解决上述的问题,后来操作系统在一个进程阻塞时,有了切换到其他等待执行的进程的能力,具转载 2020-08-26 22:43:42 · 1029 阅读 · 0 评论 -
golang中的GC
GOLANG的垃圾回收机制现在go1.14所用的是三色标志法和GC混合写屏障GC版本变化Go V1.3 标记清除(mark and sweep)Go V1.5 三色标记法Go V1.8 加入混入写屏障原创 2020-12-03 21:33:54 · 1663 阅读 · 1 评论