一、文件的逻辑结构
指文件在用户视角下的组织形式,分为两类:
有结构的记录式文件
- 由多个记录构成,每个记录用于描述一个实体或实体集。
- 记录长度可分为定长和变长两种:
- 定长记录:所有记录长度相同,数据项的位置、顺序和长度固定,处理简单高效,适合批量操作,是数据库等系统常用格式。
- 变长记录:记录长度不等,通常因数据项数量或长度可变所致,但记录长度在处理前已知(如通过长度字段标识),需额外管理开销。
无结构的流式文件
- 以字节流形式存在,不划分记录单位。
- 采用顺序访问方式,读写操作依赖读写指针进行定位。
- 在 UNIX/Linux 系统中,所有文件都被视为流式文件,系统本身不对内容格式做解释,提供统一的 I/O 接口。
二、文件的物理结构
指文件在物理存储设备(如磁盘)上的实际存放方式,决定了文件逻辑块与物理块之间的映射关系。常见的类型包括连续结构、链接结构和索引结构(文中仅介绍连续结构):
- 连续结构(顺序结构)
- 将一个逻辑上连续的文件信息存放在一组相邻的物理块中(即连续存储)。
- 通过起始物理块号和文件总长度(或块数)即可确定整个文件的存放位置。
- 优点:支持高效的顺序访问和批量读取,存取速度快,有利于减少磁头移动。
- 缺点:
- 文件难以动态增长;
- 容易产生外部碎片;
- 随机查找或修改单个记录时仍需遍历,交互式场景效率低;
- 创建文件时需预先知道大小以分配空间。
补充说明:
这类知识属于操作系统中“文件管理”模块的核心内容,旨在理解文件如何被组织、存储与访问,是构建高性能文件系统、设计数据库存储结构以及进行系统级编程的重要理论基础。
除了连续结构外,文件的物理结构还有两种常见类型:链接结构(链式结构)和索引结构。它们各自有不同的优缺点,适用于不同的访问模式和存储管理需求。
1. 链接结构(Linked Allocation)
原理:
文件的逻辑块分散存放在不连续的物理块中,每个物理块包含数据和一个指向下一个物理块的指针,形成链表结构。优点:
- 灵活分配空间,支持动态增长;
- 无外部碎片问题;
- 不需要预先知道文件大小。
缺点:
- 只适合顺序访问,随机访问效率极低(需从头遍历);
- 每个块需额外存储指针,占用存储空间;
- 指针损坏会导致文件断裂,可靠性较低;
- 存储指针也增加I/O开销。
✅ 典型应用:早期 FAT 文件系统中的簇链结构。
2. 索引结构(Indexed Allocation)
原理:
为每个文件建立一个索引块(或索引表),记录该文件所有逻辑块对应的物理块号。通过索引实现逻辑块到物理块的映射。优点:
- 支持高效的随机访问(直接通过索引查找);
- 文件可动态增长;
- 无外部碎片;
- 所有地址信息集中管理,便于维护。
缺点:
- 索引块本身占用额外空间;
- 若文件较小,索引空间利用率低;
- 大文件时单级索引可能不够,需采用多级索引(如二级、三级索引),增加访问延迟。
✅ 常见变体:UNIX/Linux 中的 i-node 结构使用多级索引(直接块 + 一级间接 + 二级间接 + 三级间接)。
对比总结
| 结构类型 | 是否连续 | 访问方式 | 优点 | 缺点 |
|---|---|---|---|---|
| 连续结构 | 是 | 顺序/批量高效 | 顺序访问快,管理简单 | 难扩展,易碎片,需预知大小 |
| 链接结构 | 否 | 仅顺序访问 | 空间灵活,无碎片 | 无法随机访问,指针占空间,可靠性差 |
| 索引结构 | 否 | 支持随机访问 | 灵活、支持随机访问、易扩展 | 占用索引空间,大文件需多级索引 |