cs-fundamentals · git:20260908.a2a662c · 2026-09-08 · sha256 85f282518ec1ba2b
cs-fundamentals git:20260908.a2a662cA
Immutable. This exact content is served forever at /api/v1/blob/85f282518ec1ba2b.
--- 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 与体系结构,不撒网。 - 每个主题都要落到至少一个真实排查场景,要求候选人说出工具或命令,考"会用"而非"听过"。 - 校招看理解与推理,社招看能否用基础解释自己遇到过的故障;对社招候选人不问纯定义题。