一份不可多得的 《 操作系统 》面试题大全

0 阅读21分钟

⚠️ : 本教程用于面试 , 学习 , 复习 , 内容持续更新 😄😄😄

如果内容有错误 , 欢迎评论更正~~~

操作系统面试题大全(完整版·含答案)

一、操作系统基础概念

1. 什么是操作系统?

操作系统(OS)是管理计算机硬件与软件资源的系统软件,是用户与计算机硬件之间的接口。 作用:

  • 管理硬件:CPU、内存、磁盘、I/O 设备
  • 管理软件:进程、文件、权限
  • 提供抽象接口,让应用程序不用直接操作硬件

2. 操作系统的主要功能

  • 进程/线程管理:创建、调度、销毁、通信
  • 内存管理:分配、回收、虚拟内存、地址映射
  • 文件系统管理:文件读写、目录、权限
  • 设备管理:I/O 控制、驱动、缓冲
  • 提供用户接口:命令行、GUI、系统调用

3. 操作系统的基本特征

  1. 并发:多个程序宏观上同时运行
  2. 共享:资源互斥共享或同时共享
  3. 虚拟:物理实体变成多个逻辑实例(如虚拟内存、虚拟CPU)
  4. 异步:进程执行速度不可预知,但结果一致

4. 内核态与用户态的区别

  • 用户态:应用程序运行,权限低,不能直接访问硬件。
  • 内核态:操作系统内核运行,权限高,可执行任何指令。 区分目的:保护系统安全稳定,防止应用程序破坏硬件与内核数据。

5. 用户态切换到内核态的三种场景

  1. 系统调用:如 open、read、write、fork
  2. 中断:如磁盘 I/O 完成、键盘输入
  3. 异常:除零、缺页、非法指令

6. 什么是系统调用?与普通函数调用区别?

系统调用是应用程序请求内核服务的接口。 区别:

  • 普通函数调用:在用户态,同一地址空间,速度快
  • 系统调用:切换到内核态,上下文切换,开销大

7. 并发与并行的区别

  • 并发:单核 CPU 多任务交替执行,宏观同时,微观交替
  • 并行:多核 CPU 真正同时执行

二、进程与线程(面试核心)

8. 什么是进程?

进程是具有独立功能的程序在一个数据集合上的一次执行过程,是资源分配的基本单位

9. 什么是线程?

线程是进程内的执行路径,是CPU 调度的基本单位

10. 进程与线程的区别(必背)

  1. 进程是资源分配单位,线程是调度单位
  2. 进程有独立地址空间,线程共享进程地址空间
  3. 线程共享:代码段、数据段、堆、文件描述符
  4. 线程私有:栈、寄存器、线程局部存储
  5. 进程切换开销大,线程切换开销小
  6. 一个进程崩溃一般不影响其他进程;一个线程崩溃可能导致整个进程崩溃

11. 进程控制块 PCB 是什么?

PCB 是操作系统管理进程的核心数据结构,包含:

  • 进程ID、状态、优先级
  • CPU 上下文(寄存器)
  • 内存指针、打开文件、信号信息

12. 进程的五种状态

  1. 新建:创建中
  2. 就绪:等待CPU
  3. 运行:占用CPU
  4. 阻塞:等待I/O/事件
  5. 终止:结束

13. 进程切换过程

  1. 保存当前进程 CPU 上下文
  2. 更新 PCB 状态
  3. 将 PCB 移入对应队列(就绪/阻塞)
  4. 选择新进程
  5. 恢复新进程上下文 开销大原因:地址空间切换、TLB 刷新、cache 失效

14. 线程切换为什么更快?

同一进程内:

  • 不切换虚拟地址空间
  • 不刷新 TLB
  • 共享页表 只需要保存栈和寄存器。

15. 什么是协程?

协程是用户态轻量级执行单元,完全由用户态代码调度,不进入内核。 优点:

  • 极轻量
  • 无内核切换开销
  • 高并发

