Tadori1zanai 腾讯微信游戏小游戏三面

作者:Tadori1zanai 时间:2026.5.13

注:

  • 回答多数为 AI 生成,仅供参考。
  • 只记录部分面试和部分问题,部分问题暂无回答。

goroutine 如何实现,goroutine 切换时保存哪些信息?#

  • Goroutine 是 Go 在用户态实现的轻量级协程。
  • 每个 goroutine 维护自己的栈和状态。
  • 切换时,Go 主要保存少量关键寄存器信息到 G 的 gobuf 结构体。
  • 典型信息包括 sp 栈顶指针、pc 下一条指令地址、ret 系统调用返回值、bp 栈帧基址。
  • 这些操作在用户态完成,开销远低于操作系统线程切换。

goroutine 切换和线程、进程切换有什么区别?#

  • 进程和线程切换由操作系统内核完成,属于内核态切换。
  • goroutine 切换由 Go runtime 完成,属于用户态切换。
  • 进程切换最重,涉及虚拟地址空间切换,会影响 TLB 和缓存。
  • 线程切换共享地址空间,但仍需要保存较多寄存器和调度状态。
  • goroutine 切换更轻,不涉及地址空间变化,只保存少量核心上下文。

UDP 不可靠体现在什么地方?#

  • 数据包可能丢失。
  • 数据包可能乱序到达。
  • 数据包可能重复。
  • UDP 没有流量控制和拥塞控制。
  • UDP 只负责尽力发送,不保证到达和顺序。
  • UDP 仍然有 checksum 校验,数据损坏通常会被丢弃。

UDP 的数据帧一般的大小是多少?太小或者太大的数据帧会怎么样?#

  • UDP 理论最大数据报大小约为 65535 - 20(IP头) - 8(UDP头) = 65507 字节。
  • 以太网 MTU 通常是 1500 字节,因此 UDP payload 常控制在 1500 - 20(IP头) - 8(UDP头) = 1472 字节以内,避免 IP 分片。
  • UDP 包太大会被 IP 层分片,一个分片丢失会导致整个数据报失效。
  • UDP 包太小会让 header 占比变高,系统调用和网络包数量增加,带来 CPU 和网卡压力。
  • 工程上通常控制 UDP 包大小,减少分片,同时兼顾传输效率。

TCP payload 常见最大值是 MSS,通常为 1500 - 20(IP头) - 20(TCP头) = 1460 字节。