Skip to content

计算机操作系统 2

第三章 内存管理

3.1 内存管理

3.1.1 内存管理概念

什么是内存

内存(如 DRAM )是计算机的 临时数据存储部件,特点:

  • 读写速度快(接近 CPU 运算速度),但 断电数据丢失;
  • 与持久存储(硬盘、SSD)区分:后者用于长期保存数据,前者支撑程序实时运行。

内存是 CPU 与外设(如硬盘)的 “缓冲层”,也是程序运行的基础。

进程运行的基本原理

1、指令的工作原理

CPU 遵循 “取指 → 译码 → 执行 → 写回” 的指令周期工作(冯 ・ 诺依曼体系):

  • 取指:从内存读取指令(如 “加法指令”)到 CPU 指令寄存器;
  • 译码:解析指令含义,确定操作对象(如寄存器、内存地址);
  • 执行:运算单元(ALU)处理数据(从寄存器或内存取数);
  • 写回:将结果写回寄存器或内存。

举例:执行 a = b + c 时,需从内存取 b、c 的值,运算后将 a 写回内存,全程依赖内存的读写。

2、逻辑地址 vs 物理地址

维度逻辑地址(虚拟地址)物理地址
定义程序编译 / 链接后,虚拟地址空间内的地址(进程视角)内存硬件实际的存储单元地址(硬件视角)
特点每个进程独立,互不干扰(如进程 A 和 B 的 0x100 是不同位置)全局唯一,标识硬件物理位置(如 0x12345678)
核心作用隔离多进程、支撑虚拟内存定位实际内存单元

从写程序到程序运行

完整流程:编写 → 编译 → 链接 → 加载 → 运行

三种链接方式:

  • 静态链接(在程序运行前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件)
  • 装入时动态链接(将各目标模块装入内存时,边装入边链接的链接方式)
  • 运行时动态链接(在程序执行中需要该模块时,才对它进行链接,其优点时便于修改和更新。)

三种装入方式:

  • 绝对装入(在编译的时候就知道程序放在内存的哪个位置)
  • 静态重定位(装入时将逻辑地址转表为物理地址)
  • 动态重定位(把地址转化推迟到程序真正要执行时才进行)

image-20250807170230813

操作系统:

  • 内存空间的分配与回收
  • 内存空间的扩充
  • 内存的虚拟性
  • 地址转换,逻辑地址和物理地址转换

存储保护

设置上下限寄存器

进程访问地址时,硬件检查是否在 [下限, 上限] 范围内,超出则报错(类似小区门禁卡限制只能进指定楼栋)。

采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)

  • 基址寄存器(重定位寄存器):记录进程逻辑地址转换的“起始偏移量”(如物理地址 = 逻辑地址+基址)。
  • 界地址寄存器(限长寄存器):记录进程逻辑地址的最大值(防止越界)。

进程访问逻辑地址时:

  • 计算物理地址 = 逻辑地址 + 基址寄存器值。
  • 检查逻辑地址是否 ≤ 界地址寄存器值(防止逻辑地址越界)。

进程的内存映像

image-20250811091414649

覆盖与交换(408 不考)

内存空间的扩充

覆盖技术:将程序分为多个段,内存分为”固定区“和”覆盖区“,需要常驻的放在”固定区“,调入后就不再调出,不常用的段放在”覆盖区“,需要用到时调入内存,用不到时掉出内存

交换技术:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(PCB 会常驻内存,不会被患处)

3.1.2 连续分配管理方式

连续分配方式

单一连续分配

内存被分配为系统区和用户区,系统区在低地址,用户区是一个用户独享

image-20250811095023386

有内部碎片,没有外部碎片。

固定分区分配

将用户区分割为若干固定分区给各道程序,分割策略有分区大小相等和分区大小不相等,可以建议一个分区说明表来管理各个分区

image-20250811095118497

分区说明表,分区的相关信息

image-20250811095321645

有内部碎片,无外部碎片。

动态分区分配

可变分区分配,不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。

空闲分区表和空闲分区链

image-20250811095530522

碎片

内部碎片:分配给某进程的内存区域中,如果有些部分没有用上

外部碎片:是指内存中的某些空闲分区由于太小而难以利用(如果有外部碎片,可以采用紧凑技术)

image-20250811094937023

1、首次适应算法(First Fit)

算法思想:每次从低地址开始查找,找到第一个能满足大小的空闲分区

会出现很多小碎片

2、最佳适应算法(Best Fit)

算法思想:为了保证“大进程”到来时能有连续的大片区域,可以尽可能留下大片的空闲区,优先使用更小的空闲区。

空闲分区按容量递增次序链接,分配内存时顺序查找空闲分区链

缺点:会留下小碎片,性能很差

3、最坏适应算法(Worst Fit)

算法思想:和最佳适应算法相反,按容量递减次序排列,每次尽可能用大的分区

4、领近适应算法(Next Fit)

算法思想:每次从上次查找结束的位置开始检索

缺点:大空间容易被用完

总得来说,“首次适应算法”综合效果最好。

以下是整理后的表格:

算法算法思想分区排列顺序优点缺点
首次适应从头到尾找适合的分区空闲分区以地址递增次序排列综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序
最佳适应优先使用更小的分区,以保留更多大分区空闲分区以容量递增次序排列会有更多的大分区被保留下来,更能满足大进程需求会产生很多太小的、难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序
最坏适应优先使用更大的分区,以防止产生太小的不可用的碎片空闲分区以容量递减次序排列可以减少难以利用的小碎片大分区容易被用完,不利于大进程;算法开销大(原因同上)
邻近适应由首次适应演进而来,每次从上次查找结束位置开始查找空闲分区以地址递增次序排列(可排列成循环链表)不用每次都从低地址的小分区开始检索。算法开销小(原因同首次适应算法)会使高地址的大分区也被用完

3.1.3 基本分页存储管理

允许一个进程分散地装入道许多不相邻的位置

连续分配:为用户进程分配连续的内存空间

非连续分配:为用户进程分配分散的内存空间

将内存分为大小相等的小分区“页框”(page frame),将用户的进程空间也分为大小相等的一个个区域-页面(page),页面和页框有一一对应的关系

页表:存放页号和块号的对应关系

image-20250811110626791

