---
name: cs-fundamentals
description: 计算机基础出题：操作系统、计算机网络、数据结构与算法基础、数据库原理、编译与体系结构入门。技术岗校招通用兜底包，没有匹配到明确技术方向时默认加载。
keywords: [计算机基础, 操作系统, 计算机网络, 数据结构, 算法, 数据库原理, 编译原理, 计算机组成, tcp, http, 进程, 线程, 校招, 八股, 软件工程师]
layer: domain
---

## 岗位职责与考察重点

计算机基础是国内技术岗校招一面的主体，覆盖操作系统、计算机网络、数据结构与算法、数据库原理，部分岗位（C++、基础架构、嵌入式、编译器、芯片相关）会加上计算机组成与编译原理。社招也会问基础，但更多是从生产问题切入反推原理，比如"TIME_WAIT 堆积""CPU 空闲但请求慢""慢查询怎么看执行计划"。

校招候选人几乎都背过"八股"，因此单点概念题（三次握手、进程与线程的区别、B+ 树为什么适合索引）已经没有区分度，面试官的做法是把点连成线：给一个现象让候选人归因到机制，或者让候选人解释两个概念之间的因果关系，或者在候选人的项目里找一个真实场景下钻。社招则看候选人能否用基础知识解释自己遇到过的故障，并知道对应的排查工具。

面试官最在意三件事：第一，候选人是理解机制还是背诵结论——追一层"为什么"是否会断线；第二，能否把现象映射回原理，比如从"接口偶发超时"想到重传、队列、GC、锁；第三，与候选人技术栈的关联度——写 Web 的应该对 HTTP 与 TCP 有直觉，写并发的应该对锁与调度有直觉，不能所有基础都只停留在课本水平。

## 主题

### 进程、线程与协程
- 阶梯：进程与线程的区别、协程与线程的区别 → 上下文切换到底切了什么、开销在哪 → CPU 使用率低但请求慢、或者 load 高但 CPU 不高各怀疑什么 → 多进程、多线程、协程模型的选型依据
- 好题：一台 8 核机器上服务的 CPU 使用率只有 15%，但 p99 延迟很高、load 是 20，你怀疑哪些原因？分别用什么命令验证？
- 危险信号：只会背"线程共享地址空间"；把 load 和 CPU 使用率混为一谈；协程只知道"更轻量"说不出为什么。
- 期望信号：能说出切换保存的寄存器与内核态开销；知道 load 包含不可中断睡眠；有 top、vmstat、pidstat、perf 一类工具的使用经验。

### 内存管理与虚拟内存
- 阶梯：虚拟内存解决什么问题 → 页表、TLB、缺页中断的过程 → 内存泄漏与内存溢出怎么区分与定位、swap 使用率高意味着什么 → 页缓存对 IO 性能的影响与大内存机器的 NUMA 取舍
- 好题：一个 Java 服务 RSS 持续增长但堆使用率稳定，你怀疑什么？如果是 C++ 服务呢？各用什么工具确认？
- 危险信号：分不清 RSS 与堆；认为 free 显示的可用内存少就是内存不足；缺页只知道名词。
- 期望信号：区分堆外内存、线程栈、页缓存；知道 pmap、jcmd、valgrind、asan 等工具；能解释 buffers/cache 的含义。

### 锁、同步与死锁
- 阶梯：互斥锁、读写锁、自旋锁、信号量的适用场景 → 死锁的四个条件与破坏方式 → 线上线程池卡死怎么定位、活锁与饥饿怎么识别 → 无锁结构与乐观并发什么时候值得
- 好题：你的服务突然所有请求都不返回，线程 dump 显示大量线程 BLOCKED，你按什么步骤定位是死锁、锁竞争还是下游阻塞？定位后的止血与修复各是什么？
- 危险信号：只能背四个条件；不知道怎么看线程 dump；把自旋锁当成"更快的锁"。
- 期望信号：能从 dump 找到锁持有链；知道按序加锁与超时释放；能评估锁粒度与吞吐的关系。

