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
}