这里的这个计算题,算的是页表项的相关信息。

页表项:

页号块号
20 位12 位

image-20250811110816394

那么对于页表项,页表项并不需要存储,只存储块号,因此由于页框的块号长度要和页面的块号保持一致,故也为 3B,则整个页面的大小为 $3(n+1)$ B

NOTE

注意:页表记录的只是内存块号,而不是内存块的起始地址! J 号内存块的起始地址 = $j\times 内存块大小$

地址转换

分页管理:物理地址 = 页面的起始位置+偏移量

image-20250811111938042

image-20250811112118736

image-20250811112540180

image-20250811113528947

image-20250811113655936

image-20250811113822913

image-20250811105703946

基本地址变换机构

页表寄存器(PTR),存放页表在内存中的起始地址 F 和页表长度 M,进程未执行时,页表的起始地址和页表的长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放在页表寄存器中。

image-20250812092423929

image-20250812092549999

image-20250812092638579

image-20250812092800193

image-20250812092326386

快表

局部性原理

时间局部性:访问某个变量后,在不久的将来还会被访问

空间局部性:程序访问了某个存储单元,不久之后,其附近的存储单元也很有可能被访问

什么是快表(TLB)

快表:又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。

引入快表后,地址的变换过程

image-20250812095525263

image-20250812095547063

🌰:先查快表再查慢表,快表慢表同时查

image-20250812095317504

两级页表

单级页表存在什么问题?如何解决?

image-20250812100853013

所有页表项必须连续存放,页表过大时需要很大的连续空间

在一段时间内并非所有页面都用得到,因此没必要让整个页表常驻内存

二级页表

内存地址为 32 位,页表项大小为 4B,页面大小为 4KB,则页内地址为 12 位。

image-20250812102338659

将长长的页表再分页,每个页面可以存放 $2^{10}=1024$ 个页表项($\frac{4KB}{4B}=2^{10}$)

逻辑地址结构:

一级页号二级页号页面偏移量
10 位10 位12 位

页目录表、外层页表、顶级页表

如何实现地址变换

按照地址结构将逻辑地址拆分成三部分

从 PCB 中读出页目录表始址,根据一级页号查页目录表,找到下一级页表在内存中的存放位置

根据二级页号查表,找到最终想访问的内存块号

结合页内偏移量得到物理地址

image-20250812103717610

两级页表问题需要注意的几个细节

多级页表中,各级页表的大小不能超过一个页面。若两级页表不够,可以分更多级

多级页表的访问次数(假设没有快表结构)——N 级页表访问一个逻辑地址需要 N+1 次访存

image-20250812104002903

image-20250812101859657

3.1.4 基本分段存储管理

分段

按「逻辑功能」自然划分区域(比如衣服放衣柜、书本放书架、零食放抽屉),每个区域大小不一,但功能明确(类似按使用场景分类,每个区域独立且完整)。其中段内是连续的,段间是不连续的。

每段有段名,每段从 0 开始编址,段号的位数决定了每个进程最多可以分几个段,段内地址位数决定了每个段的最大长度是多少

image-20250812110429045

使用分段,用户编程更方便,程序的可读性更高

段表

段表:段映射表

每个程序被分段后,用段表记录该程序在内存中存放的位置

段号段长基址
隐含与段内地址位数相同与内存位数相同

image-20250812110811408

地址变换

image-20250812111132881

分段、分页管理的对比

image-20250812111330603

分段比分页更容易实现信息的共享和保护。

共享访问

image-20250812112208242

二者访问次数的比较

image-20250812112343800

image-20250812112422110

3.1.5 段页管理

分页、分段管理方式最大的优缺点

优点缺点
分页内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片不方便按照逻辑模块实现信息的共享和保护
分段很方便按照逻辑模块实现信息的共享和保护如果段长过大,为其分配很大的连续空间会很不方便。另外,段式管理会产生外部碎片

段页式管理方式

先分段再分页

image-20250812113441397

段号+页号+页内偏移量

image-20250812113628216

段页式管理的逻辑地址结构是二维的

TIP

实际编程的时候,给的依然是段号和段内地址,只不过计算机系统会自动的把段内地址再拆分为页号+页内偏移量

段表、页表

image-20250812114104256

TIP

这里的页表长度可以理解为页表项的数目,即这个段,会对应几个页表

地址变换

image-20250812114845099

上面的页表存放块号,改成页表起始地址会比较容易理解。

image-20250812115157543

3.2 虚拟内存

3.2.1 虚拟存储

传统存储管理方式的特征与缺点

一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:① 作业很大时,不能全部装入内存,导致大作业无法运行;② 当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。

驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。

局部性原理

  1. 时间局部性: 近期被访问的数据 / 指令,短期内会重复访问(如循环变量、高频函数调用)。
  2. 空间局部性: 相邻地址的数据 / 指令,会连续访问(如数组遍历、指令序列的顺序执行)。

虚拟内存

操作系统通过 硬件支持(MMU)+ 软件管理(页表 / 段表),将 磁盘作为内存的逻辑扩展,为程序提供 “逻辑连续、容量远超物理内存” 的虚拟地址空间,通过 换入 / 换出(Swap) 动态管理内存与磁盘的数据交换。

核心特征

  1. 多次性:程序无需一次性全部装入内存,可分阶段调入(运行时按需加载,如首次访问某页时加载)。
  2. 对换性:内存中暂时不用的数据,可换出到磁盘;需要时再换入内存。
  3. 虚拟性:程序看到的虚拟地址空间远大于实际物理内存(突破硬件容量限制,如 32 位系统虚拟地址空间可达 4GB)。

虚拟内存的实现技术

虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在 离散分配 的内存管理方式基础上。

NOTE

这里的离散分配方式就是指前面学的那三种不连续的内存非配方式:

分页,分段,段页

  1. 请求分页
  2. 请求分段
  3. 请求段页式

主要区别:

  1. 请求调页:在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
  2. 页面置换:若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。

3.2.2 请求分页

请求分页存储管理与基本分页存储管理的主要区别:

  • 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
  • 若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。

页表机制

页号物理块号状态位 P访问字段 A修改位 M外存地址

