Go
常见panic发生场景
- slice下标越界
- map没有初始化,导致panic
什么是sysmon
sysmon
(System Monitor)是运行时系统(runtime system)的一部分,用于监控系统的全局状态并触发一些操作,以维持整个程序的正常运行。sysmon
主要关注的是全局的调度和内存管理。
具体来说,sysmon
负责以下一些主要任务:
全局调度:
sysmon
周期性地检查全局运行时状态,包括所有的M(机器)、P(处理器)和G(Goroutine)。它负责做出调度决策,例如在某个P上运行的Goroutine执行时间过长,或者某个P上没有足够的Goroutine可运行时,sysmon
可能会触发 Handoff 机制,将 Goroutine 从一个 P 转移到另一个 P,以保持负载均衡。GC标记:
sysmon
在全局扫描时触发垃圾回收(Garbage Collection)标记阶段。它会通过定期检查所有的Goroutines来查找全局的指针,并确保堆上的对象被正确标记。
什么是MN线程模型?
MN模型是一种并发线程调度模型。在该模型中,M指任务执行单元,N指工作线程,M个任务执行单元可以同时运行在N个线程上。
在Go总,任务执行单元就是goroutine,通过GMP调度模型,基于队列的协作方式完成了整个MN并发调度模型。
Golang 的协程可以自己主动让出 CPU 吗?
runtime.Gosched()
可以主动让出CPU- 执行阻塞操作也可以主动让出CPU
defer输出结果
- 非具名参数返回值中,return会自动创建临时变量存储返回值,因此defer无法修改返回值
- 具名参数返回中,return就相当于赋值操作,因此defer可以修改返回值
func main() {
fmt.Println(test1()) // 00
fmt.Println(test2()) // 33
fmt.Println(test3()) // 34
fmt.Println(test4()) // 44
fmt.Println(test5()) // 05
fmt.Println(test6()) // 66
}
func test1() (v int) {
defer fmt.Print(v)
return v
}
func test2() (v int) {
defer func() {
fmt.Print(v)
}()
return 3
}
func test3() (v int) {
v = 3
defer fmt.Print(v)
return 4
}
func test4() (v int) {
v = 3
defer func() {
fmt.Print(v)
}()
return 4
}
func test5() (v int) {
defer func(n int) {
fmt.Print(n)
}(v)
return 5
}
func test6() (v int) {
defer func() {
v++
fmt.Print(v)
}()
return 5
}