16. fork() 是什么?

fork 是 Linux 创建子进程的系统调用。 特点:

  • 调用一次,返回两次
  • 子进程返回 0,父进程返回子进程 PID
  • 采用写时复制(Copy-On-Write),只有修改时才真正复制内存

17. 写时复制 COW 原理

fork 后父子进程共享同一份物理内存,只有写入时才复制页面。 目的:减少 fork 开销,提高效率

18. 孤儿进程

父进程先退出,子进程被 init 进程(PID=1) 收养。

19. 僵尸进程

子进程退出,父进程未调用 wait()/waitpid() 回收 PCB,导致进程描述符残留。 危害:占用进程号,耗尽后无法创建新进程。

20. 守护进程

后台运行、脱离终端的系统服务进程。

21. 进程间通信 IPC 方式

  1. 匿名管道:半双工,父子进程使用
  2. 命名管道:无亲缘关系也可用
  3. 消息队列:内核消息链表
  4. 共享内存最快 IPC,直接映射同一块物理内存
  5. 信号量:同步互斥
  6. 信号:异步通知
  7. Socket:跨主机通信

22. 共享内存为什么最快?

不经过内核数据拷贝,直接访问同一块物理内存,无多次复制。

23. 临界区

访问共享资源的一段代码,同一时间只允许一个线程执行。

24. 同步与互斥

  • 互斥:同一时间只一个线程进入临界区
  • 同步:按预定顺序执行

25. 什么是死锁?

多个进程互相等待对方资源,且都不释放,导致永久阻塞。

26. 死锁四个必要条件(必背)

  1. 互斥:资源独占
  2. 请求保持:持有资源并请求新资源
  3. 不可剥夺:资源只能主动释放
  4. 循环等待:形成资源等待环

四个条件同时成立才会死锁。

27. 处理死锁的四种策略

  1. 预防:破坏任意一个必要条件
  2. 避免:银行家算法,确保系统处于安全状态
  3. 检测:定期检查是否有环
  4. 解除:终止进程、剥夺资源

28. 银行家算法

用于避免死锁。 每次分配资源前判断:

  • 分配后系统是否仍处于安全状态
  • 存在安全序列则分配,否则阻塞

29. 用户级线程与内核级线程

  • 用户级线程:用户态库管理,内核不知道,切换快,无法利用多核
  • 内核级线程:内核管理,可并行,切换开销大

现代操作系统多使用轻量级进程 + 内核线程


三、处理机调度

30. 调度三个层次

  1. 高级调度(作业调度):从外存调入内存
  2. 中级调度(内存调度):挂起/激活,处理内存紧张
  3. 低级调度(进程调度):决定哪个进程占用CPU

31. 常见调度算法

  1. FCFS 先来先服务:利于长作业,不利于短作业
  2. SJF 短作业优先:平均等待时间最少,可能饥饿
  3. 优先级调度:高优先级先运行
  4. 时间片轮转:每个进程执行一个时间片
  5. 多级反馈队列:综合优先级与时间片,适应不同类型任务

32. 颠簸(抖动)

频繁页面换入换出,CPU 利用率急剧下降。 原因:并发进程太多,缺页率太高。


四、内存管理(高频)

33. 什么是虚拟内存?

虚拟内存是逻辑上扩充内存的技术,利用磁盘空间作为内存扩展。

34. 虚拟内存三大作用

  1. 扩大地址空间
  2. 进程内存隔离
  3. 实现内存共享

35. 分页与分段区别

  • 分页:按固定大小页,对用户透明,减少外部碎片
  • 分段:按逻辑模块划分,用户可见,便于共享与保护

36. 段页式

先分段,段内再分页,兼具优点。

37. 页面为什么通常 4KB?

  • 太小:页表太大
  • 太大:内部碎片严重 4KB 是平衡性能与开销的标准。