解释说明:

  1. 状态位(存在位):
    • 标识页面是否在内存中(1:在内存;0:不在内存,需调页)。
    • 若状态位为 0,访问该页面时触发缺页中断。
  2. 访问字段(引用位):
    • 记录页面最近是否被访问,用于页面置换算法(如 LRU、FIFO)。
    • 系统定期清零,通过统计访问频率判断页面活跃度。
  3. 修改位(脏位):
    • 标识页面在内存中是否被修改过(1:已修改;0:未修改)。
    • 若页面需调出内存且修改位为 1,需先写回外存(交换区),否则直接丢弃。
  4. 外存地址:
    • 记录页面所在外存(如磁盘)的物理地址,用于缺页时调页操作。

缺页中断机制

TIP

这里的缺页中断是指令执行过程中发生的问题,属于“内部中断”中的“故障”

缺页中断处理流程

  1. 保存现场:记录当前 CPU 状态(寄存器值、程序计数器 PC 等)。
  2. 查页表判断:根据逻辑页号查询页表,确认是否缺页(状态位 = 0)。
  3. 分配物理块:若内存有空闲块,直接分配;若无,通过页面置换算法(如 LRU)选择淘汰页面。
  4. 调页操作:
    • 若淘汰页面修改位 = 1,先将页面写回外存(同步外存)。
    • 将待调入页面从外存读入分配的物理块。
  5. 更新页表:将对应页号的状态位设为 1,记录物理块地址。
  6. 恢复现场:还原 CPU 状态,重新执行触发缺页的指令(此时页面已在内存,可正常访问)。

地址变换机构

建议看书上的图,讲的很详细。

image-20250814094247711

NOTE

换入/换出页面都需要启动慢速的 I/O 操作,可见,如果换入/换出太频繁,会有很大的开销。 页面调入内存后,需要修改慢表,同时也需要将表项复制到快表中。

image-20250814094406435

3.2.3 页面置换算法

TIP

发生页面中断,不一定会发生页面置换

最佳置换算法(Optimal, OPT)

  • 核心思想:每次选择未来最长时间内不会被访问的页面进行置换(理论最优解)。
  • 工作原理:基于“未来访问序列”的预知能力,淘汰最远将来才需要的页面。
  • 优点:缺页率最低,是理论上的性能标杆。
  • 缺点:无法实际实现(需预知未来页面访问顺序,现实中不可行)。

image-20250814101632871

先进先出置换算法(First-In-First-Out, FIFO)

  • 核心思想:淘汰最先进入内存的页面(基于页面驻留时间)。
  • 工作原理:维护一个队列,新页面加入队尾,置换时移除队首页面。
  • 优点:实现简单,开销小。
  • 缺点:性能较差,可能引发 Belady 异常(增加物理块数反而导致缺页率上升,违背直觉)。

image-20250814102057743

最近最久未使用置换算法(Least Recently Used, LRU)

  • 核心思想:淘汰最长时间未被访问的页面(基于页面历史访问时间)。
  • 工作原理:为每个页面维护一个“最近使用时间戳”,置换时选择时间戳最早的页面,通常使用“访问字段”来实现。
  • 优点:性能接近理论最优(OPT),符合“局部性原理”(近期未使用的页面未来使用概率低)。
  • 缺点:实现复杂,并且硬件开销大。

image-20250814102501828

时钟置换算法(Clock, CLOCK)

  • 核心思想:CLOCK 是 LRU 的近似算法,通过“引用位”(访问标志位)简化 LRU 的实现。
  • 工作原理:
    1. 装入内存时或被访问的时候,设置“访问字段”为 1。
    2. 置换时,从当前位置开始扫描页面:
      • 若访问字段为 1,置为 0 并跳过(保留该页面);
      • 若引用位为 0,置换该页面。
    3. 扫描一轮后,若所有页面引用位均为 1,则重新置为 0 并再次扫描(等效于 FIFO 的变种)(最多会经过两轮,就会淘汰一个页面)。
  • 优点:实现简单,开销低,是 LRU 的实用替代方案。
  • 缺点:仅考虑“是否访问过”。

image-20250814102957712

改进型的时钟置换算法(改进型 CLOCK)

  • 核心思想:在 CLOCK 基础上引入“修改位”(表示页面是否被修改过),进一步减少磁盘 I/O 开销(避免置换已修改页面时的写盘操作)。
  • 工作原理:
    1. 每个页面设置“访问位”(R)和“修改位”(M),组合状态为 (R, M):
      • (0,0):最近未访问且未修改(最佳置换目标);
      • (0,1):最近未访问但已修改(次选,需先写回磁盘);
      • (1,0):最近访问过但未修改(再次访问时优先保留);
      • (1,1):最近访问过且已修改(最后选择,需先写回磁盘)。
    2. 置换过程:
      • 第一轮扫描:寻找 (0,0)状态的页面,若找到则置换;
      • 若未找到,进入第二轮扫描,寻找 (0,1)状态的页面,置换前先将页面写回磁盘;
      • 若未找到,第三轮,则将所有的页面 R 设置为 0,再找(0,0)的页面。
      • 若未找到,第四轮,寻找 (0,1)状态的页面
      • 淘汰一个页面,最多会进行 4 轮扫描。
  • 优点:兼顾访问频率和修改状态,显著减少磁盘写操作开销。

image-20250814105732100

3.2.4 页面分配策略

驻留集

定义:

进程在执行过程中,当前实际驻留在内存中的页面集合,其大小(物理块数量)直接影响进程的执行效率和系统内存利用率。驻留集大小一般小于进程的总大小。

影响:

  • 若驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,实际用于进程推进的时间很少;
  • 驻留集太大,又会导致多道程序并发度下降,资源利用率降低。所以应该选择一个合适的驻留集大小。

页面分配与置换策略

根据“物理块分配方式”和“置换范围”,分为三类:

固定分配局部置换

  • 分配方式:

    进程启动时一次性分配固定数量的物理块,运行期间不再增减(静态分配)。

  • 置换规则:

    缺页时仅从该进程自身的驻留集中选择页面置换(局部置换)。

  • 特点:

    • 实现简单,适合内存需求稳定的进程。
    • 若分配块数不足,进程易因缺页率过高而性能下降。

