2022-03-26 15:24:39
基础问题
自我介绍、实习与项目经历:需清晰阐述技术栈、项目角色及成果。
大端法与小端法:大端模式(高位字节存储在低地址),小端模式(低位字节存储在低地址)。
判断机器字节序的C/C++实现:通过联合体(union)或指针强制转换读取多字节数据的首字节判断。
MySQL锁机制:
锁类型:表级锁(如MyISAM)、行级锁(如InnoDB)。
对比:行级锁并发度高但开销大,表级锁反之。
OS死锁:定义、必要条件(互斥、占有并等待、非抢占、循环等待)及预防策略。
OS锁类型:互斥锁、自旋锁、读写锁、信号量等。
自旋锁实现:通过原子操作(如CAS)实现,不可被打断(忙等待)。
MySQL索引:B+树结构、聚簇索引与非聚簇索引、覆盖索引优化。
Linux日志提取:使用grep(如grep -o 'pwd=[^ ]*')或awk。
进程查看:ps aux、top;查看新启动程序可结合pstree或htop过滤。
TCP三次握手:SYN→SYN+ACK→ACK,建立双向通信通道。
TCP四次挥手:FIN→ACK→FIN→ACK,确保数据完整传输。
SYN拒绝处理:服务端发送RST包终止连接请求。
端口号:SSH(22)、DNS(53)。
调试工具:GDB、Valgrind、Log分析等。
GDB调试进程崩溃:通过核心转储文件(core dump)分析崩溃点。
GDB断点操作:break <位置>设置断点,info breakpoints查看所有断点。
new返回值:成功返回指针,失败抛出std::bad_alloc异常。
C与C++区别:面向对象、STL、异常处理、内存管理等。
手撕哈希表:需实现键值存储、冲突处理(如链地址法)。
失利原因
网络编程知识不足:对TCP/IP协议栈、Socket编程等理解停留在表面,未深入底层机制。
手撕算法未优化:哈希表实现未采用高效方法(如一次遍历构建),导致面试官不满意。
深度追问与项目细节
TCP三次握手信息:序列号(ISN)、窗口大小、MSS等字段的作用。
MSS定义:最大分段大小,受MTU限制(通常为1460字节)。
快速重传机制:收到3个重复ACK时触发重传,无需等待超时。
Ping实现原理:发送ICMP Echo请求包,通过超时或响应判断网络连通性。
网络编程经验:需熟悉Socket API、IO多路复用(select/epoll)等。
select与epoll区别:
select:轮询机制,有文件描述符数量限制(1024)。
epoll:事件驱动,支持边缘触发(ET)和水平触发(LT),无数量限制。
Redis作用:缓存热点数据、分布式锁、计数器等。
QPS阈值:通常当QPS超过数据库承载能力(如数千至数万)时引入Redis。
MySQL锁复述:需深入行锁实现(如InnoDB的记录锁、间隙锁)。
大小端转换:通过htonl/ntohl等函数或手动字节交换实现。
项目性能瓶颈分析:
工具:GDB、Perf、Valgrind、火焰图等。
常见原因:CPU密集型计算、锁竞争、IO阻塞、内存碎片等。
印象深刻Bug:需体现问题定位、解决过程及总结反思。
内存泄漏防护:使用智能指针、RAII机制、内存检测工具(如Valgrind)。
智能指针实现:通过引用计数(如shared_ptr)或所有权模型(如unique_ptr)管理资源。
手撕算法(LeetCode 33):搜索旋转排序数组,需在O(log n)时间内完成。
失利原因
网络编程准备不足:对epoll、TCP优化等高级主题缺乏实践经验。
算法优化能力欠缺:未给出最优解(如一次二分查找),暴露编码熟练度问题。
技术深度
网络编程:重点复习TCP/IP协议栈、Socket编程、IO多路复用、拥塞控制等。
数据库:深入理解锁机制、事务隔离级别、索引优化、MVCC等。
操作系统:掌握进程/线程调度、内存管理、同步原语(如自旋锁、信号量)。
C++特性:熟悉智能指针、移动语义、多线程编程、STL容器与算法。
算法与编码
刷题方向:优先练习数组、链表、二叉树、动态规划等高频题型,注重时间复杂度优化。
手撕技巧:与面试官沟通思路,明确边界条件,编写可读性高的代码。
项目经验
量化成果:用数据体现项目价值(如QPS提升、延迟降低)。
难点突破:准备1-2个技术挑战案例,展示问题分析与解决能力。
资源推荐
笔面经平台:牛客网、LeetCode讨论区、GitHub技术博客。
书籍:《TCP/IP详解》《Effective C++》《MySQL技术内幕》。
工具:Wireshark(网络抓包)、GDB(调试)、Perf(性能分析)。