操作系统期末考试 简答题焚决
本文是笔者根据自己学校的操作系统期末考试复习大纲整理的知识点合集,主要针对简答题,可以用于复习大部分的操作系统知识。
引用块中的内容可直接用于答题。
综合题未收录,如果需要可以自行学习。
2025-2026(一)操作系统原理知识要点
题型:
简答题4题,综合应用6题
本门课知识要点:
进程管理:
1. 进程的基本状态:
三种:就绪、执行、阻塞(Ready, Running, Block)
- 就绪(Ready)状态:指进程已处于准备好运行的状态,即已分配到除CPU以外的所有必要资源,只要获得CPU即可立即执行。
- 执行(Running)状态:指进程已获得CPU,其程序正在执行的状态。
- 阻塞(Block)状态:指正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行时的状态,亦即进程的执行收到阻塞。
2. 导致进程切换的主要因素
-
当前运行进程时间片用完,系统需要重新分配处理机;
-
运行进程因等待 I/O 或资源而阻塞,必须让出 CPU;
-
有更高优先级的进程进入就绪态,发生抢占;
-
进程执行结束或被撤销,释放 CPU;
-
进程状态发生变化(如阻塞态转为就绪态),可能触发重新调度。
3. 进程的基本操作的作用及步骤;
进程的基本操作包括:创建、撤销、阻塞和唤醒,其作用及基本步骤如下:
-
创建进程
作用 :为程序的并发执行建立一个新的进程。
步骤 :(1)为新进程分配唯一的进程标识符;
(2)为进程分配必要的资源(如内存、PCB 等);
(3)初始化 PCB;
(4)将进程插入就绪队列。
-
撤销进程
作用 :结束进程的执行并释放其占用的资源。
步骤 :(1)终止进程的执行;
(2)释放进程占有的各种资源;
(3)撤销 PCB,并从队列中删除。
-
阻塞进程
作用 :当进程因等待某事件(如 I/O 完成)而不能继续执行时,使其暂停执行。
步骤 :(1)保存进程现场;
(2)修改进程状态为阻塞态;
(3)将进程插入阻塞队列。
-
唤醒进程
作用 :当阻塞进程所等待的事件发生时,使其重新具备执行条件。
步骤 :(1)将进程从阻塞队列移出;
(2)修改进程状态为就绪态;
(3)插入就绪队列。
5. 进程同步基本概念和原则
进程同步是指在多道程序环境下,为协调并发进程在共享资源或相互协作时的执行顺序,对进程的执行进行制约与协调。
进程同步应遵循空闲让进 、忙则等待 、有限等待 和让权等待等原则,以保证系统运行的正确性和公平性。
进程同步的基本原则(考试重点)
进程同步应遵循以下原则:
- 空闲让进原则
当共享资源空闲时,应允许一个请求该资源的进程立即进入临界区。 - 忙则等待原则
当共享资源被占用时,其它请求该资源的进程必须等待。 - 有限等待原则
任何一个请求进入临界区的进程,其等待时间必须是有限的,避免"饿死"。 - 让权等待原则
不能进入临界区的进程应立即释放处理机,避免忙等。
6. 信号量的基本原理
信号量是一种用于进程同步和互斥的整型变量,只能通过原子操作 P 和 V 进行访问。P 操作使信号量减 1,当 S<0 时进程阻塞;V 操作使信号量加 1,当 S≤0 时唤醒一个等待进程。通过信号量可以有效地协调并发进程对共享资源的访问。
信号量 (Semaphore )是一种用于实现进程同步与互斥的整型变量,它只能通过原子操作 P 操作和 V 操作来访问。
通过对信号量的操作,可以控制并发进程对共享资源的访问,从而保证程序执行的正确性。
信号量 的含义:
S > 0:表示系统中可用资源的数量
S = 0:表示资源刚好用完
S < 0:表示有 S 个进程在等待资源
P 操作(wait 操作)
操作:P(S)
执行过程:
S ← S − 1
若 S < 0,则进程阻塞,进入等待队列
V 操作(signal 操作)
操作:V(S)
执行过程:
S ← S + 1
若 S ≤ 0,则唤醒一个等待进程
👉 P、V 操作必须是原子操作(考试关键词)
信号量的作用(可作为一段总结)
- 实现 进程互斥(互斥信号量,初值一般为 1)
- 实现 进程同步(同步信号量,初值一般为 0)
- 协调并发进程对共享资源的访问
7. 管程的作用及主要组成部分
管程是一种高级进程同步机制,用于对共享资源及其访问操作进行集中管理。管程通过封装共享数据及对其操作的过程,并引入条件变量实现进程同步,从而保证并发进程对共享资源的互斥访问,简化同步程序设计。
管程(Monitor)是一种高级进程同步机制,用于对共享资源及其访问操作进行集中管理 ,从而保证多个并发进程对共享资源的互斥访问和正确同步。
👉 管程的主要作用是:
-
封装共享资源
-
自动实现互斥
-
简化进程同步程序设计
-
避免程序员直接使用 P、V 操作带来的错误
管程的主要组成部分(必考点)
一个管程通常由以下三部分组成:
- 共享数据结构
- 管程中定义的共享变量
- 用于表示和描述被多个进程共享的资源
- 对共享数据进行操作的过程(管程过程)
- 封装对共享数据的访问和操作
- 进程只能通过调用这些过程来访问共享数据
- 条件变量(Condition Variables)
- 用于描述进程同步条件
- 通常配合
wait和signal操作使用 - 当条件不满足时,进程在条件变量上等待
👉(这 三点必须全写,不然会扣分)
8. 掌握使用PV操作解决典型的进程同步问题;
这题为综合题,可自行学习
9. 调度三个层次;
操作系统的处理机调度分为三个层次:作业调度、内存调度和进程调度。作业调度决定哪些作业进入内存并创建进程;内存调度负责进程的换入换出;进程调度从就绪队列中选择进程占用 CPU 执行。
一、调度的三个层次(标准答案)
在操作系统中,处理机调度通常分为三个层次:
- 作业调度(高级调度)
- 内存调度(中级调度)
- 进程调度(低级调度)
各层次调度的作用与特点(必写)
1️⃣ 作业调度(高级调度)
作用 :
决定哪些作业从外存进入内存并创建进程。
特点:
- 调度频率低
- 主要用于多道批处理系统
- 影响系统吞吐量和资源利用率
2️⃣ 内存调度(中级调度)
作用 :
决定哪些进程被换入或换出内存,实现对内存中进程数量的动态调整。
特点:
- 引入挂起状态
- 在内存紧张时进行
- 主要用于分时系统
3️⃣ 进程调度(低级调度)
作用 :
从就绪队列中选择一个进程占用 CPU 运行。
特点:
- 调度最频繁
- 直接决定 CPU 的分配
- 影响系统响应时间
10. 常见的处理机调度算法的基本原理、优缺点及作业调度和进程调度的相关计算(短作业优先、优先级调度策略、高响应比优先调度算法等)。
短作业优先算法优先调度运行时间短的作业,平均周转时间最小,但可能导致长作业饥饿;优先级调度根据进程优先级进行调度,灵活但可能产生饥饿现象;高响应比优先算法通过引入响应比,兼顾短作业和长作业,较好地避免了饥饿问题。
常考三类算法:
- 短作业优先(SJF / SPF)
- 优先级调度
- 高响应比优先(HRRN)
简答题:原理 + 优缺点
短作业优先(SJF)
1️⃣ 基本原理
优先调度运行时间最短的作业(或进程)。
非抢占式:作业一旦运行到结束
抢占式:最短剩余时间优先(SRTF)
2️⃣ 优点
平均周转时间最小(理论最优)
提高系统吞吐量
3️⃣ 缺点
需要预知作业运行时间(不现实)
长作业可能长期等待(饥饿)
优先级调度算法
1️⃣ 基本原理
为每个作业/进程赋予一个优先级,优先级高者先运行。
- 可抢占 / 不可抢占
- 优先级可静态 / 动态
2️⃣ 优点
可体现任务重要性
灵活,适用于多种系统
3️⃣ 缺点
低优先级进程可能饥饿
优先级设置不当影响公平性
高响应比优先调度(HRRN)
1️⃣ 基本原理(必背公式)
响应比𝑅=(等待时间+运行时间)/运行时间响应比𝑅 = (等待时间 + 运行时间)/运行时间响应比R=(等待时间+运行时间)/运行时间
响应比高者优先执行
2️⃣ 优点(考试重点)
综合考虑:
- 等待时间
- 运行时间
既照顾短作业,又避免长作业饥饿
3️⃣ 缺点
每次调度需计算响应比
实现复杂度较高
11. 理解多级反馈队列调度算法内容和设计思路。
多级反馈队列调度算法通过设置多个优先级不同的就绪队列,并根据进程的执行情况动态调整其优先级,不需要预先知道进程运行时间,能够兼顾短进程和长进程,提高系统响应速度,适用于分时系统。
多级反馈队列的基本内容(算法怎么运行)
多级反馈队列调度通常具有以下特点:
-
设置多个就绪队列
- 每个队列对应一个优先级
- 优先级从高到低依次排列
-
不同队列使用不同时间片
- 优先级越高 → 时间片越小
- 优先级越低 → 时间片越大
-
高优先级队列先调度
- 只有高优先级队列为空时,才调度低优先级队列
-
进程优先级可动态变化(反馈机制)
- 若进程在一个时间片内未完成 → 降到低优先级队列
- 若进程主动让出 CPU(如 I/O)→ 可能保持或提升优先级
12. 处理死锁基本方法
操作系统中处理死锁的基本方法包括死锁预防、死锁避免、死锁检测和死锁解除。死锁预防通过破坏死锁产生的必要条件来防止死锁;死锁避免通过判断系统是否处于安全状态来避免死锁;死锁检测允许死锁发生并通过检测算法发现死锁;死锁解除在检测到死锁后通过撤销进程或剥夺资源等方式解除死锁。
(1)预防死锁:
破坏互斥条件(不能摒弃互斥,互斥对操作系统是好的)
破坏不剥夺条件
破坏请求和保持条件
破坏循环等待条件
预防死锁的措施:
(1)摒弃"不剥夺"条件
(2)摒弃"请求和保持条件"条件
(3)摒弃"环路等待"条件
(2)避免死锁:安全状态、银行家算法
(3)检测死锁:利用死锁定理
(4)解除死锁:资源剥夺法撤销进程法进程回退法
13. 死锁的必要条件,
产生进程死锁的必要条件:互斥条件;请求和保持条件;不剥夺条件;环路等待条件;
14. 安全状态的概念
在某一时刻,系统能够按照某种进程执行顺序(称为安全序列 ),依次为各进程分配所需资源并使其顺利完成,而不会发生死锁的系统状态
15. 银行家算法
银行家算法 是一种死锁避免算法 ,其基本思想是:
在系统进行资源分配前,先判断分配后系统是否仍处于安全状态,只有在不破坏安全状态的情况下,才允许进行资源分配。
存储管理
1. 程序的装入和链接的主要方式;
程序装入(Loading)
定义 :
程序装入是将可执行程序从磁盘读入内存,并为其分配运行空间的过程。
装入方式(常考)
- 绝对装入(Absolute Loading)
- 程序编译时已知装入地址
- 装入后直接运行
- 优点:简单,开销小
- 缺点:灵活性差,内存利用率低
- 重定位装入(Relocatable Loading)
- 程序可以在内存的任意位置装入
- 使用 重定位寄存器 或 偏移地址
- 优点:灵活性高,内存利用率好
- 缺点:装入时需修改地址
- 动态装入(Dynamic Loading)
- 程序的一部分(如子程序)在需要时才装入内存
- 优点:节省内存
- 缺点:增加运行开销
程序链接(Linking)定义:
链接是将程序的各个模块或库函数地址调整为可执行的内存地址,并生成最终的可执行文件的过程。
链接方式(常考)
- 绝对链接(Absolute Linking)
- 所有模块在编译时已经确定地址
- 缺点:程序不可移动
- 可重定位链接(Relocatable Linking)
- 生成的目标代码可以装入内存的任意位置
- 链接器生成相对地址或使用重定位信息
- 动态链接(Dynamic Linking)
- 程序运行时才将某些库模块装入内存
- 主要用于共享库(如 DLL)
- 优点:节省内存,程序更新方便
2. 虚拟存储器基本原理和实现的要点。
虚拟存储器 是一种在逻辑上扩充内存容量的存储管理技术。
它使用户感觉系统具有比实际物理内存更大的存储空间,而实际上只有部分程序和数据装入内存,其余存放在外存中。
虚拟存储器基于程序的局部性原理,采用按需调入的方式工作。
当访问的页面(或段)不在内存时,系统通过缺页(段)中断将其从外存调入。虚拟存储器通常通过请求分页系统或请求分段系统来实现,并配合页面置换算法完成内存管理。
3. 分区管理的主要类型基本原理及优缺点;
一、连续分配管理方式(Contiguous Allocation)
连续分配方式要求作业在内存中占用一段连续的存储空间。根据内存划分方式不同,可分为:
- 单一连续分配(Single Partition)
- 内存划分为一个固定区域,通常用于单用户/单任务操作系统
- 优点:实现简单
- 缺点:CPU利用率低,内存浪费严重
- 固定分区分配(Fixed Partition)
- 内存划分为多个固定分区,分区大小可相等或不等,但固定不变
- 作业分配到刚好或最接近的分区
- 优点:实现简单,作业调度方便
- 缺点:分区可能过大 → 内部碎片,利用率低
- 动态分区分配(Dynamic Partition)
- 内存根据作业需要动态划分,分区大小可变
- 分配策略算法 :
- 首次适应(First Fit):空闲分区按地址递增顺序排列,找到第一个能满足作业需求的分区
- 最佳适应(Best Fit):空闲分区按容量递增排列,找到最接近作业所需大小的分区
- 最坏适应(Worst Fit):空闲分区按容量递减排列,选择最大的空闲分区
- 邻近适应(Next Fit):从上次分配结束的位置开始查找,类似首次适应的优化
- **优点:**内存利用率高,适应不同大小作业
- 缺点:容易产生外部碎片,需要内存整理或紧缩
二、非连续分配管理方式(Non-contiguous Allocation)
非连续分配方式打破了必须连续分配内存的限制 ,解决了动态分区中外部碎片问题,常用方式包括分页、分段、段页式。
- 基本分页式存储管理(Paging)
- 内存划分为大小相等的页框(frame/page frame),每个页框有编号
- 作业地址空间划分为等大小的页面(page),每页有页号
- 核心思想 :页面与页框一一对应,不必连续,可分散存放
- 优点:
- 消除外部碎片
- 支持虚拟内存
- 缺点:
- 内存管理稍复杂
- 存在内部碎片
- 基本分段式存储管理(Segmentation)
- 作业地址空间按逻辑划分为若干段(code、data、stack等)
- 每段长度可变,与程序逻辑相关
- 类似页表的结构称为段表
- 优点:
- 符合程序逻辑
- 便于共享和保护
- 缺点:
- 外部碎片仍可能存在
- 段页式存储管理(Segmented Paging)
- 将段式和分页结合
- 段内分页,段外可分散存放
- 优点:
- 兼顾段的逻辑性和页的连续性优势
- 缺点:
- 结构复杂,考试通常不重点考
三、总结比较表(方便考试背)
| 类型 | 分配方式 | 优点 | 缺点 |
|---|---|---|---|
| 单一连续 | 整体固定 | 简单 | 内存利用率低 |
| 固定分区 | 固定多分区 | 简单,调度方便 | 内部碎片、利用率低 |
| 动态分区 | 可变大小 | 内存利用率高 | 外部碎片,需要整理 |
| 分页 | 页对页框,不连续 | 消除外部碎片,支持虚拟内存 | 内部碎片,管理复杂 |
| 分段 | 按逻辑段,不连续 | 符合程序逻辑,易共享 | 外部碎片仍存在 |
| 段页式 | 段内分页 | 兼顾逻辑性和连续性 | 结构复杂 |
4. 分区的回收和分配的基本过程;
在动态分区管理中,分区分配时,系统首先根据空闲分区表选择合适的空闲区(如首次适应、最佳适应等),若空闲区大于请求大小则进行分割,并更新空闲分区表。
分区回收时,将释放的分区标记为空闲,并检查其前后是否存在空闲分区,必要时进行合并,以减少外部碎片,最后更新空闲分区表。
一、分区分配的基本过程(动态分区)
1️⃣ 建立空闲分区表
系统用空闲分区表或空闲链表记录当前所有空闲内存块的信息(起始地址、大小)。
2️⃣ 选择分配算法
当有作业请求内存时,系统按一定策略从空闲分区中选择合适的一块:
常见算法(考试高频):
- 首次适应(First Fit):找到第一个能容纳的空闲区
- 最佳适应(Best Fit):找到最小但能容纳的空闲区
- 最坏适应(Worst Fit):选择最大的空闲区
3️⃣ 分割空闲分区
- 若空闲区大小 = 请求大小 → 整块分配
- 若空闲区大小 > 请求大小 → 分割:
- 前一部分分配给作业
- 剩余部分仍作为空闲区
4️⃣ 更新空闲分区表
修改或删除原空闲分区记录,加入新的剩余空闲区信息。
二、分区回收的基本过程(动态分区)
当作业执行完毕释放内存时,需要回收分区。
1️⃣ 回收已分配分区
将该分区标记为空闲。
2️⃣ 与相邻空闲区合并(重点‼)
根据释放分区与相邻分区的关系,分四种情况:
| 情况 | 处理方式 |
|---|---|
| 左邻空闲 | 向左合并 |
| 右邻空闲 | 向右合并 |
| 左右都空闲 | 三块合并成一块 |
| 左右都不空闲 | 直接作为新空闲区 |
3️⃣ 更新空闲分区表
- 删除被合并的旧分区记录
- 插入新的大空闲分区记录
5. 碎片的概念(内部碎片和外部碎片的区别、如何消除碎片)
外部碎片:多出去存不下的
内部碎片:比如一个格子是4kb,存入了3.5kb,剩下的就是内部碎片。就是已分配但没有装满的。分段式存储是需要多少就给他分配多少, 所以不会出现内部碎片
碎片是指内存中不能被有效利用的空间。内部碎片是指已分配给作业的内存中未被使用的部分,常见于固定分区和分页系统;外部碎片是指内存中存在多个不连续的空闲分区,虽总量足够但无法分配给作业,常见于动态分区管理。外部碎片可通过紧凑或分页方式消除,而内部碎片只能通过合理设置分区或页大小来减少。
一、碎片的概念(总体定义)
碎片:
指内存中不能被有效利用的空间。
碎片主要分为:
👉 内部碎片 和 外部碎片
二、内部碎片(Internal Fragmentation)
1️⃣ 概念
已分配给作业的内存中,由于分配的内存大于实际需求而未被使用的部分。
📌 特点:
- 在 已分配分区内部
- 属于作业,但用不上
产生原因
- 固定分区管理
- 页式存储管理(页大小固定)
3️⃣ 示例
- 分配一个 8KB 分区
- 作业只需要 6KB
- 剩余 2KB 就是内部碎片
4️⃣ 消除 / 减少方法
- 选择合适的分区或页大小
- 采用可变分区或分段管理(减轻)
三、外部碎片(External Fragmentation)
1️⃣ 概念
内存中存在足够多的空闲空间,但这些空闲空间不连续,无法分配给作业。
📌 特点:
- 位于 分区之间
- 不属于任何作业
产生原因
- 动态分区管理
- 作业频繁分配和回收
示例
空闲区:10KB + 8KB + 6KB
需要:20KB
👉 总空闲 > 20KB,但没有连续空间 → 失败(外部碎片)
4️⃣ 消除 / 解决方法(必考‼)
| 方法 | 原理 |
|---|---|
| 紧凑(Compaction) | 移动作业,使空闲区连续 |
| 分页 | 彻底消除外部碎片 |
| 分段 + 分页 | 减少外部碎片 |
四、内部碎片 vs 外部碎片(对比表)
| 对比点 | 内部碎片 | 外部碎片 |
|---|---|---|
| 位置 | 已分配分区内部 | 分区之间 |
| 是否分配给作业 | 是 | 否 |
| 常见于 | 固定分区、分页 | 动态分区 |
| 是否可紧凑消除 | 否 | 是 |
| 是否可分页消除 | 不完全 | 是 |
6. 分页、分段方法的基本原理,分页系统中逻辑地址和物理地址的转换;
分页 是将逻辑地址空间划分为等大小的页,物理内存划分为同样大小的页框,通过页表完成映射。逻辑地址由页号和页内偏移组成,物理地址 = 页框号 × 页大小 + 页内偏移。分段是按程序逻辑划分段,每段可变长,逻辑地址由段号和段内偏移组成,物理地址 = 段基址 + 段内偏移。分页消除外部碎片,分段更符合程序逻辑,但可能产生外部碎片。
一、分页(Paging)
1️⃣ 基本原理
- 将逻辑地址空间划分为若干等大小的页(Page)
- 将物理内存划分为同样大小的页框(Frame)
- 页与页框一一对应,通过**页表(Page Table)**完成映射
- 优势:消除外部碎片,提高内存利用率
- 缺点:可能产生内部碎片(最后一页未用完)
2️⃣ 逻辑地址到物理地址的转换
假设:
- 逻辑地址 = 页号(p) + 页内偏移(d)
- 页表存储每个页对应的物理页框号(f)
转换公式:
物理地址=页框号×页大小+页内偏移物理地址=页框号×页大小+页内偏移物理地址=页框号×页大小+页内偏移
访问过程:
- 从逻辑地址中提取页号 p
- 在页表中查找对应的页框号 f
- 拼接页框号 f 与页内偏移 d 得到物理地址
3️⃣ 多级页表 & 快表(考试常考)
- 多级页表:将页表划分为多级,节省内存
- 快表(TLB):缓存最近访问的页表项,加快访问速度
二、分段(Segmentation)
1️⃣ 基本原理
- 按程序逻辑划分段(如代码段、数据段、堆栈段)
- 每个段有 段基址 + 段长
- 段与物理内存块不必等大小(段可变长)
2️⃣ 地址表示
- 逻辑地址 = 段号(s) + 段内偏移(d)
- 转换到物理地址:
物理地址=段基址+段内偏移物理地址=段基址+段内偏移物理地址=段基址+段内偏移
3️⃣ 优缺点
- 优点:更符合程序逻辑,支持保护与共享
- 缺点:容易产生外部碎片
三、分页 vs 分段对比(考试常考)
| 特点 | 分页 | 分段 |
|---|---|---|
| 内存单位 | 固定页 | 可变段 |
| 碎片 | 内部碎片 | 外部碎片 |
| 逻辑与物理映射 | 页表 | 段表 |
| 适用场景 | 消除外部碎片,按需装入 | 按程序逻辑组织,便于保护共享 |
7. 多级页表及快表的作用,各种情况下(快表命中、快表未命中、缺页)访问的过程;
多级页表用于节省页表占用的内存,将页表分层管理,逻辑地址依次通过页目录、页表得到物理页框号。快表用于缓存最近访问的页表项,加快地址转换。访问逻辑地址时:
- 快表命中 → 直接得到物理地址;
- 快表未命中但页在内存 → 查页表得到页框号,并更新快表;
- 页不在内存 → 缺页 → 系统调入所需页,更新页表和快表,然后访问。
一、多级页表的作用
1️⃣ 为什么要多级页表?
- 单级页表:逻辑地址空间大 → 页表非常大 → 占用内存
- 多级页表:将页表分为多级(常用两级或三级)
- 只为使用的页分配页表
- 节省内存
2️⃣ 基本原理
- 逻辑地址分为:页目录号 + 页表索引 + 页内偏移
- 访问时:
- 先用页目录号查页目录(一级页表) → 得到二级页表的基址
- 再用页表索引查二级页表 → 得到页框号
- 页框号 + 页内偏移 → 物理地址
二、快表(TLB, Translation Lookaside Buffer)的作用
- 存放最近访问的页表项
- 加速逻辑地址到物理地址的转换
- 避免每次访问都查主内存中的页表
三、访问过程(分情况)
1️⃣ 情况 A:快表命中(TLB Hit)
- 快表中有对应页号的页框号 → 直接得到物理地址
- 步骤 :
- 从逻辑地址提取页号
- 查快表 → 命中
- 拼接页框号 + 页内偏移 → 物理地址
- 特点:访问速度快
2️⃣ 情况 B:快表未命中,页在内存中(TLB Miss, Page Hit)
- 页号不在快表,但页在物理内存
- 步骤 :
- 查页表 → 得到页框号
- 更新快表(替换一个旧项)
- 拼接页框号 + 页内偏移 → 物理地址
- 特点:访问比快表命中慢,但不触发缺页
3️⃣ 情况 C:缺页(Page Fault)
- 页号不在内存中 → 访问触发缺页中断
- 步骤 :
- 系统中断 → 缺页处理
- 从辅存(磁盘)调入所需页
- 更新页表和快表
- 重新访问物理地址
- 特点:访问延迟大
8. 访问时间的计算;
这是分页系统 + 快表(TLB)常考的计算题 ,考试非常经典。我们来系统讲清楚 原理 + 公式 + 示例。
访问时间的计算通常考虑快表(TLB)命中与未命中情况。平均有效访问时间为:
EMAT=h⋅(ttlb+tm)+(1−h)⋅(ttlb+2tm)EMAT=h⋅(t_{tlb}+t_{m})+(1−h)⋅(t_{tlb}+2t_m)EMAT=h⋅(ttlb+tm)+(1−h)⋅(ttlb+2tm)
若还考虑缺页,则加入缺页概率 ppp 与调页时间 tpft_{pf}tpf:
EMAT=(1−p)⋅[h⋅tm+(1−h)⋅2tm]+p⋅tpfEMAT=(1−p)⋅[h⋅t_m+(1−h)⋅2tm]+p⋅t_{pf}EMAT=(1−p)⋅[h⋅tm+(1−h)⋅2tm]+p⋅tpf
一、基本概念
- TLB(快表)
- 用于缓存最近访问的页表项
- 查找速度快(几乎与寄存器访问一样快)
- 内存访问时间(Memory Access Time, MAT)
- 访问一次物理内存所需时间
- TLB命中率(h)
- 命中快表的概率
- 0 ≤ h ≤ 1
二、访问时间计算公式(带TLB)
设:
- h=TLBh = TLBh=TLB命中率
- tm=内存访问时间t_{m} = 内存访问时间tm=内存访问时间
- 假设快表查找时间很短,可以忽略或者记作 ttlbt_{tlb}ttlb
1️⃣ 快表命中(TLB Hit)
- 访问一次快表 + 一次内存 → 访问时间 ≈ ttlb+tmt_{tlb} + t_mttlb+tm
2️⃣ 快表未命中(TLB Miss, Page Hit)
- 访问快表 → 未命中 → 查页表 → 再访问内存 → 访问时间 ≈ ttlb+2tmt_{tlb} + 2 t_mttlb+2tm
3️⃣ 综合平均访问时间(Effective Memory Access Time, EMAT)
EMAT=h⋅(ttlb+tm)+(1−h)⋅(ttlb+2tm)EMAT=h⋅(t_{tlb}+t_{m})+(1−h)⋅(t_{tlb}+2t_m)EMAT=h⋅(ttlb+tm)+(1−h)⋅(ttlb+2tm)
- 若忽略 ttlbt_{tlb}ttlb:
EMAT=h⋅tm+(1−h)⋅2tm=tm(2−h)EMAT=h⋅t_m+(1−h)⋅2t_m=t_m(2−h)EMAT=h⋅tm+(1−h)⋅2tm=tm(2−h)
三、缺页(Page Fault)情况
- 缺页率 = ppp
- 调页时间(从磁盘) = tpft_{pf}tpf
则有效访问时间:
EMAT=(1−p)⋅[h⋅tm+(1−h)⋅2tm]+p⋅tpfEMAT=(1−p)⋅[h⋅t_m+(1−h)⋅2tm]+p⋅t_{pf}EMAT=(1−p)⋅[h⋅tm+(1−h)⋅2tm]+p⋅tpf
💡 记忆口诀:先考虑快表命中,再考虑未命中,再加缺页开销
9. 页面置换算法:OTP、FIFO、LRU和clock算法。
页面置换算法用于当内存已满时选择换出的页。
常用算法有:
- 最优置换(OTP):选择未来最长时间不被访问的页,理论最优;
- FIFO:选择最先进入内存的页,简单但可能产生 Belady 异常;
- LRU:选择最近最久未使用的页,性能接近最优,但实现复杂;
- Clock:LRU 近似算法,用访问位和环形队列实现,效率高且简单。
一、页面置换的背景
页面置换:当内存满了,需要调入新页时,从内存中选择一页换出到辅存(磁盘)。
目标:尽量减少缺页率,提高内存利用率
二、常见页面置换算法
1️⃣ 最优置换算法(Optimal, OTP)
原理:
- 选择在未来最长时间内不会被访问的页面换出
特点:
- 理论上缺页率最低
- 需要知道程序未来访问序列 → 实际中不可实现
考试重点 :通常用于 理论分析题 / 比较缺页率
2️⃣ 先进先出(FIFO)
原理:
- 内存中最早进入的页最先被换出
实现:
- 用队列维护内存页顺序
- 队头页换出 → 队尾加入新页
优缺点:
- 优点:实现简单
- 缺点:可能换出"正要用的页" → Belady 异常(增加帧数反而增加缺页)
3️⃣ 最近最少使用(LRU, Least Recently Used)
原理:
- 换出最近最久未使用的页面
实现方式:
- 可用栈或计数器维护最近访问顺序
- 实际操作成本较高,需要硬件支持或近似算法
优缺点:
- 优点:性能接近最优
- 缺点:实现复杂
4️⃣ Clock(时钟)算法
原理:
- LRU 的近似算法
- 内存页组成环形队列,每页有 访问位(use bit)
- 指针顺时针扫描:
- 若访问位 = 0 → 换出
- 若访问位 = 1 → 清零,指针移下一页
优缺点:
- 优点:实现简单、接近 LRU
- 缺点:不如 LRU 精确
三、三种常用算法总结表(考试易用)
| 算法 | 换出原则 | 优点 | 缺点 |
|---|---|---|---|
| OTP | 未来最长时间不访问 | 理论最优 | 实际不可实现 |
| FIFO | 最早进入的页 | 实现简单 | 可能频繁换出常用页,Belady异常 |
| LRU | 最近最久未使用的页 | 接近最优 | 实现复杂 |
| Clock | LRU近似,访问位=0换出 | 实现简单,效率高 | 不如LRU精确 |
I/O设备管理
1. I/O软件的层次,各层软件的主要作用及步骤;
I/O软件通常分为四层:
- 设备寄存器层/驱动:直接控制硬件,发出控制命令,读写数据;
- 设备独立层:屏蔽设备差异,提供统一接口;
- I/O管理层:管理请求队列、调度设备、缓冲管理和错误处理;
- 用户程序层 :提供高级I/O接口,方便应用程序调用。
I/O操作步骤为:用户程序发出请求 → I/O管理层排队 → 调用设备驱动 → 等待设备完成 → 数据返回用户程序。
一、I/O软件的层次
I/O软件通常分为 四个层次(有的教材简化为三层):
- I/O设备寄存器层 / I/O控制器驱动
- 作用:直接控制硬件设备寄存器,发出控制命令、读取/写入数据
- 实现方式 :通常由设备驱动程序(Driver)完成
- 设备独立层(设备无关 I/O)
- 作用:屏蔽具体设备差异,提供统一接口给上层
- 特点:上层程序不必关心设备类型(磁盘、打印机等)
- I/O子系统 / I/O管理层
- 作用 :
- 管理I/O请求队列
- 调度和分配设备
- 缓冲管理、错误处理
- 步骤:处理多个I/O请求 → 排队 → 调用设备驱动 → 完成操作
- 作用 :
- 用户程序层 / 高级I/O库
- 作用 :提供高级接口(如
read(),write()) - 特点:隐藏底层细节,方便应用程序调用
- 作用 :提供高级接口(如
二、各层主要作用总结表(考试常考)
| 层次 | 主要作用 | 实现方式 / 特点 |
|---|---|---|
| 设备寄存器层 / 驱动 | 控制设备、读写数据 | 设备驱动程序 |
| 设备独立层 | 屏蔽设备差异 | 提供统一接口 |
| I/O管理层 | 排队、调度、缓冲管理 | I/O子系统 |
| 用户程序层 | 提供高级I/O接口 | read() / write() 等 |
三、I/O操作的一般步骤
- 用户程序发出I/O请求
- I/O管理层把请求加入队列
- 调用设备驱动(驱动访问设备寄存器)
- 等待设备完成(可能中断通知或DMA)
- 数据返回给用户程序
💡 口诀记忆:用户请求 → 管理排队 → 调驱动 → 等待完成 → 数据返回
2. 程序I/O 、中断驱动I/O 、DMA 、 I/O通道控制方式基本原理和技术演变思路;
I/O技术演变如下:
- 程序控制I/O:CPU主动轮询设备状态,CPU等待完成,效率低;
- 中断驱动I/O:设备完成操作产生中断,CPU可执行其他任务,效率提高;
- DMA:直接存储器访问,数据传输不占CPU,适合大块数据;
- I/O通道:专用控制器独立完成I/O操作,CPU负担最小,常用于大型机。
一、三种I/O方式及原理
1️⃣ 程序控制I/O(Programmed I/O, PIO)
- 原理:CPU主动控制I/O设备,执行 I/O 指令,轮询设备状态
- 特点 :
- CPU 等待 I/O 完成 → CPU效率低
- 实现简单
- 适用:设备速度快或 I/O 量小
2️⃣ 中断驱动I/O(Interrupt-driven I/O)
- 原理 :
- CPU 发出 I/O 请求后,不等待
- 设备完成操作 → 产生中断 → CPU 中断服务程序处理
- 特点 :
- CPU 可并行执行其他任务 → CPU利用率高
- 增加中断处理逻辑
- 优点:比程序I/O效率高
- 缺点:硬件、软件实现复杂
3️⃣ DMA(Direct Memory Access, 直接存储器访问)
- 原理 :
- DMA 控制器直接从内存和设备传输数据,不占用 CPU
- CPU 只启动 DMA 传输并处理传输完成中断
- 特点 :
- CPU 可以同时执行其他任务
- 适合大块数据传输(如磁盘、网卡)
- 优点:极大提高系统吞吐量
- 缺点:硬件复杂,需要 DMA 控制器
二、I/O通道/控制方式
- 原理 :
- I/O 通道是专门的控制器,处理复杂 I/O 任务
- CPU 只发出命令 → 通道独立完成数据传输
- 特点 :
- 与 DMA 类似,但功能更强大,可处理多设备、多任务
- 常用于大型机(Mainframe)
三、技术演变思路(考试高频考点)
| 方式 | 技术思路 | CPU负担 | 适用场景 |
|---|---|---|---|
| 程序I/O | CPU轮询 | 高 | 简单/小数据量 |
| 中断I/O | CPU不等待 → 中断处理 | 中 | 中等速度设备 |
| DMA | CPU启动DMA → 控制器传输 | 低 | 大块数据,高速设备 |
| I/O通道 | 专用通道控制器处理 | 极低 | 大型机,多设备 |
💡 记忆口诀:轮询慢 → 中断快 → DMA更快 → 通道最强
3. 各类缓冲管理方法的类型及主要管理过程(单缓冲、双缓冲、环形缓冲、缓冲池)
缓冲管理方法有:
- 单缓冲:只有一个缓冲区,CPU与设备交替使用,效率低;
- 双缓冲:两个缓冲区,CPU和设备可并行工作,提高效率;
- 环形缓冲:首尾相连的缓冲区,支持流式数据,多生产者/消费者;
- 缓冲池:内存中预分配多个缓冲区,CPU和设备动态申请,提高效率与灵活性。
一、缓冲的作用
缓冲(Buffer)是在内存中为I/O设备准备的临时存储区,主要作用:
- 弥补CPU和I/O设备速度差异
- 提高I/O效率
- 减少CPU等待时间
二、缓冲管理方法类型及流程
1️⃣ 单缓冲(Single Buffer)
原理:只有一个缓冲区,CPU和设备交替使用
流程:
- CPU把数据放入缓冲区 → 设备读取/写入
- CPU必须等待设备完成 → CPU闲置
特点:
- 简单
- CPU等待时间长 → 效率低
2️⃣ 双缓冲(Double Buffer)
原理:有两个缓冲区,CPU和设备可以交替使用
流程:
- CPU写入缓冲区 A → 设备读取缓冲区 B
- CPU写完 A → 设备读取完成 → 交换缓冲区
- 循环进行
特点:
- CPU和设备并行工作
- 提高效率
- 常用于高速I/O
3️⃣ 环形缓冲(Circular / Ring Buffer)
原理:缓冲区首尾相连,形成环形队列
流程:
- 写指针指向下一个空缓冲块
- 读指针指向下一个待处理块
- 写满则阻塞,读空则等待
特点:
- 支持连续流数据传输
- 常用于串口、网络等流式数据
- 可支持多生产者/多消费者
4️⃣ 缓冲池(Buffer Pool)
原理:内存中预先分配多个缓冲区(池)
- CPU和设备从缓冲池中申请空闲缓冲区
- 用完后释放回池
特点:
- 灵活管理内存
- 支持多设备、多任务
- 提高内存利用率
三、缓冲管理方法对比表(考试常考)
| 缓冲方式 | 缓冲块数 | CPU与设备关系 | 优缺点 | 典型应用 |
|---|---|---|---|---|
| 单缓冲 | 1 | 交替 | 简单,但CPU等待时间长 | 简单I/O |
| 双缓冲 | 2 | 可并行 | 提高效率,硬件要求增加 | 高速I/O |
| 环形缓冲 | N | 可并行、多生产者消费者 | 支持流式数据 | 串口、网络 |
| 缓冲池 | 多 | 动态分配 | 高效灵活 | 多任务、多设备 |
4. 磁盘调度算法(先来先服务、最短寻道时间有限、扫描算法)
常见磁盘调度算法包括:
- FCFS(先来先服务):按请求到达顺序处理,简单公平,但磁头频繁移动;
- SSTF(最短寻道时间优先):每次访问距离当前磁头最近的请求,效率高,但可能导致远处请求饥饿;
- SCAN(扫描算法/电梯算法):磁头沿一个方向扫描请求,到达边界反向扫描,避免饥饿且平均寻道时间较低。
一、背景
- 磁盘I/O访问时间主要受 寻道时间(磁头移动时间) 和 旋转延迟 影响
- 磁盘调度算法 的目标:减少寻道时间,提高吞吐量
二、常见磁盘调度算法
1️⃣ 先来先服务(FCFS, First-Come-First-Served)
原理:
- 按请求到达顺序依次处理
特点:
- 简单易实现
- 公平(按请求顺序)
- 缺点:磁头可能频繁跳跃 → 寻道时间大
步骤:
- 按请求队列顺序访问
- 移动磁头到对应柱面,执行读写
2️⃣ 最短寻道时间优先(SSTF, Shortest Seek Time First)
原理:
- 选择当前磁头位置到请求最近的磁道优先访问
特点:
- 寻道时间最小 → 提高效率
- 缺点:可能导致"饥饿"现象(远处请求长时间不被处理)
步骤:
- 计算所有请求与当前磁头距离
- 选择最近请求执行
- 更新磁头位置 → 重复
3️⃣ 扫描算法(SCAN, 电梯算法)
原理:
- 磁头像电梯一样,在一个方向上扫描处理请求,到达边界后反向扫描
特点:
- 避免SSTF饥饿问题
- 中等实现复杂度
- 提高平均效率
步骤:
- 磁头沿一个方向访问请求
- 到达最远请求或磁盘边界后反向扫描
- 重复
三、算法对比表(考试常考)
| 算法 | 原理 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|
| FCFS | 请求到达顺序 | 简单、公平 | 磁头频繁跳 | 小磁盘、简单场景 |
| SSTF | 最近磁道优先 | 平均寻道时间短 | 可能饥饿 | 中小型磁盘 |
| SCAN | 电梯扫描 | 避免饥饿,效率较好 | 实现复杂 | 大型磁盘系统 |
文件管理
1. 文件系统模型三个层次;文件的逻辑结构和物理结构概念和区别;
文件系统模型有三层:
- 用户逻辑层:提供文件操作接口,管理命名和目录结构;
- 文件组织层:管理文件内部结构和逻辑块到物理块的映射;
- 基本存储层 :直接控制磁盘读写操作。
文件的逻辑结构是面向用户的视图,如字节序列或记录序列,用户只关心内容和操作;
物理结构是文件在磁盘上的实际存储方式,如连续分配、链式分配或索引分配,面向系统,影响访问效率。
一、文件系统模型的三个层次
文件系统通常分为 三层结构:
- 用户逻辑层(Logical File System, LFS)
- 面向用户和应用程序
- 作用 :提供文件操作接口,如
open()、read()、write()、close() - 管理文件命名、权限、目录结构
- 文件组织层 / 文件管理层(File Organization Module, FOM)
- 面向操作系统内核
- 作用:管理文件内部结构,如逻辑块到物理块映射、索引、缓冲管理
- 决定文件在磁盘上的存储方式
- 基本存储层 / 设备驱动层(Basic File System / Device Driver)
- 直接与磁盘或其他存储设备交互
- 作用:实际读写磁盘块,完成低级I/O操作
💡 记忆口诀:用户层看逻辑,组织层看结构,设备层管物理
二、文件的逻辑结构与物理结构
1️⃣ 逻辑结构(Logical Structure)
- 面向用户的文件视图
- 概念 :
- 文件是字节序列、记录序列、树或表结构
- 用户只关心数据和文件操作接口
- 特点 :
- 抽象性高
- 不涉及存储位置
2️⃣ 物理结构(Physical Structure)
- 文件在磁盘上的实际存储形式
- 概念 :
- 文件由一系列磁盘块(物理块)组成
- 可能采用 连续分配、链式分配、索引分配
- 特点 :
- 面向系统
- 影响访问效率和碎片情况
3️⃣ 区别总结表
| 方面 | 逻辑结构 | 物理结构 |
|---|---|---|
| 面向 | 用户 | 系统 / 磁盘 |
| 表示 | 文件内容、记录、目录 | 磁盘块、链表、索引块 |
| 关注点 | 使用、操作、权限 | 存储位置、访问效率、碎片 |
| 抽象层 | 高 | 低 |
2. 文件目录的结构,FCB及索引结点的概念,目录查询的基本过程;
文件目录用于组织和管理文件,常见结构有单级目录、两级目录、树形目录和无环图目录 。FCB(文件控制块)是存放文件元信息的数据结构,包括文件名、类型、长度、存储位置、权限等;索引结点(i-node)是Unix/Linux系统中管理文件的结构,保存文件属性和数据块索引。
目录查询过程为:用户提供文件名 → 系统查目录结构 → 找到对应 FCB 或 i-node → 得到文件在磁盘中的存储位置 → 访问文件内容。
一、文件目录的结构
文件目录是操作系统用来组织和管理文件的信息结构,它通常有几种形式:
- 单级目录
- 所有文件都在一个目录下
- 优点:结构简单
- 缺点:文件多时容易冲突
- 两级目录
- 每个用户有自己的目录
- 优点:不同用户文件命名互不影响
- 缺点:跨用户访问复杂
- 树形目录
- 允许目录中包含子目录
- 优点:支持层次管理
- 缺点:实现复杂
- 无环图目录 / 一般图目录
- 支持目录或文件的多路径引用
- 优点:灵活
- 缺点:需要解决循环引用问题
💡 记忆口诀:单 → 双 → 树 → 图,层次越来越复杂
二、FCB(File Control Block)和索引结点(i-node)
1️⃣ FCB(文件控制块)
- 概念:存放文件的管理信息的数据结构
- 包含内容 :
- 文件名
- 文件类型
- 文件长度
- 文件存储位置(直接地址 / 索引 / 链表)
- 访问权限
- 时间戳(创建/修改时间)
2️⃣ 索引结点(i-node)
- 概念:Unix/Linux文件系统中管理文件的核心结构
- 作用:保存文件元信息和指向磁盘块的索引
- 包含内容 :
- 文件权限、长度、时间等属性
- 指向文件数据块的直接 / 间接指针
💡 FCB和i-node都是文件元信息结构,区别在于i-node更接近Unix文件系统实现,FCB更通用。
三、目录查询的基本过程
目录查询:通过文件名找到文件存储位置的过程。
基本步骤
- 用户提供文件名
- 操作系统在目录结构中查找该文件名
- 单级目录:直接线性搜索
- 树形目录:从根节点或当前目录逐层查找
- 找到文件 → 读取文件的 FCB / i-node
- 得到文件的数据块位置 → 访问文件
💡 口诀:输入名字 → 查目录 → 得FCB/i-node → 得位置 → 访问数据
3. 各种磁盘组织形式(连续、链接、索引方式)的特点以及优缺点;
文件的磁盘组织方式有三种:
- 连续分配 :文件块在磁盘上连续存储,访问速度快 ,但容易产生外部碎片,文件扩展困难;
- 链接分配 :每个块存储下一个块的指针,支持文件增长,无外部碎片,但随机访问慢,指针开销大;
- 索引分配 :为文件建立索引块,存储所有数据块号,支持顺序和随机访问,扩展灵活 ,但索引块可能占用较多空间。
一、连续分配(Contiguous Allocation)
原理:文件在磁盘上占用连续的一段块
特点:
- 逻辑上连续 → 访问速度快
- 易实现随机访问
优点:
- 顺序访问和随机访问速度快
- 文件结构简单
缺点:
- 容易产生外部碎片
- 文件扩展困难,需要搬移或预留空间
二、链接分配(Linked Allocation)
原理:文件的每个磁盘块通过指针链接到下一个块
特点:
- 文件块在磁盘上可以不连续
- 顺序访问简单
优点:
- 无外部碎片
- 易于文件增长
缺点:
- 随机访问慢,需要从头遍历链表
- 每个块需存储指针 → 增加开销
三、索引分配(Indexed Allocation)
原理:为每个文件建立索引块,存储文件所有数据块号
特点:
- 支持顺序和随机访问
- 文件块不连续
优点:
- 支持随机访问
- 文件扩展灵活
- 不产生外部碎片
缺点:
- 索引块可能占用较多内存
- 索引块损坏影响整个文件
4. 单级索引,多级索引,混合索引,计算文件的容量和所占盘块数量;
文件索引方式包括:
- 单级索引:每个文件一个索引块,存储所有数据块地址,支持随机访问,容量受单索引块限制;
- 多级索引:当文件大时,使用多级索引,一级索引指向二级索引块,再指向数据块,可支持大文件;
- 混合索引 :结合直接索引和间接索引,兼顾小文件访问速度和大文件容量。
文件容量和占用盘块数的计算公式为:容量=可存放数据块数×块大小,占用盘块=数据块数+索引块数容量=可存放数据块数×块大小,占用盘块=数据块数+索引块数容量=可存放数据块数×块大小,占用盘块=数据块数+索引块数
一、单级索引(Single-level Index)
原理:
- 每个文件对应一个索引块(Index Block),存储该文件所有数据块的地址
特点:
- 支持随机访问
- 文件大小受单个索引块容量限制
容量计算:
最大文件容量=索引块能存放的块数×块大小最大文件容量=索引块能存放的块数×块大小最大文件容量=索引块能存放的块数×块大小
二、多级索引(Multi-level Index)
原理:
- 当文件太大,单索引块存不下所有数据块
- 使用多级索引:一级索引指向二级索引块,二级索引再指向数据块(可递归)
特点:
- 支持非常大的文件
- 访问多一层索引 → 访问稍慢
容量计算(以二级索引为例):
最大文件容量=(一级索引指针数×每个二级索引指针数)×块大小最大文件容量=(一级索引指针数×每个二级索引指针数)×块大小最大文件容量=(一级索引指针数×每个二级索引指针数)×块大小
三、混合索引(Combined / Hybrid Index)
原理:
- 结合直接索引 + 间接索引
- 文件小 → 直接索引
- 文件大 → 一级或多级间接索引
特点:
- 兼顾小文件访问速度和大文件容量
- Linux ext2/ext3 文件系统采用此策略
容量计算:
最大文件容量=(直接块数+一级间接指针数+二级间接指针数+...)×块大小最大文件容量=(直接块数+一级间接指针数+二级间接指针数+...)×块大小最大文件容量=(直接块数+一级间接指针数+二级间接指针数+...)×块大小
四、文件占用盘块数量
公式:
占用盘块数=⌈文件大小块大小⌉+索引块数\text{占用盘块数} = \lceil \frac{\text{文件大小}}{\text{块大小}} \rceil + \text{索引块数}占用盘块数=⌈块大小文件大小⌉+索引块数
- 单级索引 → 占用 1 个索引块 + 数据块数
- 多级索引 → 占用多级索引块 + 数据块数
5. 不同组织结构下文件读取的过程(使用的组织结构、访问的盘块数量等)
不同磁盘组织结构下文件读取过程:
- 连续分配:FCB记录起始块号和长度 → 直接顺序访问连续块 → 访问数据块数 = 文件数据块数;
- 链式分配:FCB记录首块 → 按块内指针依次访问 → 顺序访问简单,随机访问慢;
- 索引分配:FCB记录索引块 → 读取索引块得到所有数据块号 → 按索引顺序访问 → 访问盘块数 = 索引块数 + 数据块数,多级索引需访问多级索引块。
一、不同磁盘组织结构的读取过程
1️⃣ 连续分配(Contiguous Allocation)
读取过程:
- 文件在FCB中记录 起始块号和长度
- 系统直接顺序访问磁盘连续块
- 读取所需数据
访问盘块数:
访问盘块数=数据块数\text{访问盘块数} = \text{数据块数}访问盘块数=数据块数
- 只需访问连续块,不需要额外索引块
特点:
- 顺序和随机访问都很快
2️⃣ 链式分配(Linked Allocation)
读取过程:
- FCB记录文件首块号
- 读取首块 → 块内指针指向下一块 → 依次读取
- 直到文件末尾
访问盘块数:
访问盘块数=数据块数+指针开销\text{访问盘块数} = \text{数据块数} + \text{指针开销}访问盘块数=数据块数+指针开销
- 每个块都需读取并解析指针
特点:
- 顺序访问简单
- 随机访问慢,需要从头遍历链表
3️⃣ 索引分配(Indexed Allocation)
读取过程:
- FCB中保存索引块位置
- 读取索引块 → 得到所有数据块号
- 按索引顺序访问数据块
访问盘块数:
\\text{访问盘块数} = 1 \\text{(索引块)} + \\text{数据块数}
- 多级索引:访问多级索引块 + 数据块
特点:
- 支持随机访问
- 顺序访问效率略低于连续分配
- 文件扩展灵活
二、访问盘块数量计算示例
假设文件占用 10 块数据块,每种组织方式:
| 组织方式 | 访问盘块数 | 备注 |
|---|---|---|
| 连续分配 | 10 | 起始块 + 9 个连续块 |
| 链式分配 | 10 | 每块需读取指针 |
| 单级索引 | 1(索引块) + 10 数据块 = 11 | 索引块记录数据块号 |
| 二级索引 | 1 一级索引 + N 二级索引 + 10 数据块 | 根据索引块指针数计算 |