# 计算机操作系统复试
# 操作系统的作用
- 是用户与计算机硬件之间的接口
- 是计算机系统资源的管理者
- 实现了对计算机资源的抽象
# 操作系统基本特征
- 并发
- 共享
- 虚拟
- 异步
# 操作系统最基本调特征
- 并发
- 共享
# 处理机的双重工作模式
用户态、核心态
特权指令在核心态执行,非特权指令在用户态下执行
# 操作系统主要功能
- 处理机调度
- 进程控制
- 进程同步
- 进程通信
- 调度
- 作业调度(高级调度)
- 进程调度(低级调度)
- 存储器管理
- 内存的分配与回收
- 内存保护
- 地址映射
- 内存扩充
- 设备管理
- 缓冲管理
- 设备分配
- 设备处理
- 文件管理
- 文件存储空间管理
- 目录管理
- 文件的读写管理和保护
- 接口管理
- 用户接口(脱机用户接口、联机用户接口、图形用户接口)
- 程序接口
# 程序并发执行特性
- 间断性
- 失去封闭性
- 不可再现性
# 进程的特征
动态性、并发性、独立性、异步性
# 进程的 3 状态模型、5 状态模型、7 状态模型
# 单 CPU 中的状态
状态 | 最多 | 最少 |
---|---|---|
运行 | 1 | 0 |
就绪 | N-1 | 0 |
阻塞 | N | 0 |
# PCB 中的信息
- 进程标识符
- 处理机状态
- 进程调度信息
- 进程控制信息
# 拥有资源?调度?
- 进程是拥有资源的
- 线程是独立调度的
# 高级调度(作业调度)
决定哪些作业从外存调入内存准备执行,控制系统的并发度。
# 中级调度(内存调度)
管理内存中的进程,通过挂起和激活来调整内存使用。
# 低级调度(进程调度)
决定哪个就绪进程获得 CPU 执行。
# 先来先服务 FCFS
按作业或进程到达的顺序分配 CPU。
- 简单易实现。
- 非抢占式,可能导致 “护航效应”(短作业等待长作业完成)。
- 平均等待时间较长,适合长作业。
# 短作业优先 SJF
优先调度运行时间最短的作业。
- 可抢占或非抢占。
- 最小化平均等待时间。
- 可能导致长作业 “饥饿”。
# 优先级调度 Priority Scheduling
按优先级分配 CPU,优先级高的先执行。
- 可抢占或非抢占。
- 可能导致低优先级进程 “饥饿”。
- 优先级可以是静态或动态调整。
# 时间片轮转调度 RR
每个进程分配一个固定时间片(Time Quantum),轮流执行。
- 抢占式,适合分时系统。
- 时间片大小影响性能:太小增加上下文切换开销,太大退化为 FCFS。
- 公平性好,响应时间短。
# 多级队列调度 Multilevel Queue Scheduling
将进程分为多个队列,每个队列采用不同的调度算法。
- 队列间可设置优先级。
- 适合混合型任务(如前台交互任务和后台批处理任务)。
# 多级反馈队列调度 Multilevel Feedback Queue Scheduling
进程可在多个队列间移动,根据行为动态调整优先级。
- 结合了优先级调度和轮转调度的优点。
- 动态适应进程行为,避免 “饥饿”。
- 实现复杂。
# 算法总结
算法 | 特点 | 适用场景 |
---|---|---|
FCFS | 简单,非抢占,护航效应 | 批处理系统 |
SJF | 最小化等待时间,可能导致长作业饥饿 | 批处理系统 |
优先级调度 | 按优先级执行,可能导致低优先级饥饿 | 实时系统 |
轮转调度 | 公平,响应时间短,时间片大小影响性能 | 交互式系统 |
多级队列调度 | 多队列,不同策略 | 混合任务系统 |
多级反馈队列调度 | 动态调整优先级,避免饥饿 | 通用操作系统 |
# 死锁
死锁是操作系统中的一种资源竞争现象,指多个进程或线程因争夺资源而陷入无限等待的状态,导致它们都无法继续执行。死锁的发生通常需要满足四个必要条件,称为死锁的四个必要条件。
# 死锁的四个必要条件
- 互斥条件(Mutual Exclusion):
- 资源一次只能被一个进程占用,其他进程必须等待。
- 请求与保持推荐(Hold and Wait):
- 进程已经占有一些资源,同时请求其他被占用的资源。
- 不剥夺条件(No Preemption):
- 进程已获得的资源不能被强制剥夺,只能由进程自行释放。
- 循环等待条件(Circular Wait):
- 存在一个进程等待的循环链,每个进程都在等待下一个进程占用的资源。
# 死锁的处理方法
- 死锁预防
- 死锁避免
- 死锁检测
- 死锁解除
# 银行家算法
-
检查资源分配后系统是否处于安全状态(即是否存在一个执行序列使所有进程完成)。
-
如果不安全,则拒绝分配请求。
# 两种制约关系
- 互斥关系
- 同步关系
# 解决临界区同步问题须遵循以下准则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
# 程序的装入方式
- 绝对装入
- 程序中的地址是固定的,装入时不需要进行地址转换。
- 适用于单道程序环境,或者内存地址固定的系统。
- 灵活性差,程序必须加载到指定的内存位置,无法适应多道程序环境。
- 可重定位装入
- 程序可以在内存的不同位置加载,适应多道程序设计。
- 装入时需要进行地址重定位,通常由操作系统或装入程序完成。
- 适用于多道程序环境,支持内存的动态分配。
- 动态运行时装入
- 程序可以部分加载,只有在需要时才将相关部分加载到内存。
- 地址转换由硬件和操作系统共同完成。
- 支持虚拟内存技术,允许程序的大小超过物理内存的容量。
- 绝对装入:适用于单道程序环境,地址固定,装入简单但缺乏灵活性。
- 可重定位装入:适用于多道程序环境,支持地址重定位,灵活性高。
- 动态运行时装入:支持虚拟内存,程序可以动态加载,适合现代操作系统。
# 连续分配存储器管理方式
- 单一连续分配
- 固定分区分配
- 动态分区分配
# 动态分区分配的算法
- 首次适应算法
- 循环首次适应算法
- 最佳适配算法
- 最坏适配算法
# 分页存储
# 分段存储
# 页面置换算法
- 先进先出算法
- 最佳页面置换算法
- 最近最久未使用算法
- 最少使用算法
- Clock 算法
- 改进型 Clock 算法
# 抖动
** 抖动(Thrashing)** 是操作系统中与虚拟内存管理相关的一种现象,通常发生在系统内存资源不足时。当系统频繁地进行页面置换(即频繁地将内存中的页面换出到外存,再从外存换入新的页面),导致大部分时间都花在页面调度上,而不是执行实际任务时,就发生了抖动。
# I/O 设别控制方式
- 使用轮询的可编程 I/O 方式(落后)
- 使用中断的可编程 I/O 方式(用的比较多)
- 使用 DMA(减少了 CPU 对 I/O 的干预)
- 使用 I/O 通道
# 假脱机技术 - SPOOLing
假脱机技术(SPOOLing,Simultaneous Peripheral Operations On-Line) 是一种用于管理输入 / 输出(I/O)操作的技术,特别是在处理低速外设(如打印机)时。SPOOLing 的核心思想是通过缓冲和排队机制,将外设的操作与主机的计算任务分离,从而提高系统的效率和资源利用率。
SPOOLing 的基本原理
- 输入井和输出井:
- SPOOLing 系统在磁盘上创建两个专门的存储区域:输入井和输出井。
- 输入井用于暂存从输入设备(如读卡器)读取的数据。
- 输出井用于暂存需要发送到输出设备(如打印机)的数据。
- 缓冲和排队:
- 当用户提交任务时,数据首先被写入磁盘的输入井或输出井,而不是直接发送到外设。
- 外设(如打印机)从输出井中按顺序读取数据并执行操作,而主机可以继续执行其他任务。
- 并行操作:
- 主机和外设可以并行工作。主机不需要等待外设完成操作,而是将数据交给 SPOOLing 系统后继续执行其他任务。
SPOOLing 的应用场景
- 打印任务管理:
- 打印机是典型的低速外设,SPOOLing 技术可以有效地管理多个打印任务,避免用户等待。
- 批处理系统:
- 在批处理系统中,SPOOLing 技术可以用于管理输入作业和输出结果。
- 网络打印:
- 现代网络打印机通常使用 SPOOLing 技术来管理来自多个用户的打印任务。
SPOOLing 技术就是将独占设备转变为逻辑上的共享设备,提高了 I/O 速度,实现了虚拟设备的功能。
# 文件在外存的组织方式
- 连续组织方式
- 链接组织方式(显示连接 FAT、隐式链接)
- 索引组织方式(一级索引、二级索引…)
# 显示链接
显示链接通过一个专门的链接表来记录文件中各个块的物理地址。这个表通常称为文件分配表(FAT, File Allocation Table)。
# 隐式链接
隐式链接将每个块的指针存储在块本身中,而不是使用一个全局的链接表。每个块中除了存储数据外,还包含下一个块的地址。
# 显示链接 vs 隐式链接
特性 | 显示链接(FAT) | 隐式链接 |
---|---|---|
存储结构 | 使用全局的 FAT 表存储链接信息 | 链接信息存储在块内部 |
访问方式 | 支持随机访问 | 仅支持顺序访问 |
空间开销 | FAT 表占用额外空间 | 无额外空间开销 |
实现复杂度 | 较复杂 | 较简单 |
可靠性 | FAT 损坏可能导致文件系统失效 | 单个块损坏可能影响文件完整性 |
适用场景 | 需要随机访问的场景 | 顺序访问为主的场景 |
# 小问题
# 进程和程序有什么区别
- 程序
- 程序是存储在磁盘或其他存储介质上的静态实体,由一系列指令和数据组成。
- 它是一个被动的实体,只有在被加载到内存并执行时才会发挥作用。
- 进程
- 进程是程序在内存中的动态执行实例。
- 它是一个主动的实体,包含了程序的执行状态(如程序计数器、寄存器、堆栈等)以及系统分配的资源(如内存、文件句柄等)。
特性 | 程序(Program) | 进程(Process) |
---|---|---|
定义 | 静态的指令和数据集合 | 程序的动态执行实例 |
生命周期 | 永久存在 | 临时存在,从创建到终止 |
状态 | 无状态 | 有状态(运行、就绪、阻塞等) |
资源占用 | 不占用系统资源 | 占用系统资源(CPU、内存等) |
并发性 | 不支持并发 | 支持并发 |
独立性 | 独立存在 | 进程间独立,可通过 IPC 交互 |
创建方式 | 开发者编写,编译生成 | 操作系统创建 |
示例 | 可执行文件(如 a.exe ) |
运行中的程序实例 |
# 死锁是什么?死锁是怎么产生的?如何处理死锁?
死锁是操作系统中的一种资源竞争问题,指的是多个进程或线程因为竞争资源而相互等待,导致它们都无法继续执行的状态。死锁是一种严重的系统问题,会导致系统资源浪费和程序无法正常运行。
- 死锁的产生条件
- 互斥条件
- 不剥夺条件
- 请求与保持条件
- 循环等待条件
- 死锁的处理方法
- 死锁的预防
- 死锁的检测
- 死锁的避免
- 死锁的解除
# 饥饿是什么?和死锁有什么区别?
饥饿是指某个进程或线程因为资源总是被其他进程抢占,导致它长期得不到所需的资源,从而无法继续执行。
产生原因
- 资源分配策略不公平:
- 某些进程总是优先获得资源,而其他进程被忽略。
- 优先级调度问题:
- 高优先级进程不断抢占资源,低优先级进程始终得不到资源。
- 资源竞争激烈:
- 资源数量有限,且竞争资源的进程过多。
特性 | 饥饿(Starvation) | 死锁(Deadlock) |
---|---|---|
定义 | 某个进程长期得不到资源 | 多个进程相互等待,无法继续执行 |
成因 | 资源分配不公平或优先级调度问题 | 四个必要条件同时满足 |
涉及进程数量 | 可能只有一个进程被 “饿死” | 至少有两个或多个进程相互等待 |
资源状态 | 资源被其他进程占用,但未被阻塞 | 资源被占用且进程相互阻塞 |
解决方法 | 公平调度、动态优先级调整、资源预留 | 预防、避免、检测与恢复、忽略 |
影响范围 | 只影响被 “饿死” 的进程 | 影响所有参与死锁的进程 |
是否可恢复 | 可以通过调整资源分配恢复 | 需要外部干预(如终止进程)才能恢复 |