15~30K,3年以上golang开发经验
继续分享最新的面经,前面发的两篇大家也可以看看:
今天分享的是golang开发岗面经,要求是3年以上golang开发经验,薪资为15~30K,整体面下来的感受就是,面的比较广,细节拷打不多,来看看难度如何:
面试题详解
1. GMP调度
GMP调度模型是Go语言运行时的核心调度机制,用于实现高效的并发执行。G代表Goroutine(协程),M代表Machine(操作系统线程),P代表Processor(处理器)。
- Goroutine 是用户态的轻量级线程,由Go运行时管理,创建和销毁成本低。
- Machine 是操作系统线程,负责真正执行代码,每个M可以绑定一个或多个G。
- Processor 是逻辑处理器,用于分配任务给M,并维护本地队列中的G。
调度过程:
- 每个P维护一个本地队列,存放待执行的G。如果本地队列为空,会从全局队列或其他P的队列中偷取任务(Work Stealing)。
- 当一个G阻塞时(如I/O操作),M会释放当前P并寻找其他可执行的G,从而避免浪费资源。
- 如果所有M都在忙,而有新的G需要执行,运行时会动态创建新的M来满足需求。
这种调度方式的优点是高效利用多核CPU,减少了上下文切换的开销,同时支持大量并发任务。
2. 协作式调度和抢占式调度有什么区别
协作式调度 和 抢占式调度 是两种不同的任务调度方式,主要区别在于任务的执行控制权归属:
协作式调度:
- 任务主动让出CPU,只有当前任务完成或显式调用让出函数时,调度器才能切换到其他任务。
- 缺点是如果某个任务长时间占用CPU而不让出,会导致其他任务“饿死”。
- 优点是实现简单,上下文切换开销小,适合任务间信任度高的场景。
抢占式调度:
- 调度器通过定时器中断等方式强制剥夺当前任务的CPU使用
