十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

七天冲刺计算机基础八股文:从操作系统到数据库的面试通关攻略

七天冲刺计算机基础八股文:从操作系统到数据库的面试通关攻略 最近好几个准备跳槽的读者跑来问我同一个问题离面试只剩一周计算机基础这块八股文还能不能救我的回答一直很直接——能救但你别指望靠这七天从零学成高手你要做的是把“必考”和“高频”的题目拿下用最短的时间把话说到面试官心坎里。很多人一听“八股文”三个字就皱眉觉得这是死记硬背的应试产物。但在技术面试这个场景里“八股文”其实是最高频面试题的统称进程和线程的区别、TCP为什么三次握手、索引为什么用B树、HashMap的底层结构……这些问题看似基础实际上每一道背后都链接着一套完整的知识体系。面试官问八股文不是为了考你的记忆力而是想快速判断你的计算机基础扎不扎实。扎实的人能把八股文讲出深度不扎实的人背得再熟也接不住追问。这篇内容就是给时间紧、任务重的你准备的七天冲刺方案覆盖操作系统、计算机网络、数据结构与算法、数据库、计算机组成原理这些必考板块顺便把我的面试官经验和踩坑教训一并交底。1. 先说清楚为什么“七天八股文”是可行的以及它的真实定位1.1 一个面试官的反问八股文到底在考什么我在面试候选人时最常听到的一句话是“这些问题我背过但忘了。”说这句话的人往往是把八股文当成独立的题目在背而不是当成知识点之间的连接线在理解。举一个最典型的例子。面试官问“进程和线程的区别”很多人能脱口而出“进程是资源分配的最小单位线程是CPU调度的最小单位”然后呢然后就没有然后了。如果我接着问“那为什么线程切换比进程切换开销小”很多人就卡住了。再往下问“那协程又是什么它比线程轻量在哪里”能答上来的人就更少了。所以八股文考察的从来不是单点记忆而是你能否把知识点串成面。七天时间之所以够用是因为我们不需要追求面面俱到只需要把最高频的知识链路打通。面试官问A你能自然地引出B和C这就是八股文复习的核心目标。1.2 七天突击的适用人群与不适用人群先说结论如果你是计算机科班出身、但基础忘得差不多的七天完全够用因为你要做的事是“唤醒记忆”而不是“从零学习”。如果你是半路转行、完全没有操作系统和计算机网络底子的七天也能应急但你必须接受一个现实——你背下来的东西只能应付第一轮问答遇到稍微深一点的追问大概率还是会露馅。我把这种区分说得更直白一点。七天突击计划适合以下三类人已经有一到两年开发经验平时写业务代码为主基础知识忘得差不多的在职开发者临近毕业、面试时间紧迫需要短期内把核心考点覆盖一遍的应届生已经经历过几轮面试、发现每次都在计算机基础上翻车需要系统性过一遍查漏补缺的人。不适合的人也有三类完全零基础、连什么是进程都不清楚的纯小白指望背完七天就能进大厂、不愿意做任何项目补充的人以为背完八股文就可以不刷算法题的人。这几种情况七天计划救不了你。1.3 七天计划总览表正式开跑之前先给你一张总览表。这张表是我反复调整过很多次之后的版本核心思路是前三天攻克最重头的操作系统和计算机网络中间两天处理数据结构和数据库第六天扫尾计算机组成原理和杂项最后一天专门留给模拟面试和表达训练。天数主攻板块核心考点目标产出Day 1-2操作系统进程线程、死锁、内存管理、调度能连环回答进程线程相关5连问Day 3计算机网络TCP/UDP、三次握手四次挥手、HTTP能一口气讲完一个URL的完整请求过程Day 4数据结构与算法数组链表、二叉树、排序、哈希能手写排序、说清复杂度和适用场景Day 5数据库索引、事务、隔离级别、MVCC能画出B树索引结构并解释为什么用它Day 6组成原理与杂项进制、原反补码、CPU缓存、语言特色能答出高频杂项题避免知识盲区Day 7冲刺自测模拟面试、表达训练把背下来的知识讲成自己的话每天的学习时间建议控制在六到八小时不要贪多。八股文复习的核心不在于你看了多少而在于你能说出来多少。后面我会按照这个节奏把每一天的重点逐个拆开讲。2. Day 1-2操作系统先把进程线程和内存这盘棋理顺2.1 进程vs线程从一道连环问说起操作系统的八股文里进程和线程是绝对的一号热点几乎每一场面试都会遇到。但面试官不会只问一句“它们的区别”而是会顺着你的回答一路追下去。我总结过一条高频追问链你感受一下进程和线程的区别是什么为什么线程切换比进程切换开销小进程间有哪些通信方式线程间又有哪些同步机制什么是死锁死锁产生的必要条件如何避免这条链路你如果能完整地走下来操作系统这块就已经拿下一大半了。先说第一问的标准答法。进程是操作系统进行资源分配的基本单位它拥有独立的地址空间包含代码、数据、堆和栈线程是CPU调度的基本单位是进程内部的一条执行路径同一个进程内的线程共享进程的地址空间和资源。关键区别在于资源拥有权和调度单元这两个维度。第二问的关键在于“开销差在哪里”。线程切换只需要保存和恢复寄存器状态、程序计数器等少量上下文信息而进程切换除了这些还要切换虚拟地址空间、页表、打开的文件描述符表等资源涉及内核态和用户态的切换开销自然大得多。记住一个词进程切换涉及“地址空间切换”线程切换只涉及“执行上下文切换”。第三问要能说出至少四五种进程间通信方式包括管道、消息队列、共享内存、信号量、套接字和信号。这里最容易踩坑的是只回答“管道、共享内存”就停了面试官想要的是你能比较它们的优劣——比如共享内存速度最快但需要同步机制消息队列适合小数据量但需要拷贝套接字可以跨机器通信。第四问的线程同步机制要答上互斥锁、读写锁、条件变量、信号量、自旋锁并且能区分互斥锁和自旋锁的区别互斥锁拿不到锁就睡眠让出CPU自旋锁拿不到锁就忙等循环自旋。自旋锁适合临界区很短的场景避免了线程切换的开销。2.2 死锁的四个必要条件与实战案例死锁几乎是操作系统板块必考的第二个热点。四个必要条件已经被讲烂了但我提醒你注意表达方式不要只背“互斥、占有且等待、不可剥夺、循环等待”这四个词要给面试官讲一个具体场景。我常用的案例是经典的“哲学家就餐问题”。五位哲学家围坐一桌每人左手和右手各需要一把叉子。如果每个哲学家都先拿起左手边的叉子再等待右手边的叉子就会出现所有人各拿一把叉子、互相等待对方放下叉子的局面这就是循环等待。因为叉子不能被剥夺每个哲学家在拿到两把叉子之前绝不放手死锁就产生了。死锁的处理策略要从四个层面回答预防、避免、检测与解除。预防就是破坏四个必要条件中的任意一个比如要求进程一次性申请所有资源来破坏“占有且等待”避免是用银行家算法判断分配后是否处于安全状态检测是通过资源分配图识别循环等待解除是杀掉部分进程或资源抢占。2.3 内存管理虚拟内存、分页与局部性原理内存管理的八股文里虚拟内存是核心中的核心。面试官最爱问的是“为什么需要虚拟内存”你要答出三个层面的理由第一隔离性每个进程拥有独立的地址空间进程A不能直接访问进程B的地址第二安全性通过页表设置访问权限保护操作系统内核区域第三高效性允许进程的部分数据在内存和磁盘之间换入换出让物理内存不够时程序也能运行。分页机制要能画图说明。虚拟地址被分成虚拟页物理内存被分成页框页表负责映射关系。CPU访问一个虚拟地址时先通过页表查找到对应的物理页框再拼接页内偏移量得到物理地址。如果页表项显示页面不在内存中就会触发缺页中断由操作系统从磁盘换入页面。这里有个高频追问“缺页率高怎么办”答案是引入局部性原理。时间局部性是指刚被访问的数据近期很可能再次被访问空间局部性是指某个地址被访问后它附近的数据近期也可能被访问。基于这两个特性操作系统采用页面置换算法——LRU最近最少使用、FIFO先进先出、Clock算法等。LRU是最常考的策略要能说出实现方式用哈希表加双向链表实现O(1)级别的访问和淘汰。2.4 进程调度算法什么时候用哪个调度算法属于那种“看起来简单、追问起来要命”的考点。常考的包括先来先服务FCFS、短作业优先SJF、时间片轮转RR、优先级调度和多级反馈队列。我建议你复习时不要只记定义要记住每种算法的适用场景和缺陷。FCFS对长作业友好、对短作业不友好容易产生“护航效应”——一堆短作业排队等一个长作业执行完。SJF能最小化平均等待时间但需要预知作业的CPU执行时间而且长作业可能饿死。RR是分时系统的核心时间片太大退化成FCFS时间片太小又导致频繁切换上下文切换开销过大。多级反馈队列是现代操作系统普遍采用的方式综合了多种算法的优点动态调整优先级。面试官如果追问“你们公司用的什么调度算法”不要慌张。这题想听的不是你对Linux源码的理解而是你能不能把“Linux CFS调度器基于虚拟运行时间、红黑树实现”这句话讲清楚。能说出CFS选择虚拟运行时间最小的进程运行就足够证明你了解得比背八股文深一层了。2.5 两天闭关的核心任务清单操作系统两天闭关结束前建议你用一份自测清单检验成果。每一条都能在三分钟内说清楚才算过关进程和线程的完整区别表述能自然带出PCB和TCB的概念进程间通信方式的对比能说出各自优缺点和适用场景死锁四个条件能用案例复述能说出死锁预防/避免/检测/解除的策略虚拟内存、分页、缺页中断、页面置换算法能连贯讲下来调度算法优缺点对比表能默写出来Linux下查看进程、内存、负载的常用命令比如ps、top、free、vmstat。3. Day 3计算机网络把三次握手四次挥手讲出深度3.1 TCP三次握手为什么要三次计算机网络板块的扛把子题目就是TCP三次握手和四次挥手。这道题几乎百分之百会考但大多数人答得太浅只停留在“第一次客户端发SYN第二次服务器回SYNACK第三次客户端发ACK”这一层。面试官想听的是背后的“为什么”。为什么一定要三次而不是两次核心原因有两个。第一个原因是为了确认双方的收发能力都正常。第一次握手服务器收到了客户端的SYN证明客户端的发送能力和服务器的接收能力正常第二次握手客户端收到了SYNACK证明客户端的接收能力和服务器的发送能力正常第三次握手服务器收到ACK证明服务器的发送能力和客户端的接收能力正常。如果只有两次握手服务器无法确认自己的发送能力是正常的。第二个原因是防止历史重复的连接请求初始化连接。考虑一种场景客户端发送了一个SYN报文因为网络拥塞迟迟没有到达客户端超时重传了一一个新的SYN。如果旧报文后来反而先到达服务器两次握手的情况下服务器会直接建立连接这时候客户端的序列号已经变了双方就会进入错误状态。三次握手允许客户端在收到服务器的SYNACK后根据序列号判断这是不是自己当前希望建立的连接如果发现是旧的历史连接可以发送RST报文中止连接。3.2 四次挥手与TIME_WAIT四次挥手的标准流程是主动关闭方发送FIN被动关闭方回复ACK被动关闭方再发送FIN主动关闭方最后回复ACK。关键考点有两个为什么要四次以及为什么主动关闭方要进入TIME_WAIT状态等待两倍最大报文段生存时间2MSL。为什么要四次因为TCP是全双工的两个方向的数据通道需要分别关闭。主动方发送FIN表示“我的数据发完了准备关闭这个方向”被动方回ACK表示“我知道了但我的数据可能还没发完我还不能关”。被动方的数据和主动方的关闭请求是独立的所以必须分开发送ACK和FIN这就比三次握手多了一次。TIME_WAIT是更常被追问的点。主动关闭方发送最后一个ACK之后要进入TIME_WAIT状态等待2MSL后再关闭。原因之一是确保最后一个ACK能到达被动方如果ACK丢失被动方会超时重传FIN主动方需要在TIME_WAIT状态下重新发送ACK原因之二是让本次连接中产生的所有报文在网络中自然消失防止旧连接的延迟报文干扰新连接。这里有个实际场景。你用短连接大量请求服务器时主动关闭方通常是客户端产生大量TIME_WAIT但如果是服务器主动关闭连接服务器端口就会被TIME_WAIT占用大量TIME_WAIT会导致端口资源耗尽。面试官喜欢追问“怎么优化”你可以答调整TIME_WAIT复用参数、减少服务器主动关闭连接的行为、长连接代替短连接。3.3 HTTP与HTTPS状态码、缓存与加密握手HTTP相关的八股文状态码是必背项。我建议你不要死记每一类所有代码而是记住最常出现的几个200 成功304 未修改可以走缓存301 永久重定向302 临时重定向400 客户端参数错误401 未认证403 无权限404 不存在500 服务器内部错误502 网关错误503 服务不可用504 网关超时。缓存相关的考点是高发区。你要分清强缓存和协商缓存。强缓存通过Cache-Control的max-age和Expires控制命中后直接使用本地缓存不发请求协商缓存通过ETag和Last-Modified控制需要向服务器验证服务器返回304才使用本地缓存。面试官经常问“一个资源多久刷新一次”实际上就是在考你对这几个头的理解。HTTPS的握手过程可以用精简版五步来回答客户端发送ClientHello携带支持的TLS版本和加密套件服务器返回ServerHello选定加密套件并下发证书客户端验证证书合法性生成预主密钥用服务器公钥加密发送服务器用私钥解密得到预主密钥双方基于预主密钥计算出对称会话密钥之后双方使用对称密钥加密通信。核心逻辑是用非对称加密安全地协商出对称密钥再用对称加密高效地传输数据。3.4 从输入URL到页面展示的过程串联这道题是计算机网络板块的“大串联”也是很多面试官用来考察综合能力的题。如果你能把这题答得流畅、完整、层次分明几乎等于告诉面试官你的计算机网络基础没问题。建议按下面这个顺序来答浏览器解析URL判断协议、域名、端口号、路径浏览器检查本地缓存DNS缓存、浏览器缓存、系统缓存如果有该域名的IP地址则直接使用否则请求本地DNS服务器解析域名本地DNS服务器递归或迭代查询最终拿到域名对应的IP地址浏览器与服务器建立TCP连接也就是前面的三次握手如果是HTTPS还要完成TLS握手协商会话密钥浏览器发送HTTP请求报文包含请求行、请求头、请求体服务器处理请求返回HTTP响应报文浏览器拿到HTML文档后开始解析构建DOM树和CSSOM树合成渲染树布局和绘制同时解析过程中发现的JavaScript文件会阻塞渲染需要下载并执行如果HTML中有外链资源图片、CSS、JS浏览器会并发加载这些资源最终完成页面展示。每一步都能展开讲一小段这题就能讲三到五分钟。建议你找一个宁静的时间自己把这条链路完整写一遍写出来的同时反复默读到自然流畅。3.5 高频追问和送命回答计算机网络这块有几句“送命回答”我单独拎出来提醒你。送命回答一“TCP可靠传输是靠确认重传吗”——这是半对半错。确认重传是重要机制但TCP的可靠性来自一整套机制包括序列号、确认应答、超时重传、流量控制滑动窗口、拥塞控制慢启动、拥塞避免、快重传、快恢复。只说确认重传会被追问到怀疑人生。送命回答二“UDP快所以TCP慢。”——UDP少了可靠性保障确实头部开销小、没有拥塞控制但不能简单说“TCP慢”。TCP慢是因为它要做可靠性保障和拥塞控制这是设计目标不同不是技术缺陷。送命回答三“HTTP是无状态的所以每次都要重新建连。”——无状态指的是协议层面不保存请求之间的上下文和是否复用TCP连接是两回事。HTTP/1.1默认支持长连接通过Connection: keep-alive复用TCP连接减少重复握手开销。4. Day 4数据结构与算法不刷题也能拿分的核心考点4.1 数组、链表、栈、队列的底层逻辑很多非科班出身的开发者以为数据结构这块要刷大量题其实八股文考核的重点在于你对底层结构的理解。数组和链表的对比是必考题核心区别在于内存分布和访问方式数组在内存中是连续的支持O(1)随机访问但插入删除需要移动元素并且扩容成本高链表在内存中是分散的节点不支持随机访问查找需要O(n)遍历但插入删除只需要修改指针。这里有个常见的追问“既然链表插入删除快为什么实际开发中很多时候还是用数组”答案要落到局部性原理上。数组内存连续遍历时CPU缓存命中率高而链表节点分散容易导致缓存未命中。现代CPU的缓存机制让“内存连续”这个特性变得非常值钱所以在数据量不大、频繁遍历的场景下数组反而更快。栈和队列的考点相对简单重点记住它们的使用场景。栈适合括号匹配、函数调用栈、撤销操作队列适合任务调度、消息队列、BFS。面试官很喜欢问“用两个栈实现一个队列”或者“用两个队列实现一个栈”这种题属于热身级别建议提前过一遍。4.2 二叉树遍历、递归与迭代的转换二叉树是数据结构里的常青树高频考点集中在遍历方式、递归改迭代、二叉树的性质。四种遍历方式必须张口就来前序根左右、中序左根右、后序左右根、层序按层遍历。递归写法每个人都会但面试官往往要求你写非递归版本考察你对栈和队列的使用能力。前序和中序遍历的非递归实现需要用栈模拟递归过程层序遍历用队列实现。这个一定要自己手写一遍不要只看不写我可以给你一个前序遍历非递归的模板参考// C 前序遍历非递归 vectorint preorderTraversal(TreeNode* root) { vectorint res; stackTreeNode* st; if (root) st.push(root); while (!st.empty()) { TreeNode* node st.top(); st.pop(); res.push_back(node-val); if (node-right) st.push(node-right); if (node-left) st.push(node-left); } return res; }这里有个容易出错的地方因为栈是后进先出所以要先压右子树、再压左子树才能保证左子树先被访问。很多人一紧张就写反导致结果变成根右左。面试时这种小错误非常致命建议你写完后自己用一个小例子走一遍流程验证。二叉树还有两个常考结论第n层的最大节点数是2^(n-1)深度为k的二叉树最多有2^k - 1个节点。判断一棵树是不是平衡二叉树、求树的最大深度、求最近公共祖先这些都是算法题中出现频率极高的顺便刷掉这三道题收益非常大。4.3 排序算法复杂度倒背如流还不够排序算法是笔试和面试中最高频的考点之一。你至少要把下面这张表刻在脑子里排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n^2)O(n^2)O(1)稳定插入排序O(n^2)O(n^2)O(1)稳定选择排序O(n^2)O(n^2)O(1)不稳定快速排序O(n log n)O(n^2)O(log n)不稳定归并排序O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(1)不稳定面试官不仅会问你复杂度还会问“什么时候用哪种排序”。这里有一个隐藏的考察意图你是否理解排序算法的实际应用工程而不是只会背教材。比如Java的Arrays.sort()对基本类型用双轴快排对对象类型用TimSortC的std::sort是对快排、插排和堆排的混合优化数据量小时改用插入排序。能说出这些说明你不仅懂算法还懂工程实践。快排的关键在于partition函数需要能手写。我建议你熟练背诵挖坑法或者双指针法中的一种并且要能说清楚它的时间复杂度为什么在平均情况下是O(n log n)——因为每次partition把数组一分为二递归深度是log n每一层需要O(n)的扫描所以总体是O(n log n)。最坏情况下每次选到最大或最小元素做基准退化成O(n^2)通常可以通过随机选基准来规避。4.4 哈希表与冲突处理哈希表是八股文里和实际开发结合最紧密的知识点之一。核心考点包括哈希函数、哈希冲突的处理方式和HashMap的底层实现。冲突处理有两种经典方案开放定址法和链地址法。开放定址法在冲突时往后找空闲位置典型的是线性探测缺点是容易产生聚集链地址法在冲突时把元素挂到链表上Java的HashMap就是这种思路的优化版。链表太长时JDK 8将链表转为红黑树阈值是链表长度超过8且数组长度大于等于64这个细节经常被问。HashMap还有几个必背细节。初始容量16负载因子默认0.75扩容是翻倍。之所以负载因子取0.75是权衡了空间利用率和查询效率——太小导致频繁扩容浪费空间太大导致哈希冲突增加降低查询效率。HashMap为什么用红黑树而不是平衡二叉树因为红黑树是近似平衡的插入删除的旋转次数比平衡二叉树少综合性能更好。HashMap为什么线程不安全因为并发put时可能导致数据覆盖JDK 8之前还可能因为头插法导致环形链表JDK 8改成尾插法之后解决了这个问题但并发场景仍然应该使用ConcurrentHashMap。4.5 算法八股的高频问法最后说说算法这块的高频问法。面试官一般不会让你现场手写难题目但常会让你说思路、说复杂度、说可能存在的问题。我把高频的“说思路”类型整理成了一份快速自查清单二分查找的前提条件是什么时间复杂度是多少如何避免死循环如何判断链表是否有环快慢指针的原理是什么反转链表有几种做法递归和迭代哪一种空间复杂度更低求一个数组的第K大元素有几种方法快排partition和堆两种方案各自的复杂度字符串匹配有哪些算法KMP的核心思想是什么next数组怎么求这五类题不需要大量刷题但一定要能讲清楚思路和复杂度。用一到两个小时把这些题的推导过程完整走一遍面试时再遇到类似题目你至少能接住话。5. Day 5数据库索引与事务是面试分水岭5.1 索引的底层结构为什么是B树数据库的八股文里索引和事务是最核心的分水岭。能答好这两块的人基本就能在技术面上甩开一半候选人。先来看索引。面试官问“为什么用B树做索引”几乎所有人都会回答“因为B树矮胖、磁盘IO少、叶子节点有链表便于范围查询”。这当然没错但你要能把这个答案讲得更有层次感。我建议你这样组织语言第一层对比其他数据结构。哈希表虽然查询O(1)但不支持范围查询和排序二叉树可能在极端情况下退化成链表AVL树和红黑树是二叉树节点只能存一个数据树高度高磁盘IO次数多B树每个节点可以存多个键值矮胖了很多但B树的非叶子节点也存储数据导致同样的磁盘空间能存储的索引项变少。第二层B树的几个核心设计。所有的数据都存储在叶子节点非叶子节点只存索引键因此同样的页能存储更多的键树的高度更低叶子节点之间用指针串联形成有序链表天然支持范围查询和排序查询任何一条数据的IO次数稳定因为都要走到叶子节点性能更稳定。第三层结合InnoDB实际。InnoDB的数据本身也是用B树组织的聚簇索引的叶子节点直接存储整行数据二级索引的叶子节点存储主键值。这意味着通过二级索引查询时需要回表如果查询的字段在二级索引中都能找到就形成了覆盖索引可以避免回表。5.2 聚簇索引与非聚簇索引聚簇索引和非聚簇索引的区别是数据库面试题里最容易被追问的知识点。聚簇索引是指数据行的物理存储顺序和索引顺序一致InnoDB的主键索引就是聚簇索引叶子节点直接存整行数据。每个表只能有一个聚簇索引因为数据行只能按一种顺序物理存储。非聚簇索引的叶子节点存储的是主键值而不是整行数据所以通过非聚簇索引查询数据索引时可能触发回表。面试官特别喜欢追问一个问题“如果一张表没有主键怎么办”InnoDB的机制是先找有没有非空的唯一索引如果有就用它作为聚簇索引如果也没有就隐式生成一个主键6字节的rowid作为聚簇索引。这个问题虽然冷门但在面试中每次问出来都能筛掉一批人务必记牢。还需要学会判断一个查询是不是覆盖索引。比如有个索引idx_name_age(name, age)查询select name, age from user where name 张三因为查询字段name和age都在索引里不需要回表这叫覆盖索引是MySQL优化的重要方向。5.3 事务的ACID与隔离级别事务的四个特性ACID几乎每场数据库面试都会碰到。但很多人只会背“原子性、一致性、隔离性、持久性”这四个词一深问就露馅。你要能说出每个特性的底层实现机制原子性通过undo log实现事务执行出错时利用undo log回滚到事务执行前的状态一致性一致性是最终目标依靠原子性、隔离性和持久性共同保证应用层也要保证业务逻辑的一致性隔离性通过锁和MVCC实现持久性通过redo log实现事务提交时把redo log刷入磁盘即使数据库崩溃也能通过redo log恢复。隔离级别是必考中的必考。SQL标准定义了四个隔离级别读未提交、读已提交、可重复读、串行化。读未提交存在脏读问题读已提交解决了脏读但存在不可重复读问题可重复读解决了不可重复读但存在幻读问题串行化彻底解决所有问题但性能最差。MySQL InnoDB的默认隔离级别是可重复读它通过MVCC解决了快照读下的幻读问题通过间隙锁gap lock和临键锁next-key lock解决了当前读下的幻读问题。面试官喜欢出一个场景题“事务A先查了一个条件范围的数据事务B插入了新数据并提交事务A再次查询为什么MySQL可重复读下看不到新数据”你要能回答事务A第一次查询时创建了ReadView后续快照读都基于同一个ReadView所以看不到事务B提交之后的新数据这是MVCC的多版本可见性规则决定的。5.4 MVCC可重复读的底层实现MVCC多版本并发控制是数据库八股文的高阶考点也是区分“背题选手”和“理解选手”的分水岭。如果你能把这个讲清楚面试官对你的评价会直接上升一个档次。MVCC的核心机制是版本链。每一行数据都有隐藏字段包括trx_id最近修改该行事务的ID和roll_pointer指向上一个版本数据的undo log。当一个事务修改数据时不会直接覆盖旧值而是生成一个新版本并通过undo log串联成版本链。ReadView是MVCC的关键。在读已提交和可重复读下每个查询都会生成ReadView里面记录了当前活跃事务的ID列表。判断某个版本是否可见的标准是如果版本的事务ID小于ReadView的最小活跃事务ID说明该版本已经提交可见如果大于等于最大活跃事务ID说明该版本是未来才产生的不可见如果落在中间需要判断是否在活跃事务列表中。读已提交和可重复读的区别在于ReadView的生成时机。读已提交是每次SELECT都生成一个新的ReadView所以同一个事务内两次查询可能看到不同的数据可重复读是事务内第一次SELECT生成ReadView之后一直复用所以同一事务内多次查询看到的结果一致。这个区别解释清楚了你对MVCC的理解就到位了。5.5 数据库高频追问链数据库这块我最后再分享一条完整的追问链你可以按这个路径自测一遍索引是什么为什么能加快查询索引底层是什么数据结构为什么选B树聚簇索引和非聚簇索引有什么区别什么是回表如何避免回表覆盖索引什么是索引最左前缀原则联合索引(a, b, c)查询条件where b1 and c2会走索引吗答案要记牢联合索引(a, b, c)查询条件是where b1 and c2由于没有用到a不满足最左前缀原则通常不会走索引。但如果MySQL优化器发现回表成本过高也可能选择全表扫描。这类题目本质是在考你对最左前缀的理解不要答成“一定不走索引”。6. Day 6计算机组成原理与其他延伸考点6.1 进制与原码、反码、补码到了第六天你会发现前面几天的大板块已经覆盖了大多数高频考点剩下的是那些“虽然不是大头、但突然抽到就能让你卡壳”的零散题目。计算机组成原理就是重灾区。进制转换是送分题但很多人长期写业务代码早就忘了。十进制整数转二进制用除2取余法例如把13转成二进制13/2商6余16/2商3余03/2商1余11/2商0余1倒序排列得到1101。小数部分转二进制用乘2取整法例如0.625转二进制0.62521.25取10.2520.5取00.5*21.0取1正序排列得到101所以0.625的二进制是0.101。原码、反码、补码这块重点记住为什么计算机用补码存储有符号整数。原码做加减法时符号位不能直接参与运算拿1 (-1)举例原码相加是00000001 10000001 10000010结果是-2明显是错的。反码解决了部分问题但反码存在0和-0两种表示会导致编码空间浪费。补码把减法转换成加法统一了加减法的硬件实现而且补码的0只有一种表示还能多表示一个最小值。我提醒一个高频追问“为什么int类型的范围是-2147483648到2147483647”答案在于补码的编码规则。32位int能表示2^32个状态正数从0到2^31-1负数从-1到-2^31。最小值-2^31就是10000000...000这个状态的补码是它自己正好把反码中浪费的-0利用起来了。6.2 CPU、缓存与局部性原理组成原理的第二个高频考点是CPU缓存。虽然前面在内存管理那部分提过局部性原理但这里会从硬件的角度再考一遍。要理解CPU缓存的分级结构L1、L2、L3。L1缓存离CPU核心最近速度最快但容量最小通常分为指令缓存和数据缓存L2缓存容量稍大L3缓存是多个核心共享的。缓存存在的根本原因是CPU的速度和内存的速度差距太大通过缓存把频繁访问的数据放在更靠近CPU的地方减少等待内存的时间。缓存和内存之间以缓存行为单位交换数据。常见的缓存写策略包括写直达write through和写回write back。写直达是数据同时写入缓存和内存简单可靠但性能差写回是数据先写缓存等到缓存行被替换时才写回内存性能好但实现复杂。面试官经常拿一道经典题来考察你对局部性原理的掌握遍历二维数组时按行遍历和按列遍历效率差多少答案是按行遍历快很多。因为二维数组在内存中按行优先存储按行遍历时访问的地址是连续的CPU缓存命中率高按列遍历时跳跃访问缓存命中率低需要频繁从内存加载数据。这个问题日常开发中也可能遇到值得你真正理解。6.3 零散但高频的杂项考点除了上面两大块我还想顺手整理一些经常出现在笔试和一面里的零散高频考点第六天花一两个小时过一遍即可。进程和线程在Linux中的查看命令ps -ef、ps -aux、top、htop操作系统中的用户态和内核态区别用户态权限受限内核态可以执行特权指令程序通过系统调用和中断陷入内核态大端小端字节序大端是高位字节存低地址小端是低位字节存低地址网络字节序是大端x86和ARM通常是小端什么是字节对齐结构体成员按照自身对齐系数对齐结构体总大小必须是最大对齐系数的整数倍原因是为了CPU访问效率栈和堆在内存中的区别栈由编译器自动分配释放地址向下增长空间有限堆由程序员手动分配释放地址向上增长空间较大。6.4 语言相关的八股文第七章的八股文还经常和具体语言绑定出现。考虑到最近搜索热词里Java、C、前端都分别有对应的“八股文”关键词我按方向给你划一下重点你用自己对应的语言方向重点关注。如果是Java方向重点看Java内存区域堆、虚拟机栈、本地方法栈、方法区、程序计数器、JVM垃圾回收算法标记清除、复制、标记整理、垃圾收集器CMS、G1的适用场景和区别、HashMap与ConcurrentHashMap对比、多线程synchronized vs ReentrantLock vs volatile、Spring的Bean生命周期、Spring AOP原理。这类题我在面试里几乎每场都问高频中的高频。如果是C方向重点看智能指针unique_ptr、shared_ptr、weak_ptr的实现原理、引用和指针的区别、虚函数和多态的底层实现虚表、虚表指针、内存泄漏如何排查、左值右值与移动语义、STL容器的底层数据结构。如果是前端方向重点看事件循环Event Loop机制、闭包、原型链、this指向、跨域解决方案、Cookie vs LocalStorage vs SessionStorage、Virtual DOM的原理、前端性能优化。前端面试同样会问计算机基础TCP三次握手、浏览器缓存这些同样要掌握。7. Day 7冲刺自测与面试表达把背下来的话讲成自己的7.1 模拟面试的三步法最后一天我不建议你再看新知识点了。这个阶段的核心任务是“把死记硬背的话讲活”。我常用的方法是三步模拟面试法你可以找个朋友配合或者自己对着镜子、录音软件练。第一步随机抽题。把前面六天整理的所有核心题目写在卡片上随机抽取模拟真实面试的随机性。抽到题后不要马上回答先花十到二十秒组织结构结论是什么、分几个层面展开、用什么案例支撑。第二步限时作答。每道题给自己三到五分钟的作答时间用手机录音。答完之后回放录音重点听两个问题有没有卡顿有没有口头禅。我见过太多候选人书面写答案时逻辑清晰一开口就“嗯、啊、那个”不断这在面试中非常减分。第三步追问演练。让朋友从你的回答里随机挑一个点继续追问。比如你说“线程切换开销小”朋友就问“为什么开销小”你说“B树叶子节点有链表”朋友就问“为什么不直接用链表做索引”。这一步是在模拟面试官层层深入的提问方式最能暴露你知识体系里的薄弱点。7.2 答题节奏与追问应对面试中答题的节奏决定了面试官对你的第一印象。我总结出三条实用的答题节奏经验。第一条先结论后展开。面试官问“进程和线程的区别”你可以先说“进程是资源分配的基本单位线程是CPU调度的基本单位这是最核心的区别”然后展开说地址空间、资源、切换开销、通信方式的差异。先给结论能让面试官快速知道你会这个题展开的部分才是加分项。第二条遇到不会的题不要慌。诚实地说“这个知识点我了解得不够深入”比硬编一个答案好得多。但更好的处理方式是“这个我目前掌握得不太全但我理解它和XXX相关可以从XXX角度尝试分析一下。”这既显示了诚实又展示了你的分析和关联能力。第三条被追问时不要急着回答。面试官抛出一个追问后停顿两三秒思考再开口是完全正常的。很多人一紧张就抢答结果逻辑混乱。我面试时候选人停顿三五秒再给出有条理的回答我的评价反而会更高。7.3 哪些内容可以战略性放弃七天的复习时间有限你必须学会做减法。有些内容属于“投入产出比很低”的类型我建议你战略放弃。第一放弃生僻算法题。七天里遇到没见过的算法题直接看思路不要死磕。面试中现场写不出来的概率很大不如把时间花在基础数据结构和高频题型上。第二放弃大而全的知识体系梳理。比如操作系统整本书的所有细节比如Linux内核的源码实现这些内容没有半年以上积累根本啃不动硬啃七天也只是囫囵吞枣。第三放弃深入底层汇编和硬件细节。这些知识对面试的短期提升几乎为零除非你的目标岗位是底层系统开发。但是有一件事不能放弃高频题目的手写能力。手写快排、手写二分查找、手写前序遍历、手写单例模式这些必须练到肌肉记忆级别。7.4 考前一天的个人经验最后分享几个考前实战经验都是我踩过坑之后总结出来的。第一点把手机里的碎片时间用起来。考前一天和当天不要在休息时间刷短视频改成一个知识点密集的文档或思维导图随时翻看。我当年准备了四十多张索引卡片正面是问题背面是精简答案排队、等车的时候抽几张自测效果好得出奇。第二点睡眠比临时抱佛脚重要。我看到太多人在面试前一晚熬到凌晨两点结果第二天反应迟钝本来会的问题也答得支离破碎。第二天面试是脑力劳动状态比知识量更重要。第三点提前准备两三个“个人亮点问题”。面试基本上会问“最近在做什么项目”或者“你最有成就感的事情”提前想好一个跟计算机基础相关的小故事比如你通过定位CPU飙升解决了一个线上问题这比临场发挥要强得多。第四点千万不要在面试时背答案。哪怕你七天背得很熟也要用“讲给对方听”的语气表达而不是“背课文”的语气。我有一个屡试不爽的小技巧想象对面坐的是一个技术比你弱一点点的朋友你在给他讲清楚这件事。语气自然了面试官对你的评价就会高很多。我把这七天的路给你铺好了每天该做什么、该重点记什么、面试官可能会往哪个方向追问能想到的坑我都先替你们踩了一遍。剩下的事情就是老老实实执行。七天之后你会感谢今天打开这篇内容、并且真正开始动手的自己。
返回列表