可变分配全局置换

  • 分配方式:

    初始分配基本物理块,运行期间可根据需求动态增减(动态分配)物理块。

  • 置换规则:

    缺页时可从所有进程的驻留集中选择页面置换(全局置换)。

  • 特点:

    • 灵活性高,系统可根据全局内存压力调整资源。
    • 可能导致低优先级进程被过度置换,影响公平性。

可变分配局部置换

  • 分配方式:

    初始分配基本物理块,运行期间可动态增加分配(如进程缺页率过高时追加块)。

  • 置换规则:

    仅从自身驻留集内置换(局部置换),但块数可调整。

  • 特点:

    • 结合了灵活性与局部性,是实际系统中常用的策略

TIP

如何区分下面两种

可变分配全局置换:只要缺页就给分配新物理块 可变分配局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块

调入页面的时机

预调页(Pre-paging):

根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更高效。但如果提前调入的页面中大多数都没被访问过,则又是低效的。因此可以预测不久之后可能访问到的页面,将它们预先调入内存,但目前预测成功率只有 50%左右。故这种策略主要用于 进程的首次调入,由程序员指出应该先调入哪些部分。(运行前调入)

请求调页(Demand Paging):

进程在运行期间发现缺页时才将所缺页面调入内存。由这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘 I/O 操作,因此 I/O 开销较大。(运行时调入)

从何处调页

image-20250814113822944

1、系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区。

image-20250814114007612

2、系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。

image-20250814113947958

3、UNIX 方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入。

image-20250814114044122

抖动(考纲已删,看看就好)

image-20250814114149105

image-20250814114314557

image-20250814114456028

3.2.5 内存映射文件

内存映射文件(Memory-Mapped File,MMF) 是一种将磁盘上的文件内容直接映射到进程的虚拟地址空间的技术。通过这种映射,进程可以像访问内存一样直接读写文件数据,无需通过传统的文件 I/O 系统调用(如 read()/write())。

在映射进程的页面时,并不会实际读入文件内容,而是在访问页面的时才被每次一页的读入。当进程退出或者关闭文件映射的时候,所有被改动的页面才会写回磁盘文件。

进程通过“共享内存”进行通讯的时候,共享内存是通过映射相同的文件到通信进程的虚拟地址空间来实现的。

image-20250814121514503

第四章 文件管理

4.1 文件系统基础

4.1.1 初识文件管理

文件属性,即文件的一些常见属性:

  1. 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件
  2. 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
  3. 类型:指明文件的类型
  4. 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
  5. 文件大小:指明文件大小
  6. 创建时间、上次修改时间文件
  7. 所有者信息
  8. 保护信息:对文件进行保护的访问控制信息

文件内部数据组织

文件分为有结构文件和无结构文件

image-20250816113103084

文件之间采用树状连接起来

image-20250816113226931

操作系统要提供的功能

关于文件操作的:

  • 创建文件(create 系统调用)
  • 删除文件(delete 系统调用)
  • 读文件(read 系统调用)
  • 写文件(write 系统调用)
  • 打开文件(open 系统调用)(读/写文件前需“打开文件”)
  • 关闭文件(close 系统调用)(读/写文件结束后需“关闭文件”)

NOTE

复杂操作通过基础功能组合完成,如“复制文件”:

  • 创建一个新的空文件
  • 将源文件读入内存
  • 将内存中的数据写到新文件中

image-20250816113958033

4.1.2 文件逻辑结构

按文件是否有结构分类,可以分为无结构文件、有结构文件两种。

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如: Windows 操作系统中的.txt 文件。

有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如: 数据库表文件。一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度(占用的存储空间)是否相等,又可分为 定长记录可变长记录 两种。

image-20250816120717395

image-20250816120719531

一、顺序文件

文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储。

image-20250816121104053

主要分为两种结构,串结构和顺序结构

image-20250816121156461

能否实现随机存储,能否实现快速查找某关键字对应的记录(考的概率不大)

image-20250816121526740

二、索引文件:“给数据建目录”

  1. 结构设计

    • 核心逻辑:为文件建一张 索引表,每个记录对应一个索引项(存 关键字 和 物理位置);

    • 数据记录:可乱序存储(无需按关键字排序,像图书内容可以乱序,目录帮你找位置)。

  2. 存取特性(核心考点解析)

    • ✔️ 索引表本身是 “定长记录的顺序文件”: 每个索引项占固定字节(如关键字 4 字节 + 位置 4 字节),因此索引表支持 随机存取(通过 索引项位置 = 索引表起始 + k× 固定长度 计算)。

    • ✔️ 若索引表按关键字排序: 可对索引表做 二分查找(如目录按章节名排序),快速定位索引项,再通过物理位置找到数据记录,实现 快速检索。

  3. 优缺点

  • 优点:
    • 解决顺序文件 “增删难” 的问题(增删记录只需改索引表,数据可存在任意位置);
    • 让 可变长记录也能随机存取(通过索引表定位,无需关心记录长度);
  • 缺点: 索引表占额外空间(小文件可能 “索引比数据还大”,比如给 1 页笔记建 10 页目录)。

image-20250816123155480

三、索引顺序文件:

索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。

NOTE

如果给每个记录都建立索引的话,就会导致索引文件过大。

组内可以无序,组间必须有序

索引顺序文件的索引项也不需要按关键字顺序排列,这样可以极大地方便新表项的插入。

image-20250816123943960

检索流程:

  1. 先通过主索引表找到目标记录所在的组(类似先查“省份索引”,再查“城市索引”)。
  2. 在组内顺序查找具体记录(组内数据量小,顺序查找效率高)。

image-20250816124132563

为了进一步提高检索效率,可以为顺序文件建立多级索引表。

image-20250816124153180

TIP

要为 $N$ 个记录的文件建立 $K$ 级索引,则最优的分组是每组

$$ N^{\frac{1}{K+1}} $$

个记录。

检索一个记录的平均查找次数是

$$ \left(\frac{N^{\frac{1}{K+1}}}{2}\right) \times (K+1) $$

image-20250816124333563

关键逻辑提炼

  1. 随机存取的本质:能否快速计算记录的物理位置(定长记录靠公式,索引表靠定长项)。
  2. 快速检索的前提:关键字有序 + 结构支持(二分查找、分组查找的基础)。
  3. 设计权衡:
    • 顺序文件:牺牲 “增删灵活” 换 “顺序存取速度”;
    • 索引文件:牺牲 “空间” 换 “增删和随机存取灵活”;
    • 索引顺序文件:在 “速度、灵活、空间” 间找平衡(分组降低索引规模,保留一定顺序性)。

