一、进程线程
1、进程与线程的区别
进程是操作系统资源分配的基本单位。线程是CPU调度的基本单位。
每个进程有独立的内存空间、数据段、代码段等。而线程是共享进程的大部分资源,共享内存、共享全局变量。但是线程有自己的线程栈、PC、寄存器。
进程创建和切换成本高但安全性好;线程轻量、切换快但共享资源可能线程不安全。适合作为应用隔离用进程,适合并发执行用线程。
进程有就绪、阻塞和运行三种状态。
线程有新建、就绪、运行、阻塞和终止五种状态。
2、操作系统中进程与线程切换过程
进程切换 = 从一个进程切换到另一个进程,需要切换整个进程上下文,包括内核态资源。
具体步骤如下:
- 保存当前进程上下文
- 修改进程状态
- 切换虚拟内存:进程切换需要切换地址空间,这是进程切换最昂贵的一步。
- 切换内核栈:每个进程有独立的内核栈,线程才共享进程栈。
- 恢复新进程的CPU上下文
- 挑战到新进程继续执行。
进程切换需要切换页表、虚拟内存、内核栈等“重量级资源”,代价昂贵。
线程切换 = 在同一进程内切换不同线程运行。
具体步骤:
- 保存当前线程的寄存器上下文
- 修改线程状态
- 切换到用户态栈
- 恢复新线程的寄存器、PC
- 挑战到新线程继续执行。
线程切换不切换虚拟内存,是轻量级的调度操作。
3、描述整个系统的调用过程
系统调用是用户程序请求内核为其执行某些特权操作(如读文件、创建进程、网络收发)的一种机制。如read、write、fork、send等
用户态程序 不能直接操作硬件或修改内核资源,必须通过系统调用。
- 用户程序调用库函数
- 触发CPU陷入(从用户态切换到内核态)
- 内核根据系统调用找到对应的内核函数
- 内核执行系统调用逻辑
- 内核准备返回值,恢复上下文
- 执行sysret/iret返回用户态
用户态调用库函数 → 执行 syscall 指令 → CPU 陷入内核态 →内核根据系统调用号调对应内核函数 → 完成操作 → 返回用户态。
TLB 是存放虚拟页号与物理帧号映射关系的高速缓存,用来加速页表查询。
4、后台进程有什么特点,如果设计一个进程是后台进程需要考虑什么?
后台进程是指在后台长期运行、不依赖终端、无需人工交互的进程,用于提供系统服务或定时任务等功能。Linux 中典型后台进程称为守护进程。
后台进程的主要特点:
- 不依赖终端/ 无控制台
- 长期运行、寿命较长
- 独立运行,不受用户会话影响
- 资源占用稳定、单一职责明显
- 守护进程通常在后台循环执行
- 通常运行在较低权限保障安全性
设计一个后台程序考虑以下问题:
- 正确“后台化”
- 日志管理:后台程序没有终端输出,所以日志非常重要
- 错误处理/异常处理:后台进程不能因为一个异常就崩掉
- 避免资源泄露
- 进程与服务管理
- 信号处理
- 配置热加载
- 后台任务调度
- 权限安全性
- 高可用设计
5、进程之间的通讯方式有哪些?
- 管道:半双工,只能用于 有亲缘关系的进程(父子进程),内核负责维护管道缓冲区。
- 有名管道:有名字(文件节点),可以用于 无亲缘关系进程通信
- 消息队列:内核维护消息队列,适合多个进程并发使用,消息有类型,支持随机读写,但是有长度限制。
- 共享内存:多个进程映射同一块物理内存,速度最快。需要配合 信号量 / 互斥锁 来同步读写。适合高性能通讯(进程间传输大量信息)
- 信号量:计数器,常用于“PV 操作”。避免竞争条件
- 信号:进程管理、异常处理,如子进程退出通知父进程。
- 套接字:本地进程通信、远程通信
- 内存映射文件(mmap):将文件映射到多个进程的地址空间
- RPC:大型系统服务通信
6、操作系统中进程调度方式的策略
进程调度(Process Scheduling)是操作系统决定 哪个进程(或线程)获得 CPU 使用权 的核心机制。
- 先来先服务
- 最短作业优先
- 优先级调度
- 时间片轮转
- 多级队列调度
- 多级反馈队列
- 实时调度
7、线程同步的方式
多个线程访问共享资源时,采用特定机制来避免出现数据竞争(race condition)、脏读、死锁等问题。保证同一时刻只有一个线程访问共享数据/保证访问顺序。
- 互斥锁
- 读写锁
- 自旋锁
- 信号量
- 条件变量
- 原子操作
8、CAS是一种什么样的同步机制
是一种无锁(lock-free)的原子同步机制
它是乐观锁的实现方式,由 CPU 原子指令支持,效率高,不会阻塞,常用于无锁队列、原子变量和高并发场景。
9、CPU怎么执行指令
CPU 执行指令遵循“取指 → 译码 → 执行 → 访存 → 写回”这一指令周期,通过控制器协调 ALU、寄存器、Cache、总线等部件完成操作。
二、内存
1、用户态与核心态的区别?
| 模式 | 权限级别 | 谁在运行 |
| 用户态 | 低权限 | 普通应用程序 |
| 内核态 | 高权限 | 操作系统内核、驱动 |
用户态是一种受限制的执行模式,应用程序运行其中,不能直接访问硬件或执行特权指令。内核态拥有最高权限,可以管理硬件、内存和进程调度。用户态通过系统调用、中断、异常进入内核态。区分两者是为了保证系统安全和稳定。
2、内存管理有哪些方式?
- 连续分配:每个进程占用一块连续的物理内存区域,分静态分区、动态分区,容易产生 内存碎片
- 非连续分配:分页
- 非连续分配:分段
- 段页式结合
- 虚拟内存
- 交换
操作系统的内存管理方式包括:连续分配、分页、分段、段页式、虚拟内存、交换(swap)、伙伴系统、slab/slub 分配器等。现代系统主要采用“分页 + 虚拟内存”,并使用“伙伴系统 + SLAB/SLUB”作为物理内存分配机制。
3、分页和分段的区别
分页是操作系统将虚拟地址空间等分为固定大小的页面(Page),物理内存等分为物理块(Frame)的内存管理方式。
分段把程序按照逻辑结构划分成大小不等的段(Segment),如代码段、数据段、栈段等,每个段具有不同长度。
简单来说:
分页将内存按固定大小的页划分,解决内存不连续问题;分段按逻辑结构划分段,大小可变,适合代码/数据/栈等模块化管理。分页无外碎片但有内碎片,分段无内碎片但有外碎片。现代 OS 基于分页管理内存,分段仅用于权限控制。
4、页面置换算法有哪些?
当发生 缺页中断(Page Fault) 且物理内存已满时,操作系统必须从内存中淘汰一个页面以加载新的页面。决定“淘汰谁”的规则,就是 页面置换算法。
- 先进先出:最先进入内存的页面优先被淘汰。
- 最佳置换:淘汰未来最长时间不会被访问的页面。
- LRU:淘汰 最近最久未使用 的页面。
- LFU:淘汰访问次数最少的页面。
- 时钟算法:LRU 的高效近似
- NRU:最近未使用算法,根据两个位:R(是否被访问)、M(是否被修改)
5、什么是虚拟内存
虚拟内存(Virtual Memory)是一种由操作系统与硬件(MMU)共同实现的内存管理机制,它为每个进程提供一个独立、连续的虚拟地址空间,使进程“以为”自己拥有完整内存,而实际物理内存可以按需分配,并且不足时可使用磁盘空间进行扩展。
三大核心功能
- 提供更大的“逻辑上”可用内存
- 为每个进程提供独立的虚拟地址空间(隔离性)
- 通过按需调页提高性能
简单来说:虚拟内存是操作系统提供的一种机制,用虚拟地址代替物理地址,为每个进程提供独立的虚拟空间,并通过“按需调页”和“磁盘交换”让程序无需关心物理内存大小。它依靠页表、TLB 和缺页中断实现,解决了内存不足、隔离与安全的问题,是现代操作系统内存管理的核心技术。
6、为什么虚拟地址内存切换比较耗时?
虚拟地址切换指的是:
当 CPU 从一个进程切换到另一个进程时,需要切换页表(Page Table),同时会影响 TLB,需要刷新或失效。这就是所谓的 地址空间切换(Address Space Switch)。
因此,虚拟地址空间切换耗时,是因为切换页表(CR3)会导致 TLB 失效,需要重新填充快表;同时多级页表查询开销大,还会导致缓存局部性下降。因此线程切换很快,而进程切换非常昂贵。
7、虚拟内存和物理内存怎么对应?
虚拟内存 → 通过页表 → 映射到物理内存。
每个虚拟地址都要通过页表才能找到对应的物理地址。
8、请求页面置换策略有哪些方式?区别是什么?各自用什么算法解决?
请求分页的置换策略包括:
⭐ 最优(OPT)
⭐ 栈式策略(LRU、LFU、Clock,不会出现 Belady 异常)
⭐ 非栈式策略(FIFO、Second Chance,可能出现异常)。
LRU 缺页率低但实现难,Clock 是最常用的近似 LRU,FIFO 最简单但最差。
操作系统面试核心知识点
1341

被折叠的 条评论
为什么被折叠?



