4.1 文件的基本概念

文件 (File)
文件是操作系统中的一个重要概念,是具有文件名的一组相关信息的集合,是文件系统的最大逻辑单位。文件由若干文件块组成。

文件系统提供的服务:文件访问(按名存取)、文件创建/删除、目录管理、访问控制、文件共享与保护。

4.2 文件逻辑结构

文件的逻辑结构是用户可见的组织形式,与存储介质无关。

类型说明特点
顺序文件记录顺序排列可顺序/随机访问;定长可随机存取
索引文件建立索引表支持快速随机访问,变长记录适用
索引顺序文件分组+组内索引顺序与索引结合
直接文件/散列文件关键字直接映射地址访问快,有冲突

4.3 文件目录

目录是文件控制块 (FCB) 的集合,用于实现"按名存取"。FCB 包含文件名、类型、大小、物理位置、创建时间、权限等。

目录结构说明优缺点
单级目录所有文件在同一目录简单;不允许重名
两级目录主文件目录 + 用户文件目录允许重名;不便共享
多级目录(树形)层次结构,含路径层次清晰;不便文件共享
无环图目录树形 + 共享链接支持共享;需处理循环
路径绝对路径从根目录开始;相对路径从当前目录开始。引入当前目录可减少按名查找的访盘次数。

4.4 文件物理结构

文件的物理结构是指文件在磁盘上的存储组织方式。

结构说明优点缺点
连续分配文件占用连续磁盘块顺序/随机访问都快外部碎片,文件难扩展
链接分配(隐式)每个盘块含指向下一块的指针无外部碎片,可扩展只能顺序访问,指针占空间
链接分配(显式/FAT)指针集中存于FAT表随机访问快FAT 占用内存
索引分配每个文件一张索引表支持随机访问,无碎片索引表本身占空间
索引分配扩展:当文件很大时,索引表可能超过一个盘块。解决方案:链接方案(索引表用链接)、多层索引(一级指向二级)、混合索引(直接地址+一级间接+二级间接+三级间接,如 UNIX inode)。

混合索引(inode)

UNIX/Linux 的 inode 采用混合索引:直接索引块(小文件直接寻址)+ 一级间接索引 + 二级间接索引 + 三级间接索引。

索引级别寻址范围
直接地址(12 个)小文件,直接指向数据块
一级间接索引中等文件,索引块指向数据块
二级间接索引大文件,索引块→索引块→数据块
三级间接索引超大文件,三级间接

交互式动画 · inode多级索引寻址

UNIX inode混合索引:12直接块+1一级间接+1二级间接+1三级间接。调节参数计算最大文件大小。

4.4B 虚拟文件系统 VFS [22新增]

虚拟文件系统 (Virtual File System, VFS)
Linux 内核中的一层抽象,为上层应用提供统一的文件系统接口,屏蔽底层不同文件系统(ext4、xfs、NTFS 等)的实现细节。用户程序通过统一的系统调用(open/read/write/close)即可操作任意类型的文件系统。

VFS 四大对象

VFS 通过四个核心数据结构来描述和管理文件系统:

对象数据结构存储位置说明
超级块对象super_block磁盘(特定位置)描述已挂载文件系统的整体信息:文件系统类型、块大小、根 inode 号、空闲块数等。每个挂载的文件系统有一个超级块。
索引节点对象inode磁盘描述一个文件的所有属性信息(大小、权限、时间戳、指向数据块的指针)。每个文件对应一个 inode。
目录项对象dentry内存(缓存)描述目录项(文件名→inode 映射)。dentry 缓存 (dcache) 加速路径名查找。每个路径分量对应一个 dentry。
文件对象file内存描述一个已打开的文件(打开模式、当前读写位置)。一个文件可被多次打开,每次打开创建一个 file 对象。

VFS 支持多种具体文件系统:ext4(Linux 默认)、xfs(高性能日志文件系统)、NTFS(Windows 文件系统)、FAT32(U 盘常用)、NFS(网络文件系统)等。VFS 为每种文件系统定义一组函数指针(如 read_inode、write_inode),具体文件系统实现这些函数即可接入 VFS。

408 考点:VFS 的四大对象及其内存/磁盘存储关系;VFS 提供统一接口的设计思想——上层统一系统调用,下层通过函数指针表调用具体文件系统的实现。

4.4C 文件系统挂载 [22新增]

