操作系统
大约 10 分钟Java八股文Java八股文操作系统
阅读提示
这页建议按“进程线程 -> 内存 -> 调度 -> IO”顺序复习。
面试时优先说结论和场景,再补原理细节,回答会更像真实项目参与者。
适用范围:操作系统机制以带 MMU 的 Linux 为例;Linux API 语义参考 Linux man-pages,调度补充区分 Linux 6.6 起的变化。Java 示例以 Java SE 21 为基线,区分平台线程和 Java 21 正式引入的虚拟线程,不把 JVM 内存区域当作所有语言的操作系统概念。
快速导航
- 先掌握:
进程/线程、用户态/内核态、上下文切换。 - 再掌握:
死锁、内存分页、页面置换。 - 冲刺补强:
IO 模型、零拷贝、调度策略。
1、进程和线程的区别是什么?
回答提示:
- 进程是资源分配的基本单位,线程是 CPU 调度的基本单位。
- 操作系统线程共享进程的地址空间、打开的文件等资源,各有寄存器上下文和栈。Java 层面,堆和方法区由线程共享,程序计数器与 JVM 栈线程私有;本地方法栈由具体 JVM 实现决定,不能将这些 JVM 术语直接推广到其他语言。
- 进程切换成本通常高于线程切换,因为涉及更多资源状态的保存与恢复。
参考回答:
- 进程更像“独立车间”,线程更像“车间里的工人”。
- 多进程隔离性更好,稳定性高;多线程通信更方便,开销更小。
- Java 平台线程常通过线程池复用,减少创建和销毁成本。Java 21 虚拟线程由 JVM 调度到承载它的少量平台线程上,适合大量等待 IO 的任务,通常每任务创建一个虚拟线程,无须池化虚拟线程;CPU 密集任务仍受可用 CPU 限制。
依据:JVMS 21 运行时数据区、Java 21 虚拟线程指南。
2、并发和并行有什么区别?
回答提示:
- 并发:同一时间段内处理多个任务,宏观同时,微观可能轮流执行。
- 并行:同一时刻多个任务同时执行,通常依赖多核 CPU。
参考回答:
- 单核 CPU 主要是并发,多核 CPU 能实现并行。
- 面试中可以补一句:我们平时说“并发编程”,工程上通常是“并发 + 并行”混合场景。
3、什么是用户态和内核态?为什么要区分?
回答提示:
- 用户态权限受限,不能直接访问硬件和关键内核资源。
- 内核态权限高,可以执行特权指令和硬件操作。
- 通过权限隔离提升系统稳定性和安全性。
参考回答:
- 应用代码大多运行在用户态,涉及磁盘、网络、进程管理等能力时,通过系统调用陷入内核态。
- 这种分层设计避免了业务程序直接操作硬件导致系统崩溃。
4、什么是系统调用?
回答提示:
- 系统调用是用户程序访问内核服务的标准入口。
- 常见系统调用:
read、write、open、close、fork。
参考回答:
- 应用层无法直接操作设备,必须通过系统调用由内核代为执行。
- 一次真正的系统调用会进入内核并返回用户态,但不一定切换到另一个线程:权限级别切换与调度上下文切换是两回事。调用阻塞或发生抢占时才可能调度其他线程。
5、线程上下文切换为什么昂贵?
回答提示:
- 需要保存和恢复寄存器、程序计数器、栈指针等上下文。
- 工作集变化或迁移到另一 CPU 可能降低缓存命中率;同一进程的线程共享地址空间,切换并不必然刷新 TLB,也不会必然清空 CPU 缓存。地址空间切换及 TLB 保留策略取决于 CPU 和内核实现。
- 切换本身不做业务计算,属于纯开销。
参考回答:
- 并发不是线程越多越好。线程数过高会把时间花在切换而非计算上。
- 在 Java 项目中应结合任务类型和 CPU 核数配置线程池,而不是盲目放大。
6、进程通信(IPC)方式有哪些?
回答提示:
- 匿名管道(Pipe):Linux 中是单向字节流,常通过继承文件描述符用于有亲缘关系的进程;双向通信可用两条管道。命名管道(FIFO)可供具有相应权限的无亲缘关系进程打开。
- 消息队列:按消息传递,解耦较好。
- 共享内存:速度快,但要配合同步机制。
- 信号量:用于并发控制。
- Socket:既可用于跨主机通信(TCP/UDP),也可通过 Unix domain socket 用于本机 IPC。
管道语义依据:Linux pipe(7)。
参考回答:
- 本机高性能场景常用共享内存 + 锁;跨机器服务通信一般使用 Socket(如 TCP)。
7、线程同步方式有哪些?
回答提示:
- 互斥锁:同一时刻只允许一个线程访问临界区。
- 读写锁:读共享、写独占,适合读多写少。
- 信号量:控制并发访问资源数量。
- 条件变量:线程间等待/通知协作。
参考回答:
- Java 中常见实现对应
synchronized、ReentrantLock、ReadWriteLock、Semaphore、Condition。 - 选型关键是冲突比例、是否可中断、公平性和可重入需求。
8、死锁产生的条件与避免方式
回答提示:
- 四个必要条件:互斥、请求并保持、不可剥夺、循环等待。
- 破坏任意一个条件即可避免死锁。
参考回答:
- 工程上可通过统一加锁顺序破坏循环等待;使用可超时的锁时,超时后必须释放已持有的锁并退出或退避重试。单纯缩小临界区只降低冲突,不能保证消除死锁。
- 排查时可结合
jstack、线程 dump、监控告警定位阻塞链路。
9、什么是虚拟内存?为什么需要它?
回答提示:
- 给每个进程提供独立的虚拟地址空间;其中可以有未映射的空洞,虚拟地址连续也不代表物理页连续。
- 通过页表映射到物理内存,实现隔离、扩展和按需加载。
参考回答:
- 虚拟地址空间可以大于物理内存,但不保证所有申请都能成功、所有页面都能同时驻留。按需分配、文件映射和可选的 swap 支持不同的内存使用方式;虚拟内存不等于交换分区。
- 代价是地址转换和缺页处理会引入额外开销。
机制上,CPU 优先用 TLB 缓存地址翻译;TLB 未命中时查页表,并不意味着一定缺页。合法但尚未驻留的页面可由内核分配物理页或从文件/swap 调入后重试指令;非法地址或权限违规不能靠调页解决,在 Linux 用户进程中通常表现为 SIGSEGV。
虚拟地址 → TLB / 页表 → 物理页
↘ 页面不在内存 → 缺页处理 → 建立映射 → 重试依据:Linux 内存管理概念。
10、页面置换算法有哪些?
回答提示:
- FIFO:先进先出,实现简单但可能出现 Belady 异常。
- LRU:淘汰最近最少使用页面,效果较好但实现成本更高。
- LFU:淘汰访问次数最少页面,适合热点稳定场景。
参考回答:
- 实际系统往往采用 LRU 近似算法,在性能和命中率之间折中。
11、常见 CPU 调度算法
回答提示:
- 先来先服务(FCFS):简单但可能导致短任务等待长任务。
- 短作业优先(SJF):平均等待时间较优,但依赖任务时长预测。
- 时间片轮转(RR):公平性好,适合分时系统。
- 多级反馈队列:结合优先级和时间片,工程中较常见。
参考回答:
- 服务端系统更关注吞吐和响应延迟平衡,通常使用更复杂的动态调度策略。Linux 6.6 起,公平调度类开始从 CFS 转向 EEVDF:先选尚欠 CPU 时间的合格任务,再比较虚拟截止时间。这不是把整个 Linux 调度器替换成一种算法;实时调度类仍有各自策略。
12、IO 模型有哪些?
回答提示:
- 阻塞 IO:以 socket 的
read为例,无数据时可等待,返回时数据已复制到用户缓冲区;也可能返回 EOF、错误或少于请求量的数据。 - 非阻塞 IO:当前无法继续时返回
EAGAIN/EWOULDBLOCK;可以重试,也可以结合就绪通知,避免忙轮询。 - IO 多路复用:一个线程监听多个连接(
select/poll/epoll)。 - 异步 IO:内核完成 IO 后通知用户线程。
参考回答:
- 高并发网络服务常用 IO 多路复用,Java 里对应 NIO 的 Selector/Reactor 思路;NIO 也包含阻塞模式的通道,不能把全部 NIO 都等同于非阻塞。
Linux 的 epoll_wait 通知的是“可以尝试 IO”,不负责将数据复制到用户缓冲区,等待事件时本身可以阻塞;随后仍需调用 read/write。异步 IO 的完成通知则表示提交的操作已经完成。对于边缘触发(ET),通常配合非阻塞描述符,持续读写直到 EAGAIN,避免遗漏仍待处理的数据。
13、什么是零拷贝?
回答提示:
- 目标是减少用户态和内核态之间的数据复制次数。
- Linux
sendfile在内核中传输文件描述符间的数据,避免传统read+write经用户缓冲区中转;mmap将文件映射到地址空间,但随后普通write仍可能发生数据复制,不能仅凭用了映射就断言全程零复制。
参考回答:
- 零拷贝可以降低 CPU 开销并提升吞吐,特别适合大文件传输和高流量网关场景。它不意味着数据完全不移动,也不保证消除内核内部复制;效果取决于传输路径及硬件能力。需要在用户态压缩、加密或改写正文时,不能直接套用原样发送文件的路径。
sendfile成功也可能只发送部分字节,必须按实际返回值推进偏移并处理重试。
14、面试高频追问怎么答得更像真实项目参与者?
回答提示:
- 回答结构建议:结论 -> 机制 -> 线上场景 -> 权衡。
- 有真实测量时给出线程池大小、QPS、延迟和测试条件;没有测量时明确说明是机制分析,不编造项目经历或效果数字。
机制分析示例:
- 如果增大线程池后延迟反而升高,可以检查 CPU 使用率、可运行线程数与上下文切换,再排查锁竞争、IO 等待和下游容量。
- 若证据指向 CPU 饱和,继续增加线程通常不能提升算力;若主要是 IO 等待,则还需结合下游并发上限评估线程数。
- 这只是分析路径,是否改善吞吐或延迟需要实际测量后才能判断。
