操作系统
大约 6 分钟
阅读提示
这页建议按“进程线程 -> 内存 -> 调度 -> IO”顺序复习。
面试时优先说结论和场景,再补原理细节,回答会更像真实项目参与者。
快速导航
- 先掌握:
进程/线程、用户态/内核态、上下文切换。 - 再掌握:
死锁、内存分页、页面置换。 - 冲刺补强:
IO 模型、零拷贝、调度策略。
1、进程和线程的区别是什么?
回答提示:
- 进程是资源分配的基本单位,线程是 CPU 调度的基本单位。
- 同一进程内线程共享堆和方法区,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。
- 进程切换成本通常高于线程切换,因为涉及更多资源状态的保存与恢复。
参考回答:
- 进程更像“独立车间”,线程更像“车间里的工人”。
- 多进程隔离性更好,稳定性高;多线程通信更方便,开销更小。
- Java 业务开发中,大多数并发任务会优先使用线程池来复用线程,减少创建和销毁成本。
2、并发和并行有什么区别?
回答提示:
- 并发:同一时间段内处理多个任务,宏观同时,微观可能轮流执行。
- 并行:同一时刻多个任务同时执行,通常依赖多核 CPU。
参考回答:
- 单核 CPU 主要是并发,多核 CPU 能实现并行。
- 面试中可以补一句:我们平时说“并发编程”,工程上通常是“并发 + 并行”混合场景。
3、什么是用户态和内核态?为什么要区分?
回答提示:
- 用户态权限受限,不能直接访问硬件和关键内核资源。
- 内核态权限高,可以执行特权指令和硬件操作。
- 通过权限隔离提升系统稳定性和安全性。
参考回答:
- 应用代码大多运行在用户态,涉及磁盘、网络、进程管理等能力时,通过系统调用陷入内核态。
- 这种分层设计避免了业务程序直接操作硬件导致系统崩溃。
4、什么是系统调用?
回答提示:
- 系统调用是用户程序访问内核服务的标准入口。
- 常见系统调用:
read、write、open、close、fork。
参考回答:
- 应用层无法直接操作设备,必须通过系统调用由内核代为执行。
- 一次系统调用通常伴随用户态到内核态的切换。
5、线程上下文切换为什么昂贵?
回答提示:
- 需要保存和恢复寄存器、程序计数器、栈指针等上下文。
- 可能引发缓存失效和 TLB 刷新,影响 CPU 命中率。
- 切换本身不做业务计算,属于纯开销。
参考回答:
- 并发不是线程越多越好。线程数过高会把时间花在切换而非计算上。
- 在 Java 项目中应结合任务类型和 CPU 核数配置线程池,而不是盲目放大。
6、进程通信(IPC)方式有哪些?
回答提示:
- 管道(Pipe):适合有亲缘关系进程,半双工。
- 消息队列:按消息传递,解耦较好。
- 共享内存:速度快,但要配合同步机制。
- 信号量:用于并发控制。
- Socket:跨主机通信常用方式。
参考回答:
- 本机高性能场景常用共享内存 + 锁;跨机器服务通信一般使用 Socket(如 TCP)。
7、线程同步方式有哪些?
回答提示:
- 互斥锁:同一时刻只允许一个线程访问临界区。
- 读写锁:读共享、写独占,适合读多写少。
- 信号量:控制并发访问资源数量。
- 条件变量:线程间等待/通知协作。
参考回答:
- Java 中常见实现对应
synchronized、ReentrantLock、ReadWriteLock、Semaphore、Condition。 - 选型关键是冲突比例、是否可中断、公平性和可重入需求。
8、死锁产生的条件与避免方式
回答提示:
- 四个必要条件:互斥、请求并保持、不可剥夺、循环等待。
- 破坏任意一个条件即可避免死锁。
参考回答:
- 工程上常用策略:统一加锁顺序、设置超时、尽量缩小锁粒度、避免嵌套锁。
- 排查时可结合
jstack、线程 dump、监控告警定位阻塞链路。
9、什么是虚拟内存?为什么需要它?
回答提示:
- 给每个进程提供独立且连续的逻辑地址空间。
- 通过页表映射到物理内存,实现隔离、扩展和按需加载。
参考回答:
- 虚拟内存让程序“看到”的内存比实际物理内存更大,并通过换页机制提升资源利用率。
- 代价是地址转换和缺页处理会引入额外开销。
10、页面置换算法有哪些?
回答提示:
- FIFO:先进先出,实现简单但可能出现 Belady 异常。
- LRU:淘汰最近最少使用页面,效果较好但实现成本更高。
- LFU:淘汰访问次数最少页面,适合热点稳定场景。
参考回答:
- 实际系统往往采用 LRU 近似算法,在性能和命中率之间折中。
11、常见 CPU 调度算法
回答提示:
- 先来先服务(FCFS):简单但可能导致短任务等待长任务。
- 短作业优先(SJF):平均等待时间较优,但依赖任务时长预测。
- 时间片轮转(RR):公平性好,适合分时系统。
- 多级反馈队列:结合优先级和时间片,工程中较常见。
参考回答:
- 服务端系统更关注吞吐和响应延迟平衡,通常使用更复杂的动态调度策略。
12、IO 模型有哪些?
回答提示:
- 阻塞 IO:调用线程等待直到数据就绪。
- 非阻塞 IO:立即返回,需要轮询。
- IO 多路复用:一个线程监听多个连接(
select/poll/epoll)。 - 异步 IO:内核完成 IO 后通知用户线程。
参考回答:
- 高并发网络服务常用 IO 多路复用,Java 里对应 NIO/Reactor 思路。
13、什么是零拷贝?
回答提示:
- 目标是减少用户态和内核态之间的数据复制次数。
- 常见实现依赖
sendfile、mmap等机制。
参考回答:
- 零拷贝可以降低 CPU 开销并提升吞吐,特别适合大文件传输和高流量网关场景。
14、面试高频追问怎么答得更像真实项目参与者?
回答提示:
- 回答结构建议:结论 -> 机制 -> 线上场景 -> 权衡。
- 尽量给出具体指标,如线程池大小、QPS、延迟变化、压测结果。
可直接复述模板:
- 我们当时先用一个保守方案保证稳定性,比如先限流再扩容。
- 后面根据监控数据做了二次优化,把瓶颈从上下文切换转到了真正的业务处理。
- 最终的效果是峰值时延和错误率都可控,系统稳定性明显提升。