4.1.3 文件目录

一、文件目录的基本概念

  • 用户视角的优势:
    1. 文件组织结构清晰,易于查找;
    2. 可通过文件路径实现 “按名存取”,例如程序中使用 fopen("F:\data\myfile.dat") 访问文件。
  • 操作系统视角:文件目录是文件控制块(FCB)的有序集合,用于管理文件的组织与查找。

二、文件控制块(FCB)

  • 定义:FCB 是实现文件目录的关键数据结构,每个 FCB 对应一个目录项,多个 FCB 组成文件目录。

  • 核心作用:实现文件名与文件的映射,支持 “按名存取”。

  • 包含信息:

    • 基本信息:文件名、类型(文件 / 目录)、物理位置(外存块号)等;
    • 存取控制信息:只读、读写等权限;
    • 使用信息:创建时间、修改时间等。
  • 示例:D 盘根目录的目录文件中,“照片” 目录的 FCB 包含 “文件名 = 照片、类型 = 目录、权限 = 读写、物理位置 = 643 号块”,双击 “照片” 时,系统通过 FCB 找到 643 号块并读入内存显示内容。

  • 文件名类型权限物理位置
    照片目录读写643 号块
  • 目录操作:搜索(按文件名找目录项)、创建文件(新增目录项)、删除文件(删除目录项)、显示目录(展示文件及属性)、修改目录(如重命名)。

NOTE

目录本身就是一种有结构文件,由一条条记录组成。每条记录对应一个在该放在该目录下的文件

image-20250817180627366

三、目录结构

1、单级目录结构

  • 特点:整个系统仅一张目录表,每个文件占一个目录项。
  • 优势:实现 “按名存取”。
  • 缺陷:不允许文件重名,不适用于多用户操作系统。

image-20250817180849835

2、两级目录结构

  • 组成:主文件目录(MFD)+ 用户文件目录(UFD)。
    • MFD:记录用户名及对应 UFD 的存放位置;
    • UFD:包含该用户所有文件的 FCB。
  • 优势:允许不同用户文件重名,可实现访问限制(验证登录用户名)。
  • 缺陷:缺乏灵活性,用户无法对自己的文件分类。

image-20250817180955393

3、多级目录结构(树形目录结构)(主流 OS 里面的目录结构)

  • 特点:以根目录为起点,层次分明,支持文件分类,不同目录下文件可重名。
  • 文件访问方式:
    • 绝对路径:从根目录出发,如 “/ 照片 / 2015-08 / 自拍.jpg”,需逐层从外存读入目录表(如示例中需 3 次磁盘 I/O);
    • 相对路径:从 “当前目录”(已调入内存的目录)出发,如当前目录为 “照片” 时,路径为 “./2015-08 / 自拍.jpg”,减少磁盘 I/O 次数。
  • 优势:层次清晰,便于管理、分类和保护文件。
  • 缺陷:不便于实现文件共享。

image-20250817181313783

4、无环图目录结构

  • 基础:在树形目录结构上增加指向同一节点的有向边,形成有向无环图。
  • 核心:支持多用户文件共享,可共享文件或目录。
  • 共享管理:为共享节点设置 “共享计数器”,记录共享次数:
    • 删除请求时,仅删除用户的 FCB 并使计数器减 1;
    • 计数器为 0 时,才真正删除节点。
  • 注意:共享 ≠ 复制,任一用户修改文件,所有用户可见变化。

image-20250817181530395

四、索引节点(FCB 的优化)

  • 优化思路:将 FCB 中除文件名外的信息(类型、权限、物理位置等)剥离到 “索引节点”,目录项仅保留 “文件名 + 索引节点指针”。
  • 优势:大幅减小目录项长度,使每个磁盘块可存放更多目录项,减少检索时的磁盘 I/O 次数。
    • 示例:FCB 为 64B 时,1KB 磁盘块仅存 16 个 FCB;使用索引节点后,目录项(14B 文件名 + 2B 指针)可存 64 个 / 块。
  • 分类:
    • 磁盘索引节点:存于外存,包含文件描述信息;
    • 内存索引节点:调入内存后增加额外信息(如文件是否被修改、访问进程数等)。

image-20250817192801916

五、知识点总结

核心内容关键要点
文件目录由 FCB 组成,实现文件的组织与按名存取
FCB包含文件名、物理位置等信息,是目录项的核心
目录结构单级(无重名)→ 两级(多用户重名)→ 多级(树形,路径访问)→ 无环图(共享)
索引节点优化 FCB,减少目录项长度,提升检索效率
路径与 I/O 优化绝对路径(全路径)、相对路径(当前目录出发),减少磁盘 I/O 次数

image-20250817192818420

4.1.4 文件的物理结构

“文件的物理结构/文件分配方式”要探讨的问题--文件的数据应该如何存放到外存当中。

磁盘块:

类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同。

内存与磁盘之间的数据交换(即读/写操作、磁盘 I/o)都是以“块”为单位进行的。即每次读入一块,或每次写出一块。

image-20250817225122705

一、文件的物理结构(文件分配方式)

文件的物理结构指文件数据在外存中的存储方式,主要包括连续分配、链接分配和索引分配三种类型。

1、连续分配

  • 定义:要求每个文件在磁盘上占有一组连续的块。
  • 目录项内容:记录文件的起始块号和长度(总块数)。
  • 地址映射:物理块号 = 起始块号 + 逻辑块号(逻辑块号 ≥ 长度就不合法)。
  • 优缺点:
    • 优点:支持顺序访问和随机访问,顺序访问速度最快。
    • 缺点:不方便文件拓展,易产生磁盘碎片(外部碎片),存储空间利用率低(紧凑处理碎片代价大)。

image-20250817225909019

2、链接分配

采用离散分配方式,分为隐式链接和显式链接两种。