38. 页表与 TLB

  • 页表:记录虚拟页到物理页的映射
  • TLB(快表):高速缓存,存放最常用页表项 访问顺序:TLB → 页表 → 物理内存

39. 缺页中断

访问的页面不在内存,触发缺页中断,内核从磁盘加载页面。

40. 页面置换算法

  1. FIFO:先进先出,可能出现 Belady 异常
  2. LRU:最近最少使用,性能好,实际常用
  3. LFU:最少使用
  4. OPT:理想算法,置换未来最久不用页面

41. LRU 原理

淘汰最近最少使用的页面。 实现:链表 + 哈希表,每次访问移到表头,满了淘汰表尾。

42. 内存碎片

  • 内部碎片:分配块比实际大,如分页最后一页
  • 外部碎片:空闲空间分散,无法分配大内存

43. 局部性原理

  • 时间局部性:刚访问的数据可能再次访问
  • 空间局部性:访问地址附近数据也可能被访问 是缓存、虚拟内存、预读的理论基础。

五、文件管理

44. 文件逻辑结构与物理结构

  • 逻辑:无结构、记录式、流式
  • 物理:连续、链接、索引

45. 索引节点 inode

Linux 用于存放文件元数据

  • 权限、所有者、大小、时间、数据块指针 不包含文件名。

46. 硬链接与软链接

  • 硬链接:多个文件名指向同一个 inode,不能跨分区,不能指向目录
  • 软链接:独立文件,存放路径,类似快捷方式,可跨分区

47. 打开文件表

  • 进程打开文件表:每个进程私有
  • 系统打开文件表:全局,记录引用计数 close() 时引用计数减 0 才释放。

六、I/O 与设备管理

48. I/O 控制方式

  1. 程序查询:CPU 轮询,效率低
  2. 中断驱动:I/O 完成发中断
  3. DMA:直接内存访问,CPU 不参与数据拷贝
  4. 通道:独立 I/O 处理器

49. DMA 原理

DMA 控制器直接控制内存与设备间数据传输,不占用CPU

50. I/O 多路复用

一个线程监听多个文件描述符。 实现:

  • select
  • poll
  • epoll(Linux 最高效)

51. select/poll/epoll 区别

  • select:有最大描述符限制,遍历所有fd
  • poll:无数量限制,仍遍历
  • epoll:事件驱动,回调通知,O(1) 效率

52. 零拷贝

避免数据在内核缓冲区与用户缓冲区之间重复拷贝。 常用:mmap、sendfile。 作用:大幅提高 I/O 吞吐量。

53. 磁盘调度算法

  • FCFS
  • SSTF 最短寻道优先
  • SCAN 电梯算法
  • CSCAN 循环扫描

七、Linux 高频操作系统题

54. Linux 进程状态

  • R 运行
  • S 可中断睡眠
  • D 不可中断睡眠
  • T 停止
  • Z 僵尸

55. fork / exec / wait / exit

  • fork:创建子进程
  • exec:加载新程序覆盖当前进程
  • wait:父进程等待子进程退出
  • exit:进程退出

56. 软中断与硬中断

  • 硬中断:硬件触发,快速处理
  • 软中断:内核延后处理,如网络协议栈

57. Page Cache

文件数据在内存中的缓存,加速文件读写。


八、经典场景题(面试常问)

58. 如何实现 LRU?

结构:

  • 双向链表:维护访问顺序
  • 哈希表:O(1) 查找 逻辑:
  • get:存在则移到表头
  • put:满则删除表尾,新节点放表头

59. 生产者消费者模型

作用:解耦、限流、异步。 需要:

  • 队列
  • 互斥锁
  • 条件变量(空/满)

60. 如何避免死锁?

  1. 固定顺序申请资源
  2. 避免持有并等待
  3. 设置超时
  4. 破坏循环等待