### IO 模型与多路复用
- 阶梯：阻塞、非阻塞、同步、异步的区别 → select/poll/epoll 的差异与 epoll 的边缘触发 → 一个连接数很高的服务 CPU 都花在哪，零拷贝解决了什么 → Reactor 单线程与多线程模型的选择，io_uring 是否值得用
- 好题：一台机器要维持 10 万个长连接、大部分空闲，用一线程一连接为什么不行？epoll 在这个场景下的开销和什么成正比？如果连接大多活跃呢？
- 危险信号：把非阻塞和异步划等号；epoll 只知道"效率高"；不知道 sendfile 和 mmap 的差别。
- 期望信号：能说出就绪通知与数据拷贝两个阶段；知道 ET 与 LT 的处理差异；理解零拷贝减少的是哪几次拷贝与切换。

### TCP 连接管理与可靠传输
- 阶梯：三次握手与四次挥手为什么是这个次数 → 序号、确认、重传、滑动窗口与拥塞控制的协作 → 大量 TIME_WAIT 或 CLOSE_WAIT 各说明什么、SYN 洪水怎么防 → 长连接与短连接、keepalive 参数的取舍
- 好题：服务器上有几万个 TIME_WAIT，是谁主动关闭的连接？有没有实际危害？在改 tcp_tw_reuse 之前你会先确认什么？如果是几万个 CLOSE_WAIT 呢？
- 危险信号：背完握手过程被问"为什么"就断线；把 TIME_WAIT 当故障；不知道 CLOSE_WAIT 是应用没关连接。
- 期望信号：知道 TIME_WAIT 的两个作用与 2MSL；能区分主动方与被动方状态；有 ss、netstat、tcpdump 的使用经验。

### 接口超时的网络归因
- 阶梯：一次 HTTP 请求从 DNS 到响应经过哪些环节 → 超时可能发生在连接、发送、等待、读取哪一段 → 偶发超时怎么抓包定位是重传、队列还是服务端慢 → 超时时间、重试次数与调用方超时的配置原则
- 好题：客户端报 1% 的请求超时，服务端日志显示这些请求处理只用了 10ms，中间可能出了什么问题？你怎么用抓包或指标证明？
- 危险信号：只会说"网络不好"；不知道服务端处理时间不包含排队；不会区分连接超时与读超时。
- 期望信号：能列出 accept 队列、内核缓冲、重传、GC 停顿等候选；知道 tcpdump 和 retrans 指标；能给出合理的超时与重试配置。

### HTTP、HTTPS 与新协议
- 阶梯：HTTP/1.1 的 keep-alive 与队头阻塞 → HTTPS 握手在保护什么、证书链怎么验证 → HTTP/2 多路复用的残留问题与 HTTP/3 用 QUIC 解决了什么 → 缓存策略（强缓存与协商缓存）与 CDN 的取舍
- 好题：HTTP/2 已经多路复用了，为什么还会有队头阻塞？HTTP/3 是怎么解决的？弱网环境下你会优先选择哪个，为什么？
- 危险信号：HTTPS 只答"加密"说不出对称非对称的分工；HTTP/2 只知道"更快"；缓存头一个也说不出来。
- 期望信号：能区分 TCP 层与应用层队头阻塞；知道 TLS 1.3 的握手往返；能设计缓存头与失效策略。

### 数据结构选型与复杂度直觉
- 阶梯：哈希表、平衡树、跳表、堆的适用场景 → 均摊复杂度（动态数组扩容、哈希扩容）与最坏情况 → "这个接口为什么慢"的复杂度归因、千万级去重的内存账 → 时间与空间的取舍、常数因子何时比量级重要
- 好题：十亿条 URL 找出现次数前一百的，内存只有 4GB，说思路和每一步的量级；如果允许 1% 误差呢？
- 危险信号：所有查找都答哈希表；不知道哈希表扩容会有抖动；不问数据规模就给"最优解"。
- 期望信号：先问规模再选结构；能算内存占用；知道布隆过滤器与 HyperLogLog 的误差代价；知道缓存友好性影响常数。

### 算法范式的口述考察
- 阶梯：二分、双指针、滑动窗口的适用条件与边界 → 动态规划的状态定义怎么想出来、贪心什么时候会错 → 从业务场景（限流、调度、去重、匹配）抽象出算法问题 → 递归与迭代、精确解与近似解的取舍
- 好题：接口限流要求"任意 60 秒窗口不超过 1000 次"，固定窗口计数为什么不满足？滑动窗口和令牌桶各怎么实现、内存占用如何？
- 危险信号：直接报题号与解法；说不出算法的前提条件；边界条件靠试。
- 期望信号：能从场景抽象问题；说明前提与失效条件；给出复杂度与边界处理。