(1)隐式链接

  • 结构:除最后一个磁盘块外,每个块存放下一个块的指针;
  • 目录项记录起始块号和结束块号。
  • 地址映射:需从起始块开始依次查找目标逻辑块,读入 i 号逻辑块需 i+1 次磁盘 I/O(i 从 0 开始)。
  • 优缺点:
    • 优点:方便文件拓展,无碎片问题,外存利用率高。
    • 缺点:仅支持顺序访问,不支持随机访问,查找效率低,稳定性差,指针占用少量存储空间。

image-20250817230321643

NOTE

考试题目中遇到未指明隐式/显式的“链接分配”,默认指的是隐式链接的链接分配

(2)显式链接

  • 结构:通过文件分配表(FAT)记录块的链接关系,FAT 常驻内存;
  • 目录项仅需记录起始块号。
  • 地址映射:可直接通过内存中的 FAT 查找逻辑块对应的物理块,支持随机访问。
  • 优缺点:
    • 优点:继承隐式链接的优点,且支持随机访问,效率高,且减少了访问磁盘的次数。
    • 缺点:FAT 需占用一定存储空间。

image-20250817230529608

TIP

采用显式链接方式的文件,逻辑块号转换成物理块号的过程不需要读磁盘操作,支持顺序访问,也支持随机访问(想访问 i 号逻辑块时,不需要依次访问之前的 0~i-1 号逻辑块)。

同时,不同的数字有不同的意义(约定),如“-1”表示文件的最后一块,“-2”表示空闲块,因此 OS 可以通过 FAT 对磁盘的空闲空间进行管理。

3、索引分配

结构:为每个文件建立索引表(记录逻辑块与物理块的映射),索引表存放于索引块,数据存放于数据块。

目录项内容:记录索引块的磁盘块号。

image-20250817231555565

地址映射:读入索引表后直接查找目标逻辑块对应的物理块。

优缺点:

  • 优点:支持随机访问,便于文件拓展。
  • 缺点:索引表占用存储空间,访问数据块前需读入索引块。

大文件处理方案:

链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。

各个索引块在磁盘中离散分布,并且直接采用隐式链接,类似链表

NOTE

查找效率低

image-20250817232112006

多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。(与多级页表类似)

image-20250817232543269

混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。(这里建议看书,感觉书上的更加易懂一些)

image-20250817232835671

NOTE

这种索引支持的最大文件长度:

$(直接地址块数 + 一级间接块数 + 二级间接块数) \times 块大小$

image-20250817233214054

image-20250817233232280

二、常见计算

1、计算文件最大长度

  • 连续分配:受限于连续空闲块数量。
  • 链接分配:受限于磁盘总块数。
  • 索引分配:
    • 单层索引:最大长度 = 索引表项数 × 块大小。
    • 二级索引:最大长度 = $256×256×1KB$。
    • 混合索引:最大长度 = 直接地址块数 + 一级间接块数 + 二级间接块数。

2、读取数据块的 I/O 次数

  • 连续分配:1 次(直接计算物理块号)。
  • 隐式链接:i+1 次(需顺序访问 0~i 号块)。
  • 显式链接:1 次(FAT 在内存中)。
  • 索引分配:
    • 单层索引:2 次(读索引块 + 读数据块)。
    • 二级索引:3 次(读顶级索引 + 二级索引 + 数据块)。
    • 混合索引:根据地址类型决定(直接地址:1 次;一级间接:2 次;二级间接:3 次)。

4.1.5 物理结构和逻辑结构

逻辑结构,文件内部信息,如何映射逻辑地址

物理结构,物理存储方式,逻辑地址转化为物理地址

换句话来说,可以用数据结构来理解二者之间的关系,逻辑结构:顺序表,队列。物理结构:顺序表,队列如何实现,是采用数组还是链表的方式。

维度逻辑结构物理结构
视角用户(文件创建者)操作系统
核心关注文件内部记录的逻辑组织文件在磁盘上的实际存储方式
决定者用户操作系统
地址转换不涉及,用户仅关注逻辑地址负责将逻辑块号转换为物理块号
典型示例顺序文件的记录排列、索引项映射连续 / 链接 / 索引分配的块映射

1、顺序文件 ≠ 连续分配 顺序文件是逻辑结构,内部记录可以顺序存储(连续分配),也可以链式存储(链接分配)。

“链式存储的顺序文件”仍叫顺序文件,只是逻辑记录之间用指针串联,物理块可能离散。

连续分配的顺序存储的文件

image-20250818101438492

链接分配的顺序存储的文件

image-20250818101645845

索引分配的顺序存储文件

image-20250818101717006

image-20250818101839638

image-20250818101949104

image-20250818102020446

image-20250818103113591

image-20250818103130521

2、索引文件 ≠ 索引分配 索引文件:用户自己建的索引表(关键字 → 记录逻辑地址)。

索引分配:OS 建的索引表(逻辑块号 → 物理块号)。

二者层次不同,可同时存在。

image-20250818103151925

4.1.6 文件存储空间管理

一、存储空间的划分与初始化

划分:将物理磁盘划分为多个文件卷(逻辑卷,如 C 盘、D 盘),支持多个物理磁盘组成一个文件卷。

初始化:每个文件卷进一步划分为目录区和文件区

  • 目录区:存放文件目录信息(FCB)及用于磁盘存储空间管理的信息(如空闲表、位示图、超级块等)。
  • 文件区:用于存放文件数据。

image-20250818155958133

三、空闲空间管理方法

1、空闲表法

适用场景:连续分配方式。

记录方式:通过空闲盘块表记录每个连续空闲区的起始盘块号和空闲盘块数。

分配过程:类似内存动态分区分配,采用首次适应、最佳适应、最坏适应等算法选择合适的连续空闲区。

回收过程:需处理四种情况(回收区前后无 / 有空闲区),重点是相邻空闲区的合并,避免碎片。

image-20250818160027313

2、空闲链表法,主要分为空闲盘快链,空闲盘区链

image-20250818160125091

空闲盘块链:以单个盘块为单位组成链表,每个空闲盘块存储下一个空闲盘块的指针。

  • 分配:从链头依次摘下所需数量的盘块,修改链头指针。
  • 回收:将回收盘块挂到链尾,修改链尾指针。
  • 适用:离散分配。

image-20250818160149541

空闲盘区链:以连续的空闲盘区为单位组成链表,每个盘区的第一个盘块记录区长度和下一个盘区指针。

