计算机大厂工作实习--02 八股必背(题目答案版)
文章目录
- 计算机网络
- 1. 从输入 URL 到页面展示发生了什么?
- 2. 三次握手的过程,以及为什么是三次,而不是四次,两次?
- 3. 四次挥手的过程,以及为什么是四次?
- 4. TCP 与 UDP 的概念、特点、区别和对应的使用场景?
- 5. HTTP 常见的状态码和常见字段有哪些?
- 6. HTTP 有哪些请求方法?GET 和 POST 请求的区别是什么?
- 7. 什么是强缓存和协商缓存?
- 8. HTTP 1.0 和 HTTP 1.1 的区别?
- 9. HTTP 2.0 与 HTTP 1.1 的区别?
- 10. HTTPS 是怎么建立连接的?
- 11. HTTPS 与 HTTP 的区别?
- 12. DNS 是什么?DNS 查询过程是什么?
- 13. HTTP 多个 TCP 连接是如何实现的?
- 14. TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?
- 15. TCP 连接如何确保可靠性?
- 16. 既然提到了拥塞控制,那你能说说拥塞控制是怎么实现的吗?
- 17. Cookie 和 Session 是什么?有什么区别?
- 18. Ping 是怎么工作的?
- 19. 什么是 SYN 攻击?如何避免?
- 20. 什么是对称加密和非对称加密?
- 21. HTTPS 是如何保证数据完整性的?
- 22. 数字证书验证流程是什么?
- 操作系统
- 1. 进程和线程的区别?
- 2. 进程调度算法你了解多少?
- 3. 进程间有哪些通信方式?
- 4. 什么是死锁?如何避免死锁?
- 5. 什么是虚拟内存?为什么需要虚拟内存?
- 6. 什么是内存分段和分页?它们的作用是什么?
- 7. 解释一下用户态和内核态?
- 8. 解释一下页面置换算法,例如 LRU(最近最少使用)、FIFO(先进先出)等?
- 9. 解释一下进程同步和互斥,以及解决这些问题的方法?
- 10. 什么是中断和异常?它们有什么区别?
- 11. 介绍一下几种典型的锁?
- 12. 你知道的线程同步方式有哪些?
- 数据库
- 1. 一条 SQL 查询语句是如何执行的?
- 2. 说一说事务隔离级别?
- 3. 事务的四大特性有哪些?
- 4. 索引有哪些种类?
- 5. MySQL 为什么使用 B+ 树作为索引?它的优势是什么?
- 6. 什么时候需要创建索引?什么时候不需要创建索引?
- 7. 说一下你了解的 MVCC 机制,并说明原理?
- 8. 索引失效的场景有哪些?
- 9. MySQL 的执行引擎有哪些?
- 10. MySQL 日志文件有哪几种?有什么作用?
- 11. MySQL 有哪些锁?作用分别是什么?
- Redis
- 1. Redis 为什么这么快?
- 2. Redis 的数据类型有哪些?
- 3. 说一说 Redis 持久化机制?
- 4. Redis 过期键的删除策略?
- 5. 什么是缓存击穿、缓存穿透、缓存雪崩?
- 6. 如何保证缓存和数据库双写时的一致性?
- 7. Redis 是单线程的还是多线程的?
- 8. Redis 事务的相关命令有哪些?
- 9. Redis 事务支持隔离性吗?为什么不支持回滚?
- 10. 介绍一下 Redis 的哨兵机制?
- 11. Redis 哨兵是如何工作的?
- 12. 了解主从复制的原理吗?
说明:计算机网络,操作系统、数据库的详细答案直接看文档。
计算机网络
1. 从输入 URL 到页面展示发生了什么?
① 浏览器解析 URL,检查本地缓存,并通过 DNS 将域名解析成服务器 IP。
② 浏览器与服务器建立 TCP 连接;如果是 HTTPS,还需要进行 TLS 握手。
③ 浏览器发送 HTTP 请求,服务器处理业务逻辑并返回 HTTP 响应。
④ 浏览器解析 HTML 生成 DOM 树,解析 CSS 生成 CSSOM 树,同时下载并执行 JavaScript。
⑤ DOM 和 CSSOM 结合生成渲染树,经过布局、绘制和图层合成,最终将页面展示出来。
面试时可以概括为:
URL 解析 → 缓存 → DNS → TCP/TLS → HTTP 请求与响应 → DOM/CSSOM → 渲染树 → 布局 → 绘制 → 页面展示。
2. 三次握手的过程,以及为什么是三次,而不是四次,两次?
① 第一次握手:客户端发送 SYN,请求建立连接,并发送自己的初始序列号。
② 第二次握手:服务器返回 SYN + ACK,确认客户端的请求,同时发送自己的初始序列号。
③ 第三次握手:客户端返回 ACK,确认收到了服务器的序列号,双方建立连接。
④ 不能两次,是因为服务器无法确认客户端是否收到了自己的响应,也无法避免失效的历史连接请求造成资源浪费。
⑤ 不需要四次,是因为服务器的确认报文 ACK 和连接请求报文 SYN 可以合并发送。
最核心的一句话是:
三次握手是为了确认双方的收发能力正常,并同步和确认双方的初始序列号;两次不够可靠,四次又可以合并为三次。
3. 四次挥手的过程,以及为什么是四次?
① 第一次挥手:主动关闭方发送 FIN,表示自己没有数据要发送了。
② 第二次挥手:被动关闭方返回 ACK,但此时可能还有数据需要继续发送。
③ 第三次挥手:被动关闭方发送完剩余数据后,再发送 FIN。
④ 第四次挥手:主动关闭方返回 ACK,并进入 TIME_WAIT,等待 2MSL 后关闭。
⑤ 之所以需要四次,是因为 TCP 是全双工通信,两个方向需要分别关闭;服务器收到 FIN 后,ACK 可以立即发送,但 FIN 需要等剩余数据发送完成后才能发送。
最核心的一句话:
TCP 是全双工通信,双方的发送方向需要分别关闭,所以通常需要四次挥手。
、FIFO(先进先出)等?
页面置换算法用于物理内存不足时选择要淘汰的页面。FIFO 淘汰最早进入的页面,实现简单但可能出现 Belady 异常;LRU 淘汰最近最少使用的页面,效果较好但维护成本高;Clock 算法利用访问位近似实现 LRU,是实际系统中常用的方案。
9. 解释一下进程同步和互斥,以及解决这些问题的方法?
互斥是保证同一时刻只有一个线程访问共享资源,同步是保证多个线程按照一定顺序协作执行。常见实现方式包括互斥锁、信号量、条件变量、管程、原子操作和自旋锁。
10. 什么是中断和异常?它们有什么区别?
中断和异常都会使 CPU 暂停当前程序,转而执行相应的处理程序。
中断通常由外部硬件异步触发,例如网卡和定时器;异常由当前指令同步触发,例如缺页、除零和非法访问。两者都会使 CPU 暂停当前任务,进入内核执行对应处理程序。
11. 介绍一下几种典型的锁?
典型锁包括互斥锁、自旋锁、读写锁、悲观锁、乐观锁和可重入锁。互斥锁获取失败会阻塞,自旋锁会持续尝试;读写锁适合读多写少;悲观锁先加锁再操作,乐观锁通常通过 CAS 或版本号在更新时检测冲突。
12. 你知道的线程同步方式有哪些?
线程同步方式主要有互斥锁、信号量、条件变量、读写锁、自旋锁、原子操作、屏障和事件通知。互斥锁解决共享资源竞争,条件变量用于线程等待和通知,信号量限制并发数量,原子操作适合简单且高频的无锁更新。
数据库
1. 一条 SQL 查询语句是如何执行的?
① 客户端先与 MySQL 建立连接并发送 SQL,连接器负责身份认证和权限管理。
② 解析器对 SQL 进行词法、语法分析,预处理器检查表和字段是否存在。
③ 优化器根据索引和统计信息生成执行计划,决定使用哪个索引、表连接顺序等。
④ 执行器按照执行计划调用存储引擎接口,InnoDB 从 Buffer Pool 或磁盘中读取数据,并通过 B+ 树索引定位记录。
⑤ 最后执行器将查询结果返回给客户端。
最适合背诵的一句话:
一条查询 SQL 会依次经过连接器、解析器、预处理器、优化器和执行器,执行器调用存储引擎读取数据,最后将结果返回客户端。
2. 说一说事务隔离级别?
①读未提交(READ UNCOMMITTED):可以读到其他事务尚未提交的数据,可能出现脏读、不可重复读和幻读。
②读已提交(READ COMMITTED):只能读到已提交的数据,解决脏读;但同一事务前后两次读取,结果仍可能不同。
③可重复读(REPEATABLE READ):同一事务多次读取同一行,结果保持一致。InnoDB 默认使用该级别,并通过 MVCC 和锁处理并发读取。
④串行化(SERIALIZABLE):通过让事务串行执行来提供最高隔离性,但并发能力最低。
最核心的一句话:
隔离级别从低到高是读未提交、读已提交、可重复读、串行化;隔离性越强,并发性能通常越低。InnoDB 的可重复读还会结合 MVCC 和临键锁处理快照读取及锁定范围查询。
3. 事务的四大特性有哪些?
①原子性(Atomicity):事务中的操作要么全部成功,要么全部失败,通常通过 undo log 回滚。
②一致性(Consistency):事务执行前后,数据都要满足业务规则和完整性约束。
③隔离性(Isolation):并发事务彼此隔离,避免互相读到不符合隔离级别的数据,主要依靠锁和 MVCC。
④持久性(Durability):事务提交后,结果即使遇到故障也能恢复,InnoDB 主要依靠 redo log。
最核心的一句话:
ACID 分别是原子性、一致性、隔离性和持久性;它们共同保证事务可靠地改变数据。
4. 索引有哪些种类?
①按功能分:有主键索引、唯一索引、普通索引和联合索引。
②按数据存储方式分:有聚簇索引和二级索引。InnoDB 的主键索引是聚簇索引,叶子节点保存整行数据;二级索引的叶子节点保存索引列和主键值。
③按数据结构分:常见的有 B+ 树索引、哈希索引、全文索引和空间索引;具体支持情况与存储引擎有关,InnoDB 最常用的是 B+ 树索引。
最核心的一句话:
面试时可以先按功能介绍主键、唯一、普通和联合索引,再说明 InnoDB 中的聚簇索引与二级索引。
5. MySQL 为什么使用 B+ 树作为索引?它的优势是什么?
① B+ 树的非叶子节点主要保存索引键,单个节点能容纳更多索引项,树的高度较低,查询时磁盘 I/O 较少。
② 所有数据都在叶子节点,查询路径稳定;叶子节点按顺序连接,适合范围查询和排序。
③ 相比哈希索引,B+ 树支持范围查找和有序遍历;相比普通二叉树,B+ 树更适合磁盘页读取。
最核心的一句话:
B+ 树能减少磁盘 I/O,同时支持范围查询和有序遍历,因此适合作为关系型数据库的主要索引结构。
6. 什么时候需要创建索引?什么时候不需要创建索引?
① 经常出现在WHERE、JOIN、ORDER BY、GROUP BY中,并且能明显缩小结果范围的列,通常适合建索引。
② 多列经常一起作为查询条件时,可以按实际查询方式建立联合索引,并注意最左前缀原则;覆盖索引还可以减少回表。
③ 表很小、列区分度很低、字段很少被查询,或写入更新非常频繁时,索引收益可能不大。
④ 索引会占用存储空间,也会增加INSERT、UPDATE、DELETE的维护成本。因此要结合慢查询和EXPLAIN执行计划决定,避免盲目加索引。
最核心的一句话:
索引优先建在高频查询、过滤效果好的列上,同时权衡写入成本、存储占用和实际执行计划。
7. 说一下你了解的 MVCC 机制,并说明原理?
① MVCC 是多版本并发控制,让普通一致性读读取符合事务可见性规则的历史版本,减少读写之间的阻塞。
② InnoDB 通过隐藏字段、undo log 版本链和 Read View 实现 MVCC。数据更新时,旧版本保存在 undo log 中;Read View 根据事务 ID 判断哪个版本对当前事务可见。
③ 在 InnoDB 中,读已提交通常每次一致性读都会生成新的 Read View;可重复读通常在事务第一次一致性读时生成 Read View,并在事务内复用。
④ 普通SELECT通常是快照读;UPDATE、DELETE和SELECT ... FOR UPDATE等属于当前读,会读取较新的记录并按需加锁。
最核心的一句话:
MVCC 通过 undo log 保存数据的历史版本,再通过 Read View 判断当前事务能看到哪个版本,让快照读尽量不阻塞写入。
8. 索引失效的场景有哪些?
①不符合联合索引最左前缀原则:例如联合索引是(a, b),查询只使用b,通常无法有效利用该索引。
②对索引列进行函数或表达式计算:例如对日期列使用DATE(create_time),可能导致索引无法直接用于查找。
③发生隐式类型转换:例如字符串列与数字进行比较,可能导致索引无法有效使用。
④使用前导模糊匹配:例如LIKE '%abc',通常无法利用普通 B+ 树索引定位开头。
⑤使用 OR 时有条件列没有索引:优化器可能选择全表扫描;具体是否走索引要看执行计划。
⑥联合索引中出现范围查询:范围条件之后的列通常不能继续用于缩小索引查找范围,但仍可能参与其他优化。
⑦索引区分度低或表很小:优化器判断全表扫描成本更低时,也可能主动不使用索引。
最核心的一句话:
排查索引问题时,重点看最左前缀、索引列上的函数或类型转换、前导模糊匹配,以及EXPLAIN显示的实际执行计划。
9. MySQL 的执行引擎有哪些?
①InnoDB:最常用的引擎,支持事务、行级锁、外键和崩溃恢复,适合大多数业务表。
②MyISAM:不支持事务,主要使用表级锁,常用于读多写少的场景。
③MEMORY:将表数据保存在内存中,访问速度快,但服务器重启后数据会丢失,适合临时或可重建的数据。
最核心的一句话:
常见引擎有 InnoDB、MyISAM 和 MEMORY;业务表通常优先使用支持事务和崩溃恢复的 InnoDB。
10. MySQL 日志文件有哪几种?有什么作用?
①redo log:InnoDB 的重做日志,记录数据页的修改,用于崩溃恢复,保证事务的持久性。
②undo log:保存数据修改前的旧版本,用于事务回滚,也为 MVCC 提供历史版本。
③binlog:MySQL Server 层的归档日志,记录数据变更,可用于主从复制和时间点恢复。
④relay log:从库保存主库传来的 binlog 内容,用于主从复制。
⑤error log:记录 MySQL 启动、运行和停止过程中的错误及诊断信息。
⑥slow query log:记录执行时间较长的 SQL,用于定位性能问题。
⑦general query log:记录客户端连接和服务器收到的语句,通常按需开启。
最核心的一句话:
redo log 用于崩溃恢复,undo log 用于回滚和 MVCC,binlog 用于归档、复制和恢复;错误日志与慢查询日志分别用于故障排查和性能分析。
11. MySQL 有哪些锁?作用分别是什么?
①按粒度分:有全局锁、表级锁和行级锁。全局锁限制全库写入,表级锁锁定整张表,行级锁只锁相关记录,通常并发能力更高。
②按兼容性分:有共享锁(S 锁)和排他锁(X 锁)。共享锁主要用于读取,允许其他事务继续读取;排他锁用于修改,会阻止其他事务对相关记录进行冲突操作。
③意向锁:InnoDB 用它表示事务准备对表中的行加共享锁或排他锁,便于协调表级锁和行级锁。
④记录锁、间隙锁和临键锁:记录锁锁定索引记录;间隙锁锁定索引记录之间的范围,阻止插入;临键锁是记录锁与间隙锁的组合,用于控制索引范围上的并发。
⑤ InnoDB 的行锁实际是加在索引记录上的;如果查询没有合适的索引,可能扫描并锁定大量记录,影响并发。
最核心的一句话:
面试先说明全局锁、表级锁、行级锁和共享锁、排他锁,再补充 InnoDB 通过记录锁、间隙锁和临键锁控制索引记录及范围上的并发。
Redis
1. Redis 为什么这么快?
① 基于内存存储,读写速度远快于磁盘。
② 采用单线程执行命令,避免了线程切换和锁竞争。
③ 使用I/O 多路复用,可以同时处理大量客户端。
④ 事件驱动。Redis 会将连接、读写等操作注册为事件,当事件就绪后再进行处理,因此能够高效应对大量并发请求。
⑤ 高效的数据结构。
2. Redis 的数据类型有哪些?
有五种数据类型:
① string(最基本的数据类型),
② hash(键值对集合),
③ set(无序集合)
④ zset(有序集合)
⑤ list
3. 说一说 Redis 持久化机制?
作答版:
Redis的持久化机制是为了保证数据在服务器重启或者异常情况下不丢失而设计的,Redis提供了两种主要的持久化方式:
①RDB(特定的时间间隔内生成数据的时间点快照)
②AOF(记录了所有对Redis数据集进行更改的写操作,这些写操作追加到一个文件中)
RDB 类似于定期备份,而 AOF 类似于实时记录。
补充:
①RDB(Redis Database)持久化
RDB是Redis默认的持久化方式,它通过在特定的时间间隔内生成数据的时间点快照来实现持久化。快照文件以二进制的格式保存了Redis在某一时刻的数据集。
RDB持久化的优点是生成的快照文件较小,适用于备份
缺点是如果Redis服务器突然崩溃,可能会丢失最后一次快照之后的数据。
②AOF(Append Only File)持久化
AOF持久化记录了所有对Redis数据集进行更改的写操作,这些写操作以追加的方式写入一个文件中。
当Redis服务器重新启动的时候,它会重新执行AOF文件中记录的写操作,从而恢复数据集的状态。
AOF持久化的优点是提供了更可靠的持久性,因为数据变更操作记录被记录在一个追加的日志文件中,可以减少数据丢失的风险。
缺点是AOF文件通常比RDB文件更大,而且恢复数据时可能需要更长的时间。
RDB 类似于定期备份,而 AOF 类似于实时记录。
4. Redis 过期键的删除策略?
惰性删除。键被访问的时候才检查是否过期,这样做得好处是可以降低redis的CPU使用率,并且避免了定期检查所有键的开销。
惰性删除流程如下:
①当客户端尝试读取一个键时,redis会首先检查是否过期
②如果键已经过期,redis会返回空值(null),并在返回之前删除该键
③如果键未过期,redis将正常返回其值
5. 什么是缓存击穿、缓存穿透、缓存雪崩?
穿透 → 查不存在的数据 → 布隆过滤器 + 空值缓存
击穿 →一个热点key过期 → 互斥锁 + 不过期
雪崩 →一批key同时过期 或 Redis挂了 → 随机过期时间 + 高可用 + 限流
6. 如何保证缓存和数据库双写时的一致性?
没有完美方案,只能尽量降低不一致窗口。
业界主流方案:Cache Aside(旁路缓存)+ 先删库后删缓存
进阶方案:binlog
7. Redis 是单线程的还是多线程的?
Redis 主要采用单线程模型进行命令处理,但在处理网络 I/O 和一些后台任务(比如持久化和集群数据分片)时,会利用多线程来提高效率。核心的键值存储操作是在单个主线程中执行的,这简化了并发控制,同时由于操作都是在内存中进行,因此能够实现极高的性能。
8. Redis 事务的相关命令有哪些?
① MULTI,开启事务,后续命令逐个放入队列中,然后EXEC命令原子化执行这个命令队列
② EXEC,执行事务中所有操作命令
③ DISCARD,放弃执行事务中所有操作命令
④ WATCH,监视一个或多个key,如果事务在执行前,这个key被其他命令修改,则事务被中断,不会执行事务中的任何命令
⑤ UNWATCH,取消WATCH对所有key的监
9. Redis 事务支持隔离性吗?为什么不支持回滚?
redis的事务提供了一种批量执行命令的机制,但不具备ACID特性中的隔离性和回滚功能
10. 介绍一下 Redis 的哨兵机制?
哨兵(Sentinel)机制是一种用来监控和管理Redis服务器是否正常工作以及在需要时进行自动故障转移的系统。哨兵系统可以提高Redis的可用性,确保数据的安全性和服务的连续性。
11. Redis 哨兵是如何工作的?
哨兵每秒向主节点发送心跳检测,ping主节点。当一段时间(十几秒到几十秒)内心跳检测没有收到回复,则这个哨兵主观认为主节点下线。当超过一半数量哨兵认为主节点下线,主节点被认为客观下线,并由哨兵任命一个从节点为主节点。升级逻辑为优先级高的节点,其次是offset大的节点,因为offset大代表这个节点同步的数据多,丢失的信息少。
12. 了解主从复制的原理吗?
主从复制指将一台redis服务器的数据,复制到其他的redis服务器,这种复制是单向异步的。