华橙网络-C++后端-一面-2025秋招
就面了15分钟,因为有项目是go,所以问了
- 你这个(Go 的)模型能讲讲吗?— 候选人:好的。Golang 的 GMP 调度模型是 Go 运行时(runtime)管理的协程调度机制。G、M、P 分别代表 goroutine(G)、OS 线程(M) 和 逻辑处理器(P)。使用 go 关键字启动一个协程后,协程会先进入工作队列并绑定到某个 P,然后由运行时把该 P 调度到具体的 M(线程) 上执行。协程切换开销小,初始栈空间也很小。
- 这个GMP模型和线程的关系是什么?— 候选人:Go 运行时维护 G–P–M 的绑定与调度关系:goroutine 先与 P 绑定,再由运行时把 P 绑定到 M 上运行,也就是把任务交给具体的 OS 线程执行。
- GC(垃圾回收)原理是什么?— 候选人:Go 的 GC 由运行时后台自动进行,主要基于三色标记法。大致步骤:STW 初始标记:从根对象开始标记为黑色,会有短暂 STW(Stop The World)。并发标记:与程序并发,从已标记对象出发递归遍历可达对象,把新发现对象标为灰色并继续处理。STW 重新标记:短暂停顿,处理剩余的灰色对象,完成标记闭包。并发清理:回收未被标记到的白色对象。
- 你项目里限流、熔断一般怎么实现?— 候选人:我先做流量统计,分 全站/服务/用户三种粒度,使用 Redis 以带前缀的 key 进行原子自增统计。限流使用 Go 标准库基于令牌桶的限流器,请求无法满足令牌条件时直接拦截并返回相应状态码和消息。熔断也做了(此处候选人未展开细节)。
- 你的“微服务架构高性能网关系统”是在实习公司里做的还是自己做的?— 候选人:主要是自己做的。
- 压测你是怎么做的?— 候选人:在 Linux 上用 wrk 压测:先启动管理服务,再启动网关代理服务,用 wrk 发送高并发请求,观察服务器可承载的最大请求量等指标。
- 你在“分布式 KV 存储”里也用了协程,协程库是 C++ 官方的吗?— 候选人:不是 C++ 官方的协程库,用的是开源脚手架来实现协程。
- 协程与线程(以及进程)的差别?— 候选人:协程是用户态的轻量级线程,切换在用户态完成,初始栈很小(比如 Go 协程初始栈 ~2KB)。线程是 OS 调度的最小单位,多个线程共享进程地址空间,切换涉及内核态/用户态转换,开销更大;一个线程崩溃可能影响同进程内其他线程。进程是 OS 资源分配的最小单位。
9.(追问)如何监控大量协程下的系统瓶颈或负载上限?— 候选人:主要通过日志输出 CPU/内存占用来关注。
10.(追问)在操作系统层面,用什么命令分析程序是否已到瓶颈?— 候选人:常用 top(配合管道与过滤)来关注进程/线程的系统资源占用。(候选人简要回答,未细化其它工具。)
- DNS 协议位于 TCP/IP 的哪一层?— 候选人:应用层。
- DNS 的解析过程是怎样的?— 候选人:DNS 用来把域名解析为 IP。解析流程一般先查本地缓存(浏览器、系统、路由器),都没有则向本地域名服务器查询;若本地域名服务器没有,则进入递归查询:从根 DNS → 顶级域 DNS(TLD) → 权威 DNS,得到结果后返回并缓存,最后返回给客户端。
- “域名解析托管”这个概念听说过吗?— 候选人:不了解(未接触)。
- TCP/IP 里的“流量控制”是做什么、怎么实现?— 候选人:为防止发送方发送速率超过接收方缓冲能力,通过滑动窗口机制实现流量控制。
- STL 常用容器:举一个你熟悉的,说说实现原理— 候选人:以 vector(动态数组)为例:底层是连续内存,支持动态扩容和基于迭代器的插入,尾部插入/弹出高效;在中间位置的插入/删除需要大量元素移动,时间复杂度 O(n)。
- 你还有什么想问的?— 候选人:如果能加入公司,您建议我再补充学习哪些技术?另外可能会负责哪一块业务?— 面试官:技术学习会围绕业务展开;岗位是 C++ 服务端编程,但具体方向需以校招集中安排为准。— 候选人:好的,没有其他问题了。