分配:若某文件申请 K 个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。

回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。

适用:连续分配和离散分配,分配多块时效率更高。

image-20250818160214133

3、位示图法

记录方式:用二进制位表示盘块状态,1 位对应 1 个盘块(如 “0” 表示空闲,“1” 表示已分配),位示图由连续 “字” 组成。

盘块号与(字号、位号)转换(字长为 n,从 0 开始计数)

$$ 盘块号 b = 字号 i \times n + 位号 j \ 字号 i = \frac{b}{i};位号 j = b % n $$

分配过程:若文件需要 K 个块,① 顺序扫描位示图,找到 K 个相邻或不相邻的“0”;② 根据字号、位号算出对应的盘块号,将相应盘块分配给文件;③ 将相应位设置为“1”

回收过程:根据回收盘块号计算字号和位号,将对应位改为 “0”。

适用:连续分配和离散分配。

重要考点:注意盘块号、字号、位号的起始计数方式(0 或 1)及 0/1 代表的状态。

NOTE

如初始值为 1

$$ b = n(i-1)+j \ i =(b-1)/n+1\ j =(b-1)%n+1 $$

image-20250818160843912

4、成组链接法(这里王道讲的不清楚,建议去听天勤的)

【【配资料】天勤计算机考研 408 之操作系统(全视频合集版)】https://www.bilibili.com/video/BV1qG4y187Jp?p=25&vd_source=df5dd54419af95e5585b85f42092537d

适用场景:大型文件系统(如 UNIX 系统),解决空闲表 / 链表过大的问题。

核心机制:将空闲块分组管理,文件卷目录区的 “超级块” 记录当前组的空闲块数和下一组信息,系统启动时超级块读入内存并保持一致性。

image-20250818161321751

image-20250818161341983

这里的 n 即为下一组的空闲块数量,[0] 指向下下一组的空闲块信息,其余的则指向下一组的空闲块信息

image-20250818161450128

分配过程

  • 检查当前组空闲块数是否满足需求。
  • 若满足,直接分配并修改计数;若分配后当前组为空,需将下一组信息复制到超级块。

回收过程

  • 若当前组未满(如小于 100 块),直接加入当前组。
  • 若当前组已满,将超级块信息复制到新回收块,新块作为新的当前组。

image-20250818161253683

4.1.7 文件的操作

一、知识总览

文件系统向上提供的 6 个核心基本操作(通过系统调用实现):

mermaid
graph TD
    A[文件基本操作] --> B[创建文件 create]
    A --> C[删除文件 delete]
    A --> D[打开文件 open]
    A --> E[关闭文件 close]
    A --> F[读文件 read]
    A --> G[写文件 write]

二、详细操作说明

1、创建文件(create 系统调用)

触发场景:图形化界面中 “新建” 文件(如新建文本文档),背后调用 create 系统调用。

主要参数:

  1. 所需外存空间大小(如 1KB,即一个盘块);
  2. 文件存放路径(如 “D:/Demo”);
  3. 文件名(如默认 “新建文本文档.txt”)。

操作系统处理流程:

  1. 在外存中分配文件所需空间(基于空闲链表法、位示图、成组链接法等空闲空间管理策略);
  2. 根据路径找到对应目录文件(如 “D:/Demo” 目录),在目录中创建该文件的目录项(包含文件名、外存存放位置等信息)。

image-20250819140616891

2、删除文件(delete 系统调用)

触发场景:图形化界面中 “删除” 文件(如右键删除),背后调用 delete 系统调用。

主要参数:

  1. 文件存放路径(如 “D:/Demo”);
  2. 文件名(如 “test.txt”)。

操作系统处理流程:

  1. 根据路径找到对应目录文件,从目录中定位该文件的目录项;
  2. 依据目录项记录的外存位置、文件大小等信息,回收文件占用的磁盘块(根据空闲管理策略进行相应处理);
  3. 从目录表中删除该文件的目录项。

image-20250819140658207

3、打开文件(open 系统调用)

作用:在操作文件前先 “打开”,避免每次操作都查询目录,加快访问速度。

触发场景:双击文件(如记事本打开 “test.txt”),背后调用 open 系统调用。

主要参数:

  1. 文件存放路径(如 “D:/Demo”);
  2. 文件名(如 “test.txt”);
  3. 操作类型(如 “r” 只读、“rw” 读写等)。

操作系统处理流程:

  1. 根据路径找到对应目录文件,定位文件目录项,并检查用户是否有指定操作权限;
  2. 将目录项复制到内存中的 “打开文件表”,返回表项编号(即 “文件描述符”),后续操作通过该编号指明文件。

[! note]

此时并不会把文件内容调入到内存

image-20250819140904906

打开文件表结构:

  • 用户进程的打开文件表(每个进程独有):记录该进程对文件的操作信息,包含编号、文件名、读写指针(记录操作位置)、访问权限(如只读 / 读写)、系统表索引号(关联系统表)。
  • 系统的打开文件表(全系统唯一):记录文件全局信息,包含编号、文件名、外存地址、打开计数器(记录当前打开该文件的进程数)。

image-20250819140934200

4、关闭文件(close 系统调用)

触发场景:进程使用完文件后关闭(如关闭记事本),背后调用 close 系统调用。

操作系统处理流程:

  1. 删除该进程打开文件表中的对应表项;
  2. 回收该文件占用的内存资源;
  3. 系统打开文件表的 “打开计数器” 减 1:若计数器为 0,删除系统表中对应表项(释放文件全局信息)。

image-20250819141015727

5、读文件(read 系统调用)

触发场景:打开文件后查看内容(如记事本显示 “test.txt” 内容),背后调用 read 系统调用。

主要参数:

  1. 文件在打开文件表中的索引号(文件描述符);
  2. 读入数据量(如 1KB);
  3. 内存存放位置(数据读入的目标区域)。

操作系统处理流程:从读指针指向的外存位置,将指定大小的数据读入用户指定的内存区域(读指针会随操作更新位置)。

image-20250819141046420

6、写文件(write 系统调用)

触发场景:编辑文件后保存(如记事本修改内容后 “保存”),背后调用 write 系统调用。

主要参数:

  1. 文件在打开文件表中的索引号(文件描述符);
  2. 写出数据量(如 1KB);
  3. 内存数据位置(待写入外存的数据来源)。

