1. 自我介绍2. 在校成绩如何是否考虑考研为什么想直接工作3. 数组和链表的区别内存存储数组占用连续内存空间链表节点分散存储依靠指针相互关联访问方式数组支持下标随机访问效率 O (1)链表仅能顺序遍历查找效率 O (n)增删操作数组中间增删需挪动元素开销大链表只需修改指针指向增删效率高空间特性数组长度固定容易出现空间浪费或容量不足链表动态扩容灵活节点附带指针存在额外开销使用场景查询居多、数据规模稳定选用数组频繁增删、数据量变化大选用链表4. 既有增删又有查改的场景该选择什么数据结构解决兼顾增删查改首选哈希表存取速度最优需有序操作选平衡树频繁头尾操作选用双向链表。5. 树和跳表增删查改的时间复杂度树平衡二叉搜索树增、删、查均为 \(O(\log n)\)跳表增、删、查平均 \(O(\log n)\)最坏 \(O(n)\)补充简答平衡树性能稳定跳表空间换时间实现更简单6. B树是多叉树其增删查改复杂度为什么还是logN树高\(h\log_m n\)m为阶数每次操作只遍历树的层数不遍历全部节点所以增删查依旧是\(O(\log n)\)。B 树与 B 树核心区别背诵版数据存放B 树所有节点都存完整数据B 树仅叶子节点存真实数据非叶子只存索引键7. 项目里为什么用多叉B树而不用二叉树二叉树层数高、磁盘 IO 多B 树矮胖少层数磁盘读写少查询、范围查找更快。8. B树利用了计算机的什么特性来减少IO依托磁盘块读写、空间局部性与预读特性大幅降低 IO 次数。9. 数据库缓冲池的设计缓冲池是否包含叶子节点和内部节点缓冲池在内存还是磁盘缓冲池位置内存存储节点同时缓存内部节点 非叶子节点 叶子节点缓冲池常驻内存用来缓存磁盘上的 B 树页避免频繁磁盘 IO查询优先走内存缓冲池命中就直接读取没命中再加载磁盘页内部索引页、叶子数据页都会存入缓冲池淘汰机制LRU管控内存页溢出则置换老旧页面10. 数据库不会一次性加载全部数据如何选择缓冲池的缓存内容缓冲池满了用什么替换机制缓存选择优先缓存访问频次高、热点常用的索引页与数据页冷数据暂留磁盘替换机制默认采用LRU 最近最少使用算法访问数据先查缓冲池未命中才从磁盘加载页面入池LRU 规则淘汰最久没被访问的页面腾出空间存放新数据优化变种冷热分区 LRU减少频繁冷热置换提升缓存命中率11. 讲一下LRU算法LRU和LRU-K的主要区别规则缓存满时淘汰最久没被访问的数据特点只记录最后一次访问时间访问一次就刷新优先级缺点突发一次性热点、偶发访问会挤占常驻热点缓存抖动LRU 按单次最近访问淘汰LRU-K 统计多次访问过滤临时热点缓存命中率更高。12. B树叶子节点存大量数据适合用什么子数据结构为什么适合有序链表原因叶子节点首尾相连成双向链表遍历、范围查询只需链表遍历无需回溯上层节点数据天然有序等值、区间检索效率高结构简单插入删除开销小适配磁盘页批量读写链表串联所有数据页全表扫描性能优异13. 内存中数据连续与否对CPU访问效率有没有影响空间局部性原理连续数据地址挨在一起CPU 预读能一次性加载整块数据缓存命中率高。缓存行机制CPU 按缓存行批量读取内存连续数据可充分利用预读离散数据频繁跨缓存行反复访存拖慢速度。寻址开销连续内存下标直接偏移寻址计算快零散数据需额外寻址计算耗时更多。14. TCP报文头有哪些字段源端口、目的端口标识收发应用进程序号 SN标记报文数据偏移保证有序重组确认号 ACK回复期望接收的下一个字节序号数据偏移TCP 头部长度保留位预留未使用6 位标志位URG、ACK、PSH、RST、SYN、FIN窗口大小流量控制告知接收剩余缓存容量校验和校验报文完整性紧急指针标记紧急数据末尾位置选项 填充扩展功能补齐头部对齐15. TCP是流式传输还是报式传输流式传输会遇到什么问题TCP 是流式传输UDP 是报文式传输TCP 流式数据看成连续字节流无边界收发次数不对等粘包拆包常见。UDP 报文式以完整报文为单位一次发一包、一次收一包自带边界不会拆分合并。粘包多个小数据包合并读取边界丢失拆包大数据包被拆分多次接收自定义分隔符、固定报文长度、头部携带数据长度16. TCP报文头里哪些字段特别重要哪些没那么重要重中之重必考核心源 / 目的端口定位收发进程序号、确认号可靠传输、有序重组6 位标志位建连、断连、应答、重置窗口大小流量控制校验和校验数据完整性 次要常用数据偏移标识头部实际长度紧急指针处理紧急数据⚫ 几乎不关注保留位预留占位无实际业务作用填充位仅补齐字节对齐无数据含义选项字段拓展功能常规通信极少用到17. QT信号槽像什么设计模式为什么观察者模式原因存在信号发送者主题与槽函数接收者观察者信号触发时自动通知所有绑定的槽函数执行收发双方低耦合发送方无需知晓接收方细节一对多通信一个信号可绑定多个槽函数18. 为什么不用同步调用而用观察者模式解耦发送方无需依赖接收方不用持有对象、调用函数异步灵活不阻塞主线程事件触发才响应一对多一个事件可同时通知多个处理方同步调用难以便捷实现易扩展新增响应逻辑只需绑定槽不用改动原有代码职责分离触发动作和业务处理相互独立19. OOP面向对象编程的封装、继承、多态核心目标是什么封装的好处是什么封装隔离内外管控数据与行为访问继承代码复用快速扩展类能力多态统一接口不同实现灵活适配20. 平时写代码遇到的主要问题是什么边界异常空值、下标越界、参数非法、临界数值处理疏漏并发线程竞态条件、死锁、数据同步错乱内存问题内存泄漏、野指针、堆内存未及时释放逻辑漏洞分支判断不全、业务逻辑理解偏差性能隐患循环嵌套冗余、频繁 IO、缓存使用不合理兼容性版本接口变更、不同环境运行表现不一致21. 互斥锁和自旋锁的区别互斥锁抢不到锁就休眠不占 CPU自旋锁抢不到锁就循环死等一直占 CPU22. 互斥锁和自旋锁分别适用于什么场景举例说明互斥锁适用持锁耗时久、大概率抢锁失败、存在阻塞操作例子读写文件、数据库操作、网络请求、较长业务计算自旋锁适用临界区执行极短、抢锁成功率高、无休眠阻塞例子内核计数器增减、简短变量状态修改、硬件寄存器读写23. 项目里为什么选择互斥锁临界区执行耗时较长含 IO、业务运算自旋空耗 CPU 得不偿失并发竞争激烈抢锁失败概率高休眠释放 CPU 资源利用率更高避免长时间忙等占用内核资源防止系统卡顿支持线程休眠唤醒机制适配复杂业务同步场景不易出现死循环卡死稳定性更强24. 数据库项目中乐观锁和悲观锁分别用在什么场景悲观锁Pessimistic Lock默认认为一定会发生并发冲突所以先加锁再操作适用场景写多读少、并发冲突高、数据一致性要求极高订单支付、金融交易乐观锁Optimistic Lock默认认为冲突很少发生不加锁更新时才检查是否被修改适用场景读多写少、并发冲突低、追求高性能文章阅读、数据查询25. 数据库B树插入/删除时乐观锁的具体实现思路不靠事务排他锁定依靠版本号校验更新时判断数据是否被改动未变动才执行增删失败则重试。26. 通信项目的多聊天功能用的是多线程还是多进程为什么用多线程绝对不用多进程太重启动慢、占内存大进程间不能直接共享数据通信麻烦管道 / 消息队列 / 共享内存不适合大量短连接、高并发聊天场景27. 线程和进程的区别资源归属进程是资源分配最小单位线程是调度执行最小单位。线程共享进程内存、文件句柄进程资源相互独立。开销成本进程创建销毁、切换开销大线程体量轻切换损耗小。通信方式线程直接读写共享内存交互进程需管道、套接字、共享内存等 IPC 方式。容错影响单个线程崩溃所属进程整体退出进程崩溃互不影响其他进程。从属关系一个进程至少含一个主线程线程不能脱离进程独立存在。28. 什么情况用线程什么情况用进程适用线程IO 密集型聊天、网络请求、文件读写、数据库查询需频繁共享数据共用用户数据、缓存、连接池追求低开销大量并发任务频繁创建销毁任务关联性高同业务模块内拆分执行适用进程CPU 密集型大规模计算、图像运算、加密解码强隔离容错模块崩溃互不影响保障整体稳定多核充分调度利用多核 CPU 并行算力权限 / 资源隔离独立内存空间避免数据互相干扰29. 进程之间有哪些共享资源文件资源磁盘文件、目录、硬件设备文件网络资源端口、套接字连接内核对象信号量、消息队列、共享内存、管道系统全局配置系统时间、环境变量、主机硬件信息外设资源显示器、键盘、打印机等硬件设备30. Linux上程序启动时申请内存的过程程序启动时不是立刻向物理内存申请空间而是先申请虚拟内存真正使用时才分配物理内存。1. 内核创建进程分配 PID系统调用fork/exec内核创建进程结构分配唯一 PID。2. 分配虚拟地址空间关键内核给进程分配虚拟内存不是物理内存代码段.text数据段.data/.bss堆heap栈stack这一步不占用物理内存。3. 建立页表虚拟→物理映射内核创建页表用于后续虚拟地址和物理地址的转换。4. 加载程序代码到虚拟空间把可执行文件的代码、数据映射到虚拟地址空间依然不分配物理内存。5. 启动进程触发缺页异常真正分配物理内存CPU 执行第一条指令时发现虚拟地址没有对应物理内存触发缺页中断内核才真正分配物理内存页更新页表映射程序继续运行6. 堆内存动态分配malloc程序运行中用malloc申请内存先扩大堆的虚拟地址空间真正写入数据时才分配物理内存一句话总结背这个先分配虚拟地址空间建立页表不立即分配物理内存程序真正访问数据、执行代码时通过缺页异常才分配物理内存。31. 32位系统下程序运行需要200兆内存会申请多大内存32 位系统单个进程虚拟地址空间上限4GB程序声明需要 200MB先申请 200MB 虚拟内存实际物理内存不会一次性开满按需缺页分配。32. 虚拟内存的页面大小32位系统的虚拟内存大小页面大小Linux 默认页大小4KB常见规格4KB、2MB、1GB 大页二、32 位进程虚拟内存总寻址空间\(2^{32}4294967296\) 字节 4GB33. 冯诺依曼架构的组成部分运算器算术、逻辑运算控制器指挥协调整机运行存储器存放数据与指令输入设备向外接收数据输出设备向外输出结果34. 32位系统的“32”指代什么指代CPU 一次处理的二进制位数核心两层含义字长 32 位通用寄存器、数据总线单次运算传输 32 位数据地址总线 32 位寻址范围最大\(2^{32}\)对应 4GB 地址空间35. Linux下执行 int *p 0x10; printf(*p); 的运行结果崩溃发生在哪个阶段为什么程序直接崩溃段错误 Segmentation Fault赋值不崩溃解引用崩溃因为强行访问了进程没有权限的非法内存地址。段错误Segmentation Fault / SIGSEGV定义程序访问无权限、非法、未映射的内存区域操作系统终止程序并抛出报错。36. 手写快速排序含测试用例支持递归/非递归
影石-嵌软
发布时间:2026/5/23 9:26:07
1. 自我介绍2. 在校成绩如何是否考虑考研为什么想直接工作3. 数组和链表的区别内存存储数组占用连续内存空间链表节点分散存储依靠指针相互关联访问方式数组支持下标随机访问效率 O (1)链表仅能顺序遍历查找效率 O (n)增删操作数组中间增删需挪动元素开销大链表只需修改指针指向增删效率高空间特性数组长度固定容易出现空间浪费或容量不足链表动态扩容灵活节点附带指针存在额外开销使用场景查询居多、数据规模稳定选用数组频繁增删、数据量变化大选用链表4. 既有增删又有查改的场景该选择什么数据结构解决兼顾增删查改首选哈希表存取速度最优需有序操作选平衡树频繁头尾操作选用双向链表。5. 树和跳表增删查改的时间复杂度树平衡二叉搜索树增、删、查均为 \(O(\log n)\)跳表增、删、查平均 \(O(\log n)\)最坏 \(O(n)\)补充简答平衡树性能稳定跳表空间换时间实现更简单6. B树是多叉树其增删查改复杂度为什么还是logN树高\(h\log_m n\)m为阶数每次操作只遍历树的层数不遍历全部节点所以增删查依旧是\(O(\log n)\)。B 树与 B 树核心区别背诵版数据存放B 树所有节点都存完整数据B 树仅叶子节点存真实数据非叶子只存索引键7. 项目里为什么用多叉B树而不用二叉树二叉树层数高、磁盘 IO 多B 树矮胖少层数磁盘读写少查询、范围查找更快。8. B树利用了计算机的什么特性来减少IO依托磁盘块读写、空间局部性与预读特性大幅降低 IO 次数。9. 数据库缓冲池的设计缓冲池是否包含叶子节点和内部节点缓冲池在内存还是磁盘缓冲池位置内存存储节点同时缓存内部节点 非叶子节点 叶子节点缓冲池常驻内存用来缓存磁盘上的 B 树页避免频繁磁盘 IO查询优先走内存缓冲池命中就直接读取没命中再加载磁盘页内部索引页、叶子数据页都会存入缓冲池淘汰机制LRU管控内存页溢出则置换老旧页面10. 数据库不会一次性加载全部数据如何选择缓冲池的缓存内容缓冲池满了用什么替换机制缓存选择优先缓存访问频次高、热点常用的索引页与数据页冷数据暂留磁盘替换机制默认采用LRU 最近最少使用算法访问数据先查缓冲池未命中才从磁盘加载页面入池LRU 规则淘汰最久没被访问的页面腾出空间存放新数据优化变种冷热分区 LRU减少频繁冷热置换提升缓存命中率11. 讲一下LRU算法LRU和LRU-K的主要区别规则缓存满时淘汰最久没被访问的数据特点只记录最后一次访问时间访问一次就刷新优先级缺点突发一次性热点、偶发访问会挤占常驻热点缓存抖动LRU 按单次最近访问淘汰LRU-K 统计多次访问过滤临时热点缓存命中率更高。12. B树叶子节点存大量数据适合用什么子数据结构为什么适合有序链表原因叶子节点首尾相连成双向链表遍历、范围查询只需链表遍历无需回溯上层节点数据天然有序等值、区间检索效率高结构简单插入删除开销小适配磁盘页批量读写链表串联所有数据页全表扫描性能优异13. 内存中数据连续与否对CPU访问效率有没有影响空间局部性原理连续数据地址挨在一起CPU 预读能一次性加载整块数据缓存命中率高。缓存行机制CPU 按缓存行批量读取内存连续数据可充分利用预读离散数据频繁跨缓存行反复访存拖慢速度。寻址开销连续内存下标直接偏移寻址计算快零散数据需额外寻址计算耗时更多。14. TCP报文头有哪些字段源端口、目的端口标识收发应用进程序号 SN标记报文数据偏移保证有序重组确认号 ACK回复期望接收的下一个字节序号数据偏移TCP 头部长度保留位预留未使用6 位标志位URG、ACK、PSH、RST、SYN、FIN窗口大小流量控制告知接收剩余缓存容量校验和校验报文完整性紧急指针标记紧急数据末尾位置选项 填充扩展功能补齐头部对齐15. TCP是流式传输还是报式传输流式传输会遇到什么问题TCP 是流式传输UDP 是报文式传输TCP 流式数据看成连续字节流无边界收发次数不对等粘包拆包常见。UDP 报文式以完整报文为单位一次发一包、一次收一包自带边界不会拆分合并。粘包多个小数据包合并读取边界丢失拆包大数据包被拆分多次接收自定义分隔符、固定报文长度、头部携带数据长度16. TCP报文头里哪些字段特别重要哪些没那么重要重中之重必考核心源 / 目的端口定位收发进程序号、确认号可靠传输、有序重组6 位标志位建连、断连、应答、重置窗口大小流量控制校验和校验数据完整性 次要常用数据偏移标识头部实际长度紧急指针处理紧急数据⚫ 几乎不关注保留位预留占位无实际业务作用填充位仅补齐字节对齐无数据含义选项字段拓展功能常规通信极少用到17. QT信号槽像什么设计模式为什么观察者模式原因存在信号发送者主题与槽函数接收者观察者信号触发时自动通知所有绑定的槽函数执行收发双方低耦合发送方无需知晓接收方细节一对多通信一个信号可绑定多个槽函数18. 为什么不用同步调用而用观察者模式解耦发送方无需依赖接收方不用持有对象、调用函数异步灵活不阻塞主线程事件触发才响应一对多一个事件可同时通知多个处理方同步调用难以便捷实现易扩展新增响应逻辑只需绑定槽不用改动原有代码职责分离触发动作和业务处理相互独立19. OOP面向对象编程的封装、继承、多态核心目标是什么封装的好处是什么封装隔离内外管控数据与行为访问继承代码复用快速扩展类能力多态统一接口不同实现灵活适配20. 平时写代码遇到的主要问题是什么边界异常空值、下标越界、参数非法、临界数值处理疏漏并发线程竞态条件、死锁、数据同步错乱内存问题内存泄漏、野指针、堆内存未及时释放逻辑漏洞分支判断不全、业务逻辑理解偏差性能隐患循环嵌套冗余、频繁 IO、缓存使用不合理兼容性版本接口变更、不同环境运行表现不一致21. 互斥锁和自旋锁的区别互斥锁抢不到锁就休眠不占 CPU自旋锁抢不到锁就循环死等一直占 CPU22. 互斥锁和自旋锁分别适用于什么场景举例说明互斥锁适用持锁耗时久、大概率抢锁失败、存在阻塞操作例子读写文件、数据库操作、网络请求、较长业务计算自旋锁适用临界区执行极短、抢锁成功率高、无休眠阻塞例子内核计数器增减、简短变量状态修改、硬件寄存器读写23. 项目里为什么选择互斥锁临界区执行耗时较长含 IO、业务运算自旋空耗 CPU 得不偿失并发竞争激烈抢锁失败概率高休眠释放 CPU 资源利用率更高避免长时间忙等占用内核资源防止系统卡顿支持线程休眠唤醒机制适配复杂业务同步场景不易出现死循环卡死稳定性更强24. 数据库项目中乐观锁和悲观锁分别用在什么场景悲观锁Pessimistic Lock默认认为一定会发生并发冲突所以先加锁再操作适用场景写多读少、并发冲突高、数据一致性要求极高订单支付、金融交易乐观锁Optimistic Lock默认认为冲突很少发生不加锁更新时才检查是否被修改适用场景读多写少、并发冲突低、追求高性能文章阅读、数据查询25. 数据库B树插入/删除时乐观锁的具体实现思路不靠事务排他锁定依靠版本号校验更新时判断数据是否被改动未变动才执行增删失败则重试。26. 通信项目的多聊天功能用的是多线程还是多进程为什么用多线程绝对不用多进程太重启动慢、占内存大进程间不能直接共享数据通信麻烦管道 / 消息队列 / 共享内存不适合大量短连接、高并发聊天场景27. 线程和进程的区别资源归属进程是资源分配最小单位线程是调度执行最小单位。线程共享进程内存、文件句柄进程资源相互独立。开销成本进程创建销毁、切换开销大线程体量轻切换损耗小。通信方式线程直接读写共享内存交互进程需管道、套接字、共享内存等 IPC 方式。容错影响单个线程崩溃所属进程整体退出进程崩溃互不影响其他进程。从属关系一个进程至少含一个主线程线程不能脱离进程独立存在。28. 什么情况用线程什么情况用进程适用线程IO 密集型聊天、网络请求、文件读写、数据库查询需频繁共享数据共用用户数据、缓存、连接池追求低开销大量并发任务频繁创建销毁任务关联性高同业务模块内拆分执行适用进程CPU 密集型大规模计算、图像运算、加密解码强隔离容错模块崩溃互不影响保障整体稳定多核充分调度利用多核 CPU 并行算力权限 / 资源隔离独立内存空间避免数据互相干扰29. 进程之间有哪些共享资源文件资源磁盘文件、目录、硬件设备文件网络资源端口、套接字连接内核对象信号量、消息队列、共享内存、管道系统全局配置系统时间、环境变量、主机硬件信息外设资源显示器、键盘、打印机等硬件设备30. Linux上程序启动时申请内存的过程程序启动时不是立刻向物理内存申请空间而是先申请虚拟内存真正使用时才分配物理内存。1. 内核创建进程分配 PID系统调用fork/exec内核创建进程结构分配唯一 PID。2. 分配虚拟地址空间关键内核给进程分配虚拟内存不是物理内存代码段.text数据段.data/.bss堆heap栈stack这一步不占用物理内存。3. 建立页表虚拟→物理映射内核创建页表用于后续虚拟地址和物理地址的转换。4. 加载程序代码到虚拟空间把可执行文件的代码、数据映射到虚拟地址空间依然不分配物理内存。5. 启动进程触发缺页异常真正分配物理内存CPU 执行第一条指令时发现虚拟地址没有对应物理内存触发缺页中断内核才真正分配物理内存页更新页表映射程序继续运行6. 堆内存动态分配malloc程序运行中用malloc申请内存先扩大堆的虚拟地址空间真正写入数据时才分配物理内存一句话总结背这个先分配虚拟地址空间建立页表不立即分配物理内存程序真正访问数据、执行代码时通过缺页异常才分配物理内存。31. 32位系统下程序运行需要200兆内存会申请多大内存32 位系统单个进程虚拟地址空间上限4GB程序声明需要 200MB先申请 200MB 虚拟内存实际物理内存不会一次性开满按需缺页分配。32. 虚拟内存的页面大小32位系统的虚拟内存大小页面大小Linux 默认页大小4KB常见规格4KB、2MB、1GB 大页二、32 位进程虚拟内存总寻址空间\(2^{32}4294967296\) 字节 4GB33. 冯诺依曼架构的组成部分运算器算术、逻辑运算控制器指挥协调整机运行存储器存放数据与指令输入设备向外接收数据输出设备向外输出结果34. 32位系统的“32”指代什么指代CPU 一次处理的二进制位数核心两层含义字长 32 位通用寄存器、数据总线单次运算传输 32 位数据地址总线 32 位寻址范围最大\(2^{32}\)对应 4GB 地址空间35. Linux下执行 int *p 0x10; printf(*p); 的运行结果崩溃发生在哪个阶段为什么程序直接崩溃段错误 Segmentation Fault赋值不崩溃解引用崩溃因为强行访问了进程没有权限的非法内存地址。段错误Segmentation Fault / SIGSEGV定义程序访问无权限、非法、未映射的内存区域操作系统终止程序并抛出报错。36. 手写快速排序含测试用例支持递归/非递归