挂载 (Mount)
将一个文件系统(通常存储在一个独立分区或设备中)关联到目录树中的挂载点 (Mount Point),使该文件系统中的文件和目录成为整个目录树的一部分。

挂载过程

mount /dev/sdb1 /mnt/data 为例,挂载一个 ext4 分区到 /mnt/data 目录:

卸载 (umount)

卸载是挂载的逆过程:检查文件系统是否仍有打开的文件或正在使用的目录(如有则拒绝卸载)→ 将内存中的脏数据(dirty pages/buffers)同步写回磁盘 → 断开挂载点关联 → 释放 VFS 数据结构(超级块、inode、dentry)。

挂载点要求:挂载点必须是一个已存在目录(通常为空目录,否则原内容被覆盖/隐藏直到卸载);一个文件系统可挂载到多个位置(多次挂载);通过 mount 命令或 /etc/fstab 配置文件实现自动挂载。

4.5 磁盘存储管理

磁盘是文件的存储介质。磁盘访问时间 = 寻道时间 + 旋转延迟 + 传输时间。其中寻道时间是主要开销,磁盘调度算法旨在减少平均寻道时间。

交互式动画 · 磁盘访问时间计算器

调节磁盘参数(RPM、寻道距离、数据量等),实时计算寻道时间、旋转延迟、传输时间及总时间。

磁盘调度算法

磁盘调度算法伪代码

// FCFS 先来先服务
void FCFS(queue requests, int head){
  int totalSeek = 0;
  for(each r in requests){
    totalSeek += abs(r - head);
    head = r;
  }
}

// SSTF 最短寻道时间优先
void SSTF(queue requests, int head){
  int totalSeek = 0;
  while(requests 非空){
    int nearest = argmin(requests, r => abs(r-head));
    totalSeek += abs(nearest - head);
    requests.erase(nearest);
    head = nearest;
  }
}

// SCAN 电梯调度(假设向上)
void SCAN(queue requests, int head, int maxCyl){
  int totalSeek = 0;
  bool up = true;
  while(requests 非空){
    if(up){
      // 向上移动到最远请求或端点
      int next = min({r∈requests | r ≥ head});
      if(next 为空 || next > maxCyl){ next = maxCyl; up = false; }
      totalSeek += abs(next - head);
      head = next;
      removeAll(requests, r => r == head);
    } else {
      int next = max({r∈requests | r ≤ head});
      if(next 为空){ next = 0; up = true; }
      totalSeek += abs(next - head);
      head = next;
      removeAll(requests, r => r == head);
    }
  }
}

// C-SCAN 循环扫描(单向)
void CSCAN(queue requests, int head, int maxCyl){
  sort(requests);
  int totalSeek = 0;
  while(requests 非空){
    auto it = lower_bound(requests, head);
    if(it == requests.end()){       // 到头,单向折返
      totalSeek += (maxCyl - head) + maxCyl;
      head = 0;
    } else {
      totalSeek += abs(*it - head);
      head = *it;
      requests.erase(it);
    }
  }
}
对比:FCFS 公平但效率低;SSTF 效率高但可能饥饿;SCAN 像电梯,无饥饿,性能均衡;C-SCAN 提供均匀响应时间。SCAN 与 LOOK 的区别在于是否走到磁盘物理端点。

4.6 文件存储空间管理

磁盘空闲空间管理方法:

4.7 文件保护与安全

文件保护指防止文件被非法访问、篡改或破坏,主要实现方式有:

方式原理优点缺点
访问控制表 ACL每个文件关联一个 ACL,记录每个用户/组对该文件的权限(读/写/执行)权限精细,可针对单用户设置文件多时 ACL 冗长,管理开销大
Unix rwx 权限位按文件所有者/同组用户/其他用户三类,每类用 r(读)w(写)x(执行) 三位表示结构简单,开销小权限粒度粗,难以表达复杂权限
口令保护文件设置访问口令,访问时需验证口令实现简单口令易泄露,安全性弱
密码加密文件内容加密存储,访问时用密钥解密安全性最高,即使被窃取也无法读取加解密开销大,密钥管理复杂

Unix rwx 权限位详解

Unix/Linux 文件权限用 9 位二进制(3 组 rwx)表示,常写成八进制。如 rwxr-xr-- = 754:

chmod 命令:chmod 755 file 设置权限为 rwxr-xr-x。数字含义:r=4, w=2, x=1,求和得权限值。408 考点:区分 ACL(按文件设置用户权限)与 Unix 权限位(按用户类别设置权限)。