### 数据库索引与事务原理
- 阶梯：索引为什么用 B+ 树而不是哈希或红黑树 → 聚簇索引与回表、最左前缀与覆盖索引 → 一次慢查询的归因（索引失效、锁等待、IO）与执行计划的阅读 → 事务隔离级别与 MVCC 的代价、什么时候该放弃关系型
- 好题：一条带 WHERE 和 ORDER BY 的查询有索引却走了全表扫描，可能的原因有哪些？你怎么用执行计划确认？改索引之外还有什么办法？
- 危险信号：B+ 树只答"高度低"；隔离级别只会背名字；不会看执行计划。
- 期望信号：能说出 B+ 树的 IO 与范围查询优势；知道隐式转换、函数、选择性导致索引失效；能解释幻读与间隙锁。

### 缓存层次与 CPU 体系结构入门
- 阶梯：为什么有多级缓存、缓存行是多大 → 伪共享、分支预测失败、内存屏障对性能的影响 → 一个循环换个遍历顺序快十倍是什么原因 → 什么时候值得为缓存友好性重写数据结构
- 好题：两个线程各自更新自己的计数器，放在同一个结构体里比分开放慢很多，为什么？怎么验证？怎么修？
- 危险信号：不知道缓存行的存在；volatile 只答"可见性"说不出底层；把内存屏障和锁混为一谈。
- 期望信号：能解释缓存行与一致性协议；知道 perf 看缓存未命中；能说出行优先遍历与 padding 的原理。

### 编译、链接与运行时
- 阶梯：从源码到可执行文件经过哪些阶段 → 静态链接与动态链接的差异、符号解析 → 一个"undefined reference"或运行时找不到库怎么排查 → 编译器优化（内联、逃逸分析、JIT）对代码写法的影响
- 好题：同一份 C++ 代码 -O0 和 -O2 结果不同，可能是什么原因？你怎么定位是未定义行为还是编译器问题？
- 危险信号：说不出预处理、编译、汇编、链接四步；不知道动态库的查找路径；把 JIT 与解释执行混淆。
- 期望信号：能解释符号与重定位；知道 LD_LIBRARY_PATH 与 rpath；理解未定义行为与优化的关系。

## 好题 / 坏题对比

- 坏：说说 TCP 三次握手的过程。
- 好：服务器上几万个 TIME_WAIT 连接是谁的行为导致的？有没有危害？改内核参数之前你会先确认哪些事？
- 坏：进程和线程有什么区别？
- 好：一个 8 核机器 CPU 使用率 15% 但请求都很慢、load 很高，你怀疑什么？用什么命令验证？
- 坏：索引为什么用 B+ 树？
- 好：这条有索引的查询走了全表扫描，列出你会检查的五个可能原因以及执行计划里对应看哪一列。

## 项目结合钩子

- 简历出现 Web 服务 → 沿"一次请求从浏览器到数据库"的链路任选一段下钻到协议与内核行为。
- 简历出现"高性能""优化" → 追压测方法、瓶颈定位工具、优化前后的指标定义。
- 简历出现多线程或并发 → 追锁的粒度、死锁经历、线程池参数的依据。
- 简历出现网络编程、RPC、长连接 → 追 IO 模型选择、连接数上限、超时与重连策略。
- 简历出现 C/C++ 或系统编程 → 追内存管理、编译链接、缓存友好性。
- 简历出现 SQL 或数据库使用 → 追慢查询经历、执行计划、事务隔离级别选择。
- 简历出现算法竞赛 → 从其最熟的题型出变形，追前提条件与失效场景。

## 出题原则

- 单点概念题只用作开场，真正的评分点在第二层"为什么"和第三层"现象归因"；候选人背诵流畅但追问断线的按不理解处理。
- 优先考与候选人技术栈相关的基础：写 Web 的问网络与数据库，写并发的问 OS 与体系结构，不撒网。
- 每个主题都要落到至少一个真实排查场景，要求候选人说出工具或命令，考"会用"而非"听过"。
- 校招看理解与推理，社招看能否用基础解释自己遇到过的故障；对社招候选人不问纯定义题。
