1789 字
5 分钟
计算机基础面试题
一、网络七层模型以及每层的常用协议
1.1 OSI 七层模型
| 层级 | 名称 | 核心功能 | 典型协议 |
|---|---|---|---|
| 7 | 应用层 | 为用户提供接口服务 | HTTP、DNS、FTP、SMTP |
| 6 | 表示层 | 数据格式转换、加密解密 | TLS、SSL |
| 5 | 会话层 | 管理通信会话 | NetBIOS、SOCKS |
| 4 | 传输层 | 端到端连接、流量控制 | TCP、UDP |
| 3 | 网络层 | 路由选择、IP 寻址 | IP、ICMP、ARP |
| 2 | 数据链路层 | 帧同步、MAC 寻址 | Ethernet、PPP |
| 1 | 物理层 | 比特流传输 | RJ45、光纤 |
1.2 TCP/IP 四层模型
实际工作中更常用的是 TCP/IP 四层模型:
| 层级 | 对应 OSI | 典型协议 |
|---|---|---|
| 应用层 | 5-7 层 | HTTP、DNS、SSH |
| 传输层 | 4 层 | TCP、UDP |
| 网络层 | 3 层 | IP、ICMP、路由器 |
| 网络接口层 | 1-2 层 | Ethernet、ARP |
1.3 TCP 三次握手与四次挥手
三次握手建立连接:
客户端 服务端 │ │ │────── SYN (seq=x) ────────▶│ 第一次:客户端发送 SYN │ │ │◀───── SYN+ACK (seq=y,ack=x+1)──│ 第二次:服务端返回 SYN+ACK │ │ │────── ACK (ack=y+1) ──────▶│ 第三次:客户端发送 ACK │ │ │ 连接建立完成 │四次挥手断开连接:
客户端 服务端 │ │ │────── FIN (seq=u) ────────▶│ 第一次:客户端发送 FIN │◀──────── ACK (ack=u+1) ────│ 第二次:服务端确认(客户端不再发送,但可以接收) │ │ │◀────── FIN (seq=w) ───────│ 第三次:服务端发送 FIN │ │ │────── ACK (ack=w+1) ──────▶│ 第四次:客户端确认(等待 2MSL 后关闭) │ │为什么是三次握手:
- 两次握手无法确认双方的发送和接收能力都正常
- 三次握手是确认双方「发送+接收」能力的最小次数
为什么是四次挥手:
- TCP 是全双工连接,需要双向各自关闭
- 服务端收到 FIN 后先回复 ACK,等应用层处理完再发 FIN
1.4 TCP 与 UDP 对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 可靠、有重传、拥塞控制 | 不可靠,不保证送达 |
| 效率 | 低(需要确认、重传) | 高(无额外开销) |
| 场景 | 文件传输、邮件、Web | 视频流、DNS、语音通话 |
1.5 HTTP 常见状态码
| 类别 | 范围 | 含义 |
|---|---|---|
| 1xx | 100-199 | 信息性状态码 |
| 2xx | 200-299 | 成功 |
| 3xx | 300-399 | 重定向 |
| 4xx | 400-499 | 客户端错误 |
| 5xx | 500-599 | 服务器错误 |
常用状态码:
- 200:OK,请求成功
- 301:永久重定向
- 302:临时重定向
- 304:缓存未修改
- 400:请求语法错误
- 401:未认证
- 403:无权限
- 404:资源不存在
- 500:服务器内部错误
- 502:网关错误
- 504:网关超时
1.6 DNS 解析过程
浏览器缓存 → 系统缓存 → 本地 DNS 服务器 → 根域名服务器 → 顶级域名服务器 → 权威域名服务器递归查询:客户端只发一次请求,本地 DNS 负责全部查询过程
迭代查询:DNS 服务器返回可查询的下一级服务器地址,客户端自行继续查询
二、进程间通信有哪些方式?
2.1 同一主机进程间通信
| 方式 | 原理 | 特点 |
|---|---|---|
| 管道(Pipe) | 内核缓冲区,单向流动 | 简单,只能亲缘进程 |
| 命名管道(FIFO) | 有名管道,支持非亲缘进程 | 磁盘文件,持久化 |
| 消息队列 | 内核消息链表 | 异步,消息持久化 |
| 共享内存 | 映射同一块物理内存 | 最快,但需同步 |
| 信号 | 异步信号通知 | 轻量,无法传输大量数据 |
| 信号量 | 计数器,实现同步互斥 | 常与共享内存配合 |
2.2 共享内存详解
共享内存是最快的 IPC 方式,因为数据无需在用户态和内核态之间复制:
// 创建共享内存int shmid = shmget(key, SIZE, IPC_CREAT | 0666);
// 映射到进程地址空间void *shmaddr = shmat(shmid, NULL, 0);
// 读写共享内存(直接像访问内存一样)((int *)shmaddr)[0] = 100;
// 解除映射shmdt(shmaddr);
// 删除共享内存shmctl(shmid, IPC_RMID, NULL);2.3 不同主机进程间通信
| 方式 | 说明 |
|---|---|
| Socket | 最通用,TCP/UDP 可跨主机 |
| RPC | 远程过程调用,隐藏网络细节 |
| 消息队列 | 如 RabbitMQ、Kafka |
三、进程与线程的区别
3.1 基本概念
**进程(Process)**是资源分配的基本单位,拥有独立的地址空间、文件描述符、信号处理等资源。
**线程(Thread)**是 CPU 调度的基本单位,同一进程的线程共享进程的地址空间和资源。
3.2 对比
| 维度 | 进程 | 线程 |
|---|---|---|
| 资源占用 | 独立虚拟地址空间 | 共享进程资源 |
| 创建/销毁 | 慢(需分配资源) | 快(共享资源) |
| 切换开销 | 大(上下文切换) | 小(同一地址空间) |
| 通信 | 需 IPC 机制 | 直接读写共享内存 |
| 安全性 | 隔离,崩溃不影响其他 | 崩溃可能导致进程崩溃 |
3.3 线程的实现
- 内核线程:OS 内核实现,调度直接由 CPU 完成
- 用户线程:库实现,内核未知,调度在用户态
- 轻量级进程(LWP):Linux 中的实现,一对一映射到内核线程
3.4 僵尸进程与孤儿进程
僵尸进程:子进程退出但父进程未调用 wait() 回收其退出状态,进程表项仍存在
孤儿进程:父进程退出,子进程还在运行,子进程被 init 收养
# 查看僵尸进程ps aux | grep 'Z'
# 杀死僵尸进程的父进程kill -9 <父进程 PID>四、内存管理
4.1 虚拟内存的作用
虚拟内存让每个进程拥有独立的地址空间,解决了以下问题:
- 进程隔离:防止进程间互相破坏
- 内存高效利用:按需加载,不需要全部加载到物理内存
- 简化内存分配:进程看到的连续虚拟地址对应物理上可能不连续
- 实现内存保护:页表项记录权限(可读/写/执行)
4.2 页面置换算法
当物理内存不足时,需要将页面换出到磁盘:
- FIFO:最先进先出,简单但可能有 Belady 异常
- LRU:最近最少使用,性能好但实现复杂
- Clock:LRU 的近似实现,用访问位模拟
4.3 内存碎片
外部碎片:空闲内存加起来够用,但单块不够大(可通过内存紧缩解决)
内部碎片:分配的空间比请求的大,内部未被使用的内存
伙伴系统(Buddy System):一种减少内存碎片的分配算法,内存按 2 的幂次划分,每次分配找到最小的满足 2^n 的块。
五、系统调用
系统调用是用户态程序请求内核服务的接口。
5.1 常见系统调用
进程控制:
fork():创建进程execve():执行新程序exit():进程退出wait():等待子进程退出
文件操作:
open():打开文件read()/write():读写文件close():关闭文件
内存管理:
brk()/mmap():修改程序断点/内存映射
通信:
pipe():创建管道socket():创建 socketconnect()/accept():建立连接
5.2 用户态与内核态
内核态(Kernel Mode):CPU 可以访问所有内存和硬件,特权指令可执行
用户态(User Mode):受限的内存访问和指令集
切换方式:
- 系统调用:用户态 → 内核态(程序主动)
- 中断:硬件事件触发(键盘输入、磁盘 I/O 完成)
- 异常:程序错误(除零、越界)
六、参考
参考
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时
相关文章 智能推荐