九、操作系统八股速记(最精华)

  • 进程 = 资源分配单位,线程 = 调度单位
  • 线程共享堆,不共享栈
  • 死锁四条件:互斥、请求保持、不可剥夺、循环等待
  • 虚拟内存:扩大空间、隔离、共享
  • 最快 IPC:共享内存
  • LRU:最近最少使用
  • 用户态→内核态:系统调用、中断、异常
  • 页表 + TLB = 加速地址翻译
  • 零拷贝:减少CPU拷贝,提升I/O效率
  • 硬中断快,软中断处理后半段

🤔 结语 🤔

okokok , 这篇文章到此结束 , 我们有缘再会 😂😂😂 !

到这里这篇文章就结束了 , 下面是适用于前端开发的精简版 , 适合前端开发食用~~~

前端工程师专用 面试精简版(必背)

核心说明:前端面试不考复杂底层实现,重点聚焦「与前端开发相关」的OS知识点(如浏览器进程、JS线程、本地文件处理、网络I/O相关),以下内容全部是高频考点,精简无废话,直接背诵即可。

一、操作系统基础(前端必背)

1. 什么是操作系统(OS)?

管理计算机硬件与软件资源的系统软件,是用户(应用程序)与硬件的接口。前端接触场景:浏览器运行依赖OS管理CPU、内存、磁盘。

2. 内核态与用户态(高频)

  • 内核态:权限高,可直接操作硬件(如磁盘读写、网络请求),由OS内核运行。

  • 用户态:权限低,不能直接操作硬件,应用程序(如浏览器、JS引擎)运行在此状态。

前端关联:JS运行在用户态,无法直接操作本地文件、网络,必须通过浏览器(内核态)提供的API(如fetch、FileReader)间接调用,本质是「用户态→内核态」的切换。

3. 用户态→内核态的切换场景(前端常考)

  1. 系统调用:前端常用的fetch(网络请求)、FileReader(读取本地文件)、localStorage(本地存储),本质都是JS调用浏览器的系统调用接口,触发切换。

  2. 中断:如网络请求完成后,硬件通知内核,内核再通知浏览器,触发JS回调。

4. 并发与并行(前端高频)

  • 并发:单核CPU下,多个任务交替执行(宏观同时,微观交替),比如浏览器同时渲染页面、执行JS、处理网络请求。

  • 并行:多核CPU下,多个任务真正同时执行(如JS主线程执行的同时,GPU并行处理渲染)。

前端关联:JS是单线程,靠「事件循环」实现并发(如异步请求、定时器),而浏览器是多进程(如渲染进程、GPU进程),可实现并行。

二、进程与线程(前端核心考点)

1. 进程与线程的区别(必背)

  • 进程:资源分配的基本单位,有独立的地址空间(如浏览器的每个标签页,默认是一个进程)。

  • 线程:CPU调度的基本单位,共享进程的地址空间(如一个浏览器进程内,有JS主线程、渲染线程、网络线程)。

前端重点:

  1. 浏览器是多进程(渲染进程、插件进程、GPU进程等),避免一个标签崩溃影响整个浏览器。

  2. 渲染进程内是多线程,核心线程:JS主线程、渲染线程(DOM渲染、CSS渲染),且两者互斥(所以JS执行会阻塞页面渲染)。

2. 线程共享与私有资源(前端需记)

  • 共享(同一进程内的线程):堆内存(如JS的全局变量、对象)、文件描述符(如浏览器的网络请求句柄)。

  • 私有:栈内存(如JS的函数执行上下文)、寄存器。

前端关联:JS的闭包、全局变量,本质是线程共享堆内存的体现。

3. 协程(前端了解即可)

用户态的轻量级线程,由用户代码调度(而非内核),无内核切换开销。前端关联:ES6的Generator、async/await,本质是协程的实现,用于解决JS异步回调地狱。

4. 进程间通信(IPC)(前端高频)

前端接触的IPC场景:

  1. 浏览器不同标签页(不同进程)之间的通信:localStorage(同源)、postMessage(跨域)、Service Worker。

  2. 渲染进程与GPU进程的通信:浏览器渲染页面时,渲染线程将绘制指令发送给GPU进程,实现页面渲染。

