面灵AI

百度秋招一面:Go 调度、网络协议与容器基础

轮次
一面
结果
未通过
时间
2026-09
来源
牛客网

《面试题目》

  1. 实习中用于观测 Agent 的 trace 指什么,记录了哪些信息?
  2. TCP 三次握手和四次挥手分别怎样进行?
  3. 常见 HTTP 状态码有哪些,分别表示什么?
  4. HTTPS 怎样完成握手?
  5. 进程、线程和协程有什么区别?
  6. Go 的 G、M、P 分别是什么,怎样配合完成调度?
  7. Go 如何实现抢占式调度?
  8. Go 协程之间有哪些通信方式?
  9. Java HashMap 的底层结构和查找过程是什么?
  10. 使用过哪些 Java 锁,分别适合什么场景?
  11. 是否排查过 JVM 问题,具体怎样定位?
  12. 红黑树怎样维持平衡?
  13. 红黑树和跳表有哪些差异?
  14. Redis 有序集合如何实现,跳表怎样支持查找和范围查询?
  15. Docker 容器隔离和资源限制的基本原理是什么?
  16. 常用 Docker 命令有哪些?
  17. Kubernetes 有哪些主要组件,各自负责什么?

《参考解析》

先说清 G、M、P 各管什么

G 是 goroutine,保存任务执行所需的状态;M 是操作系统线程;P 保存执行用户 Go 代码所需的调度和内存分配资源。M 执行用户 Go 代码时需要持有 P,P 的数量由 GOMAXPROCS 决定。它限制的是同时执行用户 Go 代码的并行度,不是整个进程能创建多少个线程。可以对照 Go 运行时说明 理解这几个对象的关系。

协程通信可以用 channel 传递数据,也可以共享内存并用锁或原子操作同步。面试时接着说明任务何时结束、取消信号如何传递,以及发送方是否可能一直阻塞,比只列出 channel 更完整。

链路追踪要能定位慢在哪一步

一次 Agent 请求往往包含多次模型调用和工具调用。trace 表示这次请求的整体执行链,span 描述其中的一步,通常记录起止时间、父子关系、状态与错误。回答时可以拿真实经历说明:总耗时增加,是模型响应变慢、某个工具卡住,还是重试次数增多。日志里的同一个 trace 标识能把这些片段关联起来。

有序集合为什么适合排行榜

有序集合的成员唯一,按分数排序,既能更新成员分数,也能查询排名和分数范围。Redis 源码介绍了跳表与哈希表配合的实现:前者支持有序遍历,后者便于按成员查找。具体编码还要结合版本与集合规模,不能只凭“使用了 ZSET”就推断所有实例的内部布局。参见 Redis 有序集合实现

红黑树通过颜色约束和旋转维持平衡;跳表通过多层索引缩短查找路径。两者都能支持有序查询,但实现、内存布局和维护方式不同。范围扫描时,跳表找到起点后沿底层链向后走即可。

容器题从内核机制讲起

Linux 容器利用 namespace 隔离进程看到的部分系统资源,通过 cgroup 管理资源用量。容器与宿主机共享内核,不能把它解释成每个容器都启动一套完整的虚拟机。再接上实际用过的命令,例如用 docker ps 看运行状态、docker logs 读日志、docker inspect 查配置、docker exec 进入运行中的容器执行命令。

Kubernetes 则需要区分控制面和节点:API Server 提供集群接口,etcd 保存集群状态,调度器为 Pod 选择节点,控制器持续协调实际状态与期望状态;节点上的 kubelet 负责落实 Pod 的运行要求,并与容器运行时协作。