golang https 全局代理_Golang 调度器
在 2020.2.22 这一天,面试了 B 站后台开发的岗位,被问到了这样的一个面试题。一下子就蒙了,今天恶补了一下,整理一下思路,避免下次还蒙。
<ol><li>说一下 GMP 模型、global queue、P 的 local queue。</li></ol> https://medium.com/a-journey-with-go/go-goroutine-os-thread-and-cpu-management-2f5a5eaf518amedium.com2. Work Stealing,即当一个 P 的 local queue empty 了,为了不同的 P 直接的负载均衡所采取的的策略。什么时候进出 global queue?为什么需要 local queue?[避免了获取 goroutine 产生的锁]。 参考这个:
https://medium.com/a-journey-with-go/go-work-stealing-in-go-scheduler-d439231be64dmedium.com https://medium.com/a-journey-with-go/go-g0-special-goroutine-8c778c6704d8medium.com3. 阻塞调用了,怎么办? 异步的网络调用,通过 netpoller (封装了 os 提供的 I/O 多路复用)来调度,避免产生过多的 M;同步的系统调用,则脱离 P ,将 P 绑定到空闲的 M 或者新建一个 M ,来调度;参照:
The Go netpollermorsmachine.dk https://medium.com/a-journey-with-go/go-concurrency-scheduler-affinity-3b678f490488medium.com https://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part2.htmlwww.ardanlabs.com4. 抢占式调度:
当某个goroutine执行超过10ms,sysmon会向其发起抢占调度请求,由于Go调度不像OS调度那样有时间片的概念,因此实际抢占机制要弱很多: Go中的抢占实际上是为G设置抢占标记(g.stackguard0),当G调用某函数时(更确切说,在通过newstack分配函数栈时),被编译器安插的指令会检查这个标记,并且将当前G以runtime.Goched的方式暂停,并加入到全局队列。
https://medium.com/a-journey-with-go/go-goroutine-and-preemption-d6bc2aa2f4b7medium.com <h2>Reference:</h2> Go 调度模型wudaijun.com您可能感兴趣的文章:
golang https 全局代理_Golang 调度器
golang 所有进程休眠_Golang中Goroutine的调度流程
golang 没有名字参数_golang内核系列--深入理解plan9汇编&实践
golang 动态生成函数_GoLang的优点和缺点
golang的调度总结
golang 初始化并赋值_Golang | 既是接口又是类型,interface是什么神仙用法?
golang静态代码检查_Golang面试题41道
golang key map 所有_Golang面试知识点总结
go 开了多少个goroutine 怎么看_Golang 协程Goroutine到底是怎么回事?(一)
golang runtime 简析