常考:共享内存是最快的IPC方式(直接访问同一块物理内存,无数据拷贝),但前端几乎用不到,了解即可。

5. 死锁(前端简化版)

核心:多个线程/进程互相等待对方资源,无法继续执行。前端几乎不会遇到,但需记住「死锁的四个必要条件」(面试偶尔问):

  1. 互斥(资源独占);2. 请求保持(持有资源再请求新资源);3. 不可剥夺;4. 循环等待。

三、内存管理(前端重点)

1. 虚拟内存(必背)

定义:逻辑上扩充内存的技术,将磁盘空间作为内存的扩展,让应用程序以为有足够的内存。

前端关联:

  1. 浏览器的内存限制:每个渲染进程有内存上限(如Chrome约4GB),超过会触发GC(垃圾回收),严重时会崩溃。

  2. 前端优化:避免内存泄漏(如未清理的定时器、事件监听),减少虚拟内存的使用,提升页面性能。

2. 分页与分段(前端了解)

  • 分页:将内存分成固定大小的页,用于虚拟内存的地址映射,前端无需关注底层实现。

  • 前端关联:JS的内存分配(如对象、数组),本质是OS通过分页机制分配虚拟内存。

3. 内存碎片(前端了解)

  • 内部碎片:分配的内存块比实际需要的大(如JS分配一个100字节的对象,OS分配了128字节)。

  • 前端关联:频繁创建/销毁小对象(如循环中创建对象),会产生大量内部碎片,触发GC,影响性能。

4. 局部性原理(前端优化相关)

  • 时间局部性:刚访问的数据,短期内可能再次访问(如JS反复使用同一个变量)。

  • 空间局部性:访问一个数据,其附近的数据也可能被访问(如JS遍历数组)。

前端优化应用:

  1. 缓存常用数据(如将频繁使用的DOM节点存在变量中),利用时间局部性。

  2. 数组遍历比对象遍历快,利用空间局部性(数组元素在内存中连续存储)。

四、文件管理(前端高频)

1. 文件系统基础(前端接触场景)

前端操作本地文件的方式:通过input[type=file]选择文件,再通过FileReader读取文件内容(文本、图片等)。

核心:JS无法直接操作本地文件(用户态权限限制),必须通过浏览器(内核态)提供的API间接操作,且需要用户授权(如选择文件)。

2. 软链接与硬链接(前端了解)

  • 软链接:类似快捷方式,存放目标文件的路径(如前端项目中的node_modules依赖,本质是软链接)。

  • 硬链接:多个文件名指向同一个文件(前端几乎用不到,了解即可)。

3. 前端文件操作注意事项

  1. 只能读取用户选择的文件,不能直接读取本地任意文件(安全限制)。

  2. 上传文件时,浏览器将文件数据通过网络发送给后端,本质是OS的I/O操作。

五、I/O与设备管理(前端核心)

1. I/O控制方式(前端简化)

前端接触的I/O场景:网络请求(fetch、axios)、本地文件读取(FileReader)、定时器(setTimeout)。

核心:JS是单线程,无法直接处理I/O(I/O是耗时操作),所以通过「异步I/O」实现:JS发起I/O请求后,交给浏览器内核(内核态)处理,处理完成后,通过事件循环通知JS执行回调。

2. I/O多路复用(前端高频)

定义:一个线程(如浏览器的网络线程)监听多个I/O请求(如多个网络请求),避免线程阻塞。

前端关联:浏览器的网络线程,通过epoll(Linux)/kqueue(Mac)实现I/O多路复用,同时处理多个网络请求,提升效率。

常考:select、poll、epoll的区别(前端简化版):

  • select/poll:效率低,需要遍历所有监听的I/O请求。

  • epoll:效率高,事件驱动,只处理就绪的I/O请求(浏览器、Node.js都用epoll)。