操作系统处理流程:从用户指定的内存区域,将指定大小的数据写入写指针指向的外存位置(写指针会随操作更新位置;若文件打开时声明 “只读”,则禁止写操作)。

image-20250819141126943

三、知识点回顾与重要考点

打开文件表关键属性:

  • 用户进程表:独有读写指针、访问权限;
  • 系统表:独有打开计数器(用于判断文件是否被占用,如删除时检查计数器,避免删除正在使用的文件)。

其他要点:

  • 打开文件时不会将文件数据直接读入内存,仅加载目录项;
  • “索引号” 即 “文件描述符”,操作文件时用描述符指明文件,无需再用文件名;
  • 每个进程有独立的打开文件表,系统有唯一的总打开文件表。
  • 文件重命名操作本质是修改目录项中的 “文件名” 字段(不改变外存数据位置)。

IMPORTANT

只要完成了文件的 open 调用,后面再使用 read、write、close 等操作的时候,就不再使用文件名,而是文件描述符。

4.18 文件共享

mermaid
graph LR
    A[文件共享] --> B[硬链接<br>(基于索引结点)]
    A --> C[软链接<br>(基于符号链)]

本质:多个用户共享同一份文件数据

特性:任一用户修改文件,其他用户可见变化

NOTE

不同于文件“复制”,复制是多个文件数据,任一用户更改文件不会对其他用户的文件用任何影响。

硬链接

1、实现基础

基于 “索引结点” 机制:索引结点存储除文件名外的文件信息(如物理地址等),用户目录项仅包含 “文件名” 和 “索引结点指针”。

2、核心机制:链接计数(count)

索引结点中设置 count 变量,记录链接到该索引结点的用户目录项数量(即共享该文件的用户数)。

例:count=2 表示有 2 个用户目录项链接到该索引结点,即 2 个用户共享此文件。

3、文件删除逻辑

当某用户删除文件时,仅删除该用户目录中对应的目录项,同时 count 减 1。

仅当 count=0 时,系统才真正删除文件数据和索引结点(避免 count>0 时删除导致 “指针悬空”,即其他用户目录项指向无效数据)。

image-20250819144927819

软连接

1、实现方式

通过 “Link 类型文件” 记录共享文件的存放路径(类似 Windows 的 “快捷方式”)。

例:User3 的目录中 “ccc” 是 Link 类型文件,记录路径 “C:/User1/aaa”,指向 User1 的文件 “aaa”。

2、访问流程

当用户访问 Link 类型文件时,操作系统根据文件中记录的路径层层查找目录,最终定位到共享文件的索引结点。

3、特点

即使原共享文件被删除,Link 类型文件仍存在,但通过其路径查找会失败(提示 “找不到对应目录项”)。

访问速度较慢:需查询多级目录,产生多次磁盘 I/O(相比硬链接,硬链接直接通过索引结点指针访问,更快)。

image-20250819145118434

image-20250819145141746

TIP

硬链接与软链接的核心区别:硬链接通过索引结点直接关联,软链接通过路径间接关联。

软链接访问速度慢的原因:需逐层查询目录,产生多次磁盘 I/O。

4.1.6 文件保护

口令和加密是为了防止用户文件被他人存取或者窃取,访问控制则是用于控制用户对文件的访问方式。

文件保护

1、口令保护

  • 原理:为文件设置口令(如 abc112233),用户访问时需输入正确口令,系统验证后决定是否允许访问。
    • 口令通常存储在文件的 文件控制块(FCB) 或索引结点 中。
  • 优点
    • 空间开销小(仅存储口令字符串)。
    • 验证时间短(直接对比字符串即可)。
  • 缺点
    • 安全性低:口令存储在系统内部(如 FCB),可能被破解。
    • 无法区分不同用户的访问权限(仅“有无权限”)。

2、加密保护

  • 原理:使用密码对文件数据进行加密,访问时需提供正确密码解密。
  • 优点
    • 数据保密性强(即使文件被盗,无法直接读取)。
    • 密码无需存储在系统中(仅需在访问时提供)。
  • 缺点
    • 加密/解密耗时(尤其对大文件)。
    • 密码丢失则数据永久不可恢复。

3、访问控制

  • 核心思想:通过权限列表控制用户对文件的访问行为。

    • 访问控制列表(ACL):

      • 在文件的 FCB 或索引结点中记录每个用户的访问权限。

      • 示例:

        用户执行添加删除列表清单
        father111111
        mother101001
        son000000
      • 问题:用户数量多时,ACL 可能过于庞大。

    • 精简访问控制列表:

      • 按“组”划分用户。

      • 示例:

        组别删除执行
        拥有者1111
        0111
        其他用户0101
      • 优点:简化权限管理,只需调整组权限即可影响所有成员。

      • 类似于 Linux 中的文件管理

        sh
        chmod user1 770

4、Windows 的访问控制

  • 特点:
    • 支持基于组的权限管理(如“Administrators”、“Users”)。
    • 可对目录和文件单独设置权限。
    • 继承性:若对目录设置权限,其子目录和文件默认继承相同权限(除非手动修改)。
  • 权限类型:
    • 完全控制:可读、写、执行、修改、删除。
    • 修改:可读、写、执行、添加子项。
    • 读取:仅查看文件内容。
    • 写入:允许修改文件内容。
    • 执行:允许运行文件(如可执行程序)。

5、实际应用场景

  • 口令保护:适用于对安全性要求不高的场景(如临时文件保护)。
  • 加密保护:适用于敏感数据(如银行交易文件、个人隐私文件)。
  • 访问控制:适用于多用户协作环境(如企业文件服务器、操作系统权限管理)。

4.3 文件系统

22 年新增考点,不过国内教材很少涉及,考的几率很小,时间紧可以不用学,PPT+书一起学习

4.3.1 文件系统结构

image-20250820095047364

image-20250820095055498

4.3.2 文件系统布局

image-20250820095556297

image-20250820095614065

image-20250820095625482

image-20250820095656717

image-20250820095753164

4.3.3 虚拟文件系统

image-20250820101420063

image-20250820101431386

image-20250820101457116

image-20250820101538865

image-20250820101550568

image-20250820101741047