计算机基础(for 面试 八股文)
·
一、计算机基础(操作系统)
1. 进程与线程的区别?
答:
- 进程:独立的内存空间,资源开销大,切换成本高。
- 线程:共享进程的内存空间,资源开销小,切换成本低。
- 关键区别:
- 线程是 CPU 调度的基本单位,进程是资源分配的基本单位。
- 进程间通信(IPC)复杂,线程间通信简单(共享内存)。
- 多线程可能引发竞态条件,需同步机制(锁、信号量等)。
2. 死锁的四个必要条件?如何避免死锁?
答:
- 必要条件:
- 互斥(资源不可共享)
- 占有并等待(持有资源等待其他资源)
- 非抢占(资源不能强制剥夺)
- 循环等待(形成资源请求环)
- 避免方法:
- 破坏循环等待:资源编号,按顺序申请。
- 银行家算法:预判资源分配是否安全。
- 超时机制:资源等待超时后释放已占资源。
3. 什么是虚拟内存?它解决了什么问题?
答:
- 虚拟内存:通过页表将物理内存映射到逻辑地址空间,允许程序使用比实际物理内存更大的地址空间。
- 解决的问题:
- 内存隔离:每个进程拥有独立的地址空间。
- 内存扩展:通过磁盘交换(Swap)实现物理内存不足时的扩展。
- 简化内存管理:程序员无需关心物理内存布局。
4. 文件系统中 inode 的作用?
答:
- Inode 是文件系统中存储文件元信息的数据结构,包含:
- 文件大小、权限、所有者、时间戳、数据块指针等。
- 作用:
- 文件名与 inode 关联,实现文件内容的存储和管理。
- 支持硬链接(多个文件名指向同一 inode)。
5. 什么是页表?页表的作用?
答:
- 页表:将虚拟地址转换为物理地址的映射表。
- 作用:
- 实现虚拟内存管理。
- 支持分页(Page)机制,减少内存碎片。
- 提供访问权限控制(读/写/执行)。
二、计算机网络
1. OSI 七层模型和 TCP/IP 四层模型的区别?
答:
复制
| OSI 七层模型 | TCP/IP 四层模型 |
|---|---|
| 物理层 | 网络接口层 |
| 数据链路层 | 网络接口层 |
| 网络层 | 网络层 |
| 传输层 | 传输层 |
| 会话层 | 应用层 |
| 表示层 | 应用层 |
| 应用层 | 应用层 |
2. TCP 和 UDP 的区别?
答:
复制
| 特性 | TCP | UDP |
|---|---|---|
| 可靠性 | 可靠(确认机制、重传) | 不可靠(无确认) |
| 连接 | 面向连接(三次握手) | 无连接 |
| 传输顺序 | 保证顺序 | 不保证顺序 |
| 头部开销 | 大(20~60 字节) | 小(8 字节) |
| 适用场景 | 文件传输、网页浏览 | 视频流、实时通信 |
3. TCP 三次握手和四次挥手的过程?
答:
- 三次握手:
- 客户端 → 服务端:SYN=1, seq=x
- 服务端 → 客户端:SYN=1, ACK=1, seq=y, ack=x+1
- 客户端 → 服务端:ACK=1, ack=y+1
- 四次挥手:
- 客户端 → 服务端:FIN=1, seq=u
- 服务端 → 客户端:ACK=1, seq=v, ack=u+1
- 服务端 → 客户端:FIN=1, seq=w, ack=u+1
- 客户端 → 服务端:ACK=1, seq=u+1, ack=w+1
4. HTTP 和 HTTPS 的区别?
答:
- HTTP:
- 明文传输,不安全。
- 默认端口 80。
- HTTPS:
- 基于 TLS/SSL 加密,安全。
- 默认端口 443。
- 通过证书验证服务器身份(防止中间人攻击)。
5. HTTP 状态码 200、301、404、500 各代表什么含义?
答:
- 200 OK:请求成功。
- 301 Moved Permanently:资源已永久移动。
- 404 Not Found:资源不存在。
- 500 Internal Server Error:服务器内部错误。
6. DNS 的工作原理?
答:
- 流程:
- 客户端 → 本地 DNS 缓存。
- 本地 DNS → 根域名服务器 → 顶级域名服务器 → 权威域名服务器。
- 返回 IP 地址。
- 缓存机制:减少重复查询,提高效率。
三、数据结构与算法
1. 快速排序的时间复杂度?最坏情况是什么?
答:
- 平均时间复杂度:O(n log n)
- 最坏情况:O(n²)(当每次划分极不平衡时,如已排序数组)
2. 哈希表的冲突解决方法?
答:
- 开放寻址法:线性探测、二次探测、双重散列。
- 链地址法:每个桶挂一个链表或红黑树(Java 8+ 中当链表长度 > 8 时转红黑树)。
3. B 树和 B+ 树的区别?
答:
- B 树:非叶子节点可存储数据,适合磁盘读取。
- B+ 树:所有数据存储在叶子节点,叶子节点通过指针相连,适合范围查询(如数据库索引)。
4. 图的遍历算法(DFS 和 BFS)?
答:
- DFS(深度优先):递归或栈实现,适用于路径搜索。
- BFS(广度优先):队列实现,适用于最短路径问题。
四、系统设计与分布式
1. 如何设计一个分布式锁?
答:
- 方案:
- Redis 分布式锁:使用
SET key value NX PX命令,设置过期时间。 - Zookeeper:通过临时顺序节点实现。
- Redis 分布式锁:使用
- 关键点:
- 避免死锁(自动过期)。
- 容错(主从一致性)。
2. CAP 定理的含义?如何取舍?
答:
- CAP 定理:一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance),三者不可兼得。
- 取舍:
- CP 系统:牺牲可用性,保证一致性和分区容忍(如 Zookeeper)。
- AP 系统:牺牲一致性,保证可用性和分区容忍(如 Cassandra)。
3. 如何设计一个高并发的秒杀系统?
答:
- 关键点:
- 限流:令牌桶算法、漏桶算法。
- 缓存:热点商品缓存(Redis)。
- 异步处理:订单写入队列(Kafka/RabbitMQ),异步处理。
- 数据库分库分表:减少单表压力。
五、开放性问题
1. 如何优化一个慢查询的数据库?
答:
- 索引优化:添加合适的索引,避免全表扫描。
- 查询优化:避免 SELECT *,使用分页。
- 缓存:使用 Redis 缓存热点数据。
- 分库分表:水平或垂直拆分。
2. 如何设计一个分布式任务调度系统?
答:
- 核心组件:
- 任务队列:Kafka/RabbitMQ。
- 调度器:Zookeeper 分布式锁。
- 任务执行器:Worker 节点拉取任务。
- 容错:任务失败重试、超时机制。
六、编程题(可能结合基础知识)
1. 实现一个生产者-消费者模型(多线程)?
答:
- 使用线程锁(
threading.Lock)或条件变量(threading.Condition)。 - 通过共享队列(
queue.Queue)实现线程间通信。
2. 用 TCP 实现一个简单的客户端-服务器通信?
答:
- 服务器:
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('0.0.0.0', 8080)) s.listen(1) conn, addr = s.accept() data = conn.recv(1024) conn.send(b'Hello') - 客户端:
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost', 8080)) s.send(b'Hi') data = s.recv(1024)
总结:高频考点
复制
| 领域 | 常考知识点 |
|---|---|
| 操作系统 | 进程/线程、死锁、虚拟内存、文件系统 |
| 网络 | TCP/UDP、HTTP/HTTPS、DNS、三次握手 |
| 算法 | 排序、哈希、图遍历、B 树 |
| 系统设计 | 分布式锁、CAP 定理、高并发设计 |
| 编程 | 多线程、TCP 通信、数据库优化 |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)