3. 零拷贝(前端了解)

定义:避免数据在「内核缓冲区」与「用户缓冲区」之间重复拷贝,提升I/O效率。

前端关联:大文件上传(如视频上传),浏览器会使用零拷贝技术,减少CPU开销,提升上传速度。

六、浏览器与OS的关联(前端独家考点)

1. 浏览器进程模型(必背)

  • 主进程:管理浏览器窗口、用户交互、进程间通信。

  • 渲染进程:每个标签页一个,负责页面渲染(DOM/CSS)、JS执行、网络请求。

  • GPU进程:负责页面渲染加速(如CSS 3D、Canvas)。

  • 插件进程:每个插件一个(如Flash插件),避免插件崩溃影响其他进程。

2. JS主线程与渲染线程的互斥性(必背)

原因:JS可以修改DOM(如document.write),如果JS执行与页面渲染同时进行,会导致渲染混乱。

前端影响:

  1. 长时间的JS执行(如循环)会阻塞页面渲染,导致页面卡顿。

  2. 优化方案:将耗时操作放在异步中(如setTimeout、Promise),避免阻塞主线程。

3. 事件循环与OS的关系(高频)

JS的事件循环,本质是依赖OS的「线程调度」和「I/O多路复用」:

  1. 异步任务(如网络请求、定时器)由浏览器内核(OS层面)处理。

  2. 任务完成后,放入回调队列,等待JS主线程空闲时执行。

核心:事件循环是JS实现并发的方式,而底层依赖OS的线程和I/O管理。

七、前端面试高频问答(直接背)

1. 为什么JS是单线程?

答:为了避免DOM渲染冲突(JS可修改DOM,若多线程同时修改DOM,会导致渲染混乱),浏览器规定JS主线程与渲染线程互斥,所以JS是单线程。

2. 浏览器的多进程模型有什么好处?

答:1. 隔离性:一个标签页(渲染进程)崩溃,不会影响其他标签页和浏览器主进程;2. 安全性:插件进程与渲染进程隔离,避免插件恶意操作。

3. 什么是内存泄漏?前端常见的内存泄漏场景有哪些?

答:内存泄漏是指JS分配的内存,不再使用但无法被GC回收,导致内存占用越来越高。

常见场景:1. 未清理的定时器/事件监听;2. 闭包引用未释放;3. 全局变量过多;4. DOM节点删除后仍有引用。

4. 为什么JS执行会阻塞页面渲染?

答:浏览器的JS主线程与渲染线程是互斥的,同一时间只能执行一个任务,JS执行时,渲染线程会被挂起,所以JS执行时间过长会导致页面卡顿。

5. 前端如何优化页面性能(结合OS知识)?

答:1. 减少JS主线程阻塞:拆分耗时任务、使用异步API;2. 减少内存泄漏:及时清理无用资源;3. 利用局部性原理:缓存常用数据、优化数组遍历;4. 减少I/O开销:合并网络请求、使用缓存(localStorage、HTTP缓存)。

6. fetch是同步还是异步?底层依赖OS的什么机制?

答:fetch是异步的,底层依赖OS的「I/O多路复用」(epoll),由浏览器的网络线程监听请求结果,完成后通过事件循环通知JS执行回调。

八、总结(前端必背核心)

  1. 前端接触的OS知识,都和「浏览器运行、JS执行、网络请求、本地文件操作」相关,无需深入底层实现。

  2. 核心考点:进程/线程区别、浏览器进程模型、JS单线程与事件循环、用户态/内核态切换、I/O多路复用。

  3. 面试答题技巧:结合前端场景回答(如讲进程时,联系浏览器标签页;讲I/O时,联系fetch请求),不用讲复杂的OS底层逻辑。

🤔 结语 🤔

okokok , 这次真的结束了 , 这篇文章到此真正结束了 , 我们有缘再会 